이전 개인 프로젝트에서 Spring, MyBatis를 사용 하였는데 최근에 시작하게 된 프로젝트에서 Spring boot, JPA를 사용하게 돼서 JPA에 대한 이해가 부족하기 때문에 강의를 듣고 블로그를 보면서 개념을 정리하려고 한다.
JPA란 Java Persistence API의 약자로 자바의 ORM(Object Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음
ORM(Object-Relational Mapping)
우리가 일반 적으로 알고 있는 애플리케이션 Class와 RDB(Relational DataBase)의 테이블을 매핑(연결)한다는 뜻이며, 기술적으로는 어플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해주는 것이라고 보면된다.
장점
1. SQL문이 아닌 Method를 통해 DB를 조작할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중할 수 있음.
(내부적으로는 쿼리를 생성하여 DB를 조작함. 하지만 개발자가 이를 신경 쓰지 않아도됨)
2. Query와 같이 필요한 선언문, 할당 등의 부수적인 코드가 줄어들어, 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높임
3. 객체지향적인 코드 작성이 가능하다. 오직 객체지향적 접근만 고려하면 되기때문에 생산성 증가
4. 매핑하는 정보가 Class로 명시 되었기 때문에 ERD를 보는 의존도를 낮출 수 있고 유지보수 및 리팩토링에 유리
5. 예를들어 기존 방식에서 MySQL 데이터베이스를 사용하다가 PostgreSQL로 변환한다고 가정해보면, 새로 쿼리를 짜야하는 경우가 생김. 이런 경우에 ORM을 사용한다면 쿼리를 수정할 필요가 없음
단점
1. 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨리는 문제점이 생길 수 있음
2. 복잡하고 무거운 Query는 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 써야할 수도 있음
JPA의 실제 구현체 중 하나이며 현재 JPA 구현체 중 가장 많이 사용됨 이 외에도 EclipseLink, DataNucleus의 구현체가 있으나 많이 사용되지 않음
영속성 컨텍스트(Persistence Context)는 JPA가 관리하는 엔티티 객체의 집합
엔티티 객체가 영속 컨텍스트에 들어오게 되면 JPA는 엔티티 객체의 매핑 정보를 가지고 DB에 반영함
엔티티 객체가 영속 컨텍스트에 들어오게 되어 관리 대상이 되면 그 객체를 영속 객체라고 부름
영속성 컨텍스트는 세션 단위로 생명주기를 가지고 있음 (세션이 생기면서 만들어지고, 세션이 종료되면 없어짐)
영속성 컨텍스트에 접근하기 위해서 EntityManager라는 인터페이스를 사용함
EntityManager는 하나의 세션으로 보고 아래와 같은 방식으로 동작을 구성함
- EntityManager 생성 (EntityManagerFactory를 통해 생성)
- EntityManager가 가지고 있는 트랜잭션(Transaction)을 시작
- EntityManager를 통해 영속 컨텍스트에 접근하고 객체를 작업(CRUD)
- 트랜잭션을 커밋(Commit)하여 DB에 반영
- EntityManager 종료
참고로, JPA는 수정 메소드를 제공하지 않는다. 하지만 당연히 수정은 필요하기 때문에 JPA는 데이터 수정시, 매핑된 객체(테이블 데이터)를 조회해서 값을 변경 후 커밋하면 DB 서버에 UPDATE 문을 전송하여 UPDATE를 실행한다.
JPA 어노테이션을 활용하여 엔티티 클래스를 정의
@Entity : 해당 클래스가 JPA 엔티티 클래스라고 정의
@Table : 해당 클래스가 데이터베이스의 어느 테이블에 매핑되는지 정의
@Id : DB 테이블의 Primary Key 칼럼과 매핑
@Column : 매핑할 데이터베이스의 칼럼 이름과 필드 변수의 이름이 다를 경우 매핑하기 위해 사용
스프링에서 흔히 사용하는 것으로 알고있는 JPA는, JPA를 이용하는 spring-data-jpa 프레임워크이지 JPA는 아니다.
관련 강의 : https://www.youtube.com/playlist?list=PLlTylS8uB2fAnOge-kDI0ZQxgj78bdTOO
관련 블로그 : https://dbjh.tistory.com/77