📌JPA (Java Persistence API)
Java ORM 기술의 표준 명세로, 자바에서 제공하는 API
- ORM (Object Relational Mapping) : 객체형 관계형 데이터베이스 메핑
- 자바는 객체 지향 패러다임, 관계형 데이터베이스는 데이터를 정규화해서 잘 보관하는 것이 목표
- 객체지향과 관계형 데이터베이스 간의 패러다임의 불일치를 해결하기 위한 기술
✔ JPA의 장점
- 특정 데이터베이스에 종속되지 않음
- 추상화한 데이터 접근 계층을 제공하기 때문에 데이터베이스 종류 변경 가능
- 데이터베이스 설계 중심이 아닌 객체지향적으로 설계 가능
- 필드 관리가 편리하고, SQL문 작성없이 객체를 사용하여 쉽게 유지보수 가능
✔ JPA의 단점
- 복잡한 쿼리에 대해서는 SQL보다 표현하기 어려울 수 있음
- 객체 간 매핑 설계를 잘못하거나 자동으로 생성되는 쿼리들에 의해 성능이 저하될 수 있음
📌 JPA 동작 방식
✔ Entity
- 데이터베이스의 테이블에 대응하는 클래스
@Entity
를 클래스에 붙여서 표현
✔ Entity manager
- entity manager factory로부터 생성
- 영속성 컨텍스트에 접근하여 entity에 대한 데이터베이스 작업을 제공
✔ 영속성 컨텍스트 ⭐
- entity를 영구 저장하는 환경으로, entity manager를 통해 접근
- entity 생명주기
비영속 (new)
Item item = new Item();
- entity가
new
키워드를 통해 생성되어 영속성 컨텍스트와 관련이 없는 상태
영속 (managed)
EntiryManager em = entityManagerFactory.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
em.persiste(item);
transaction.commit();
- entity가 영속성 컨텍스트에 저장되어 관리되는 상태
commit
시점에 데이터베이스에 저장
준영속 (detached)
em.close();
- entity가 컨텍스트에 저장되었다가 분리된 상태
em.detach(item)
또는 em.clear()
로 준영속 상태로 변환 가능
삭제 (removed)
em.remove();
- entity가 영속성 컨텍스트와 데이터베이스에서 삭제된 상태
✔ 영속성 컨텍스트의 특징
- 애플리케이션과 데이터베이스 사이에 영속성 컨텍스트라는 중간 계층이 존재
- 이 중간 계층에 의해 버퍼링, 캐싱 등을 할 수 있는 장점을 가짐
1차 캐시
- 영속성 컨텍스트에 (key, value) 형태로 저장
entityManager.find()
메소드 호출 시 1차 캐시를 조회
- entity가 있으면 반환, 없으면 데이터베이스에서 조회하여 1차 캐시에 저장 후 반환
동일성 보장
- 동일한 트랜잭션에서 동일한 키값으로 영속성 컨텍스트에 저장된 entity 조회 시 같은 entity 조회 보장
- 1차 캐시에 저장된 entity를 조회하기 때문
쓰기 지연
- 영속성 컨텍스트에 entity를 저장하면 1차 캐시에 저장되는 동시에 쓰기 지연 저장소에 SQL문 저장
flush
: SQL문을 쌓아두었다가 트랜잭션 commit
시점에 SQL문들이 데이터베이스에 반영
변경 감지
- 1차 캐시에 저장된 entity와 비교하여 변경 내용이 있는 경우,
UPDATE
SQL문을 쓰기 지연 저장소에 저장
- 변경을 감지하기 때문에 따로
UPDATE
문을 쓸 필요가 없음