1. JPA란?

2. ORM이란?

3. JPA의 장점

4. JPA의 단점

5. 주요 기능 및 사용예제


JPA ( Java Persistence API )

  • Java에서 제공하는 API, 관계형 데이터베이스 모델과 객체 모델간의 패러다임 불일치를 해결해주는 ORM 기술에 대한 표준 명세
  • Java 에서 JPA에게 명령하면 JPA가 JDBC API를 사용하여 SQL을 만들어서 DB로 보내주는것이다.
  • 스프링에서 제공하는 것이 아니다. JAVA에서 제공하는것이다.
  • 라이브러리가 아닌 인터페이스이다.

영속성이란?

더보기

영속성(Persistence) : 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성


ORM ( Object-relational mapping )

  • 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해준다.
  • 객체와 관계형 모델사이의 불일치가 존재할 수 있는데, 이부분을 ORM이 해결해준다.

 JPA의 장점

- 객체 지향적인 코드를 구성하여 직관적이며, 비즈니스 로직에 더 집중할 수 있다.

  • SQL Query를 구성하지않고, 메서드로 데이터를 조작할 수 있기때문에 객체 모델로 프로그래밍하는데 집중할 수 있다
  • SQL의 절차적인 방식이 아닌, 객체 지향적인 접근을 하여 생산성이 증가한다.
  • 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 올려준다

- 재사용 및 유지보수가 간편하다.

  • 특정 컬럼의 변경이 생겼을때, SQL은 모든 쿼리문을 수정해야하지만, ORM은 특정 객체만 수정한다.
  • 매핑정보가 명확하여, ERD에 대한 의존도를 낮출 수 있다.

- DBMS에 대한 종속성이 줄어든다.

  • 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여, RDBMS의 데이터 구조와 Java의 객체지향 모델 사이의 간격을 좁힐 수 있다

- 도메인 주도 개발이 가능하다

  • 애플리케이션의 코드가 SQL 데이터베이스 관련 코드에 잠식 당하는 것을 방지하고 도메인 기반의 프로그래밍으로 비즈니스 로직을 구현하는데 집중할 수 있다.

JPA의 SQL Query 실행과정

- SQL의 DDL작업을 JPA의 Entity 설정을 통해서 해결하고있다.

위 코드를 보면 좌측의 코드는 JPA를 통해 Entity를 구성한것이다. @Id, @GeneratedValue를 통해 IDENTITY를 설정하고 @Column을 통해 title, content라는 컬럼을 생성할 수 있게 설정해주었다.

우측은 그렇게 설정된 JPA의 코드를 SQL로 실행시켜준 모습이다. 이와같이 JPA는 객체 지향적인 코드를 구성할 수 있다는 장점이있다.

( SQL Query를 별도로 작성하지 않아도됨 )

 

JPA의 DML작업수행

- 위코드는 JPA를 통해 DML작업을 수행하는 코드이다.

펫 목록을 가져오는 페이지에서 펫의 목록을 가져오기 위해 petService라는 클래스에서 getPetList라는 메서드를 실행해주는것을 볼수있다. 

getPetList라는 메서드에서는 PetRepository라는 클래스에서 findAllByAccount_idOrderByIdAsc라는 메서드를 실행하는 것을 볼수있다. 

메서드가 다소 길게 느껴질수있지만, Qeury로 작성했을때 굉장히 길게 나올 SQL에 비하면 비교적 짧다고 볼 수 있다.

위 메서드를 간단히 요약하자면, findAll : 모든 컬럼을, Account_id : Account_id라는 컬럼의 값으로 찾고, OrderByIdAsc : Id로 오름차순을 한다는 뜻이라고 보면된다.

select * from pet A
left outer join account B
on A.account_id = B.account_id
where account_id = ?
order by A.idx ASC

이런식의 SQL이다. 

 

JPA DML 작업 수행시의 Query

- 위의 예제에서 봤던 findAllByAccount_idOrderByIdAsc 메서드를 실행하게되면 위처럼 SQL문을 실행시켜준다.

JPA를 사용하지않았다면, 위처럼 긴 길이의 SQL을 직접 작성해야했을것이다.

where절의 account1_.id = ? 에서의 물음표(?)는 파라미터로 받아온 값을 의미한다. 

위 예제를 기준으로 본다면, findAllByAccount_idOrderByIdAsc 메서드에 매개변수로 넣었던 account.getId()의 리턴 값이라고 보면된다.

 

이처럼 JPA를 사용하면, 객체지향적인 코드를 작성할 수 있고 SQL을 작성하지않기때문에 로직에 더욱 집중할 수 있다는 장점이있으며, 짧은 코드를 통해 가독성을 향상시킬 수 있다.


JPA의 단점

- ORM으로만 서비스를 구현하기 어렵다.

- 사용하기 편하지만, 설계는 어렵고 신중해야한다.

- 잘못 구현하게 될 경우 속도 저하 및 일관성이 무너지는 문제점이 생길 수 있다.

 

JPA, ORM의 지식이 풍부한 개발자라면 적용할 수 있는 기술이겠지만, 지식이 충분하지않다면 도입하는게 오히려 해가 될수 있다. 장점이 명확하지만, 그만큼 기술에 대한 이해도가 필요함


주요기능 및 사용예제

- JpaRepository Interface

: Entity의 데이터를 조회하거나 저장,변경, 삭제등의 기능을 JPA에서 제공하는 Repository라는 인터페이스를 통하여 쉽게 사용할 수 있다.

JpaRepository

- Create

: JpaRepository를 이용하여 테이블의 생성을 할 수 있다.

DiaryModule 이라는 객체를 생성하여 주고 애노테이션(@Entity)를 사용하여 JPA로 하여금 테이블을 생성하게 구현했다.

JPA는 이를 확인하여 diary_module이라는 테이블을 id라는 pk를 생성하여 주고, 나머지 값들은 객체에서 선언한대로 생성하여준다.

 

- Select

: JpaRepository를 이용하여 데이터를 조회할 수 있다.

AccountRepository라는 인터페이스에서 JpaRepository를 상속받고 findByEmail을 통해 쿼리문을 실행시켜주는것이다.

 

- insert

: JpaRepository를 이용하여 데이터를 삽입할 수 있다.

 

PetService로직에서 JpaRepository의 save 메서드를 통해 데이터를 저장하였다. 우측의 쿼리가 그 데이터를 저장하는 쿼리문이다.

 

- update

: JpaRepository를 이용하여 데이터를 수정할 수 있다.

JpaRepository의 save 메서드를 통해 이미있는 데이터를 update 하였다.

save라는 메서드는 조건값에 해당하는 데이터가 없으면 insert 작업을 있다면, update작업을 수행하게 되어있다.

 

- delete

: JpaRepository를 이용하여 데이터를 삭제한다.

deleteById, delete 메서드를 통해 삭제할수있으며, 필자의 프로젝트에선 DB정보를 delete하지않고, 컬럼의 deleteyn을 수정하는 방식으로 삭제를 진행하였다. (데이터의 정보를 아예 삭제하는건 위험하다고 판단하였음)

그럼에도 불구하고 데이터의 삭제가 필요한 경우 위 메서드를 사용하면 삭제가 가능하다.