Back-end
JPA 영속성 관리
elysia365
2025. 3. 14.
EntityManagerFactory
- 데이터베이스 당 하나만 생성하며 애플리케이션 전체에서 공유
- EMF 생성할 때, DB 커넥션풀도 생성
- EntityManager를 생성하는 팩토리이며
EntityManager
- 엔티티를 저장하고, 수정하고, 삭제하고, 조회하는 등의 엔티티와 관련된 모든 일을 처리
- 엔티티를 저장하는 가상의 데이터베이스
PersistenceContext
- 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할
- 엔티티 매니저가 생성될때 내부에 하나씩 만들어짐
- 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관 및 관리
Entity life cycle
- 비영속(new/transient): 영속성 컨텍스트와 전혀 관계가 없는 상태
- 영속(managed): 영속성 컨텍스트에 저장된 상태
- 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제(removed): 삭제된 상태
PersistenceContext 특징
- 엔티티를 식별자 값(@Id로 테이블의 기본 키와 매핑한 값)으로 구분
- 영속(managed) 상태는 식별자 값이 반드시 있어야하며, 없으면 예외 발생
- JPA는 보통 트랜잭션이 커밋되는 순간에 영속성 컨텍스트의 엔티티를 데이터베이스에 반영
PersistenceContext 장점
- 1차 캐시
- JPA는 1차 캐시를 통해 반복 가능한 읽기 (Repeatable read) 수준의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 레벨에서 제공
- 동일성 보장
- 같은 @Id 로 여러번 조회해도 모두 1차 캐시에서 인스턴스를 반환하기 때문에 동일한 인스턴스
- 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
- 등록,수정,삭제 쿼리를 그때 그때 데이터베이스에 보내지 않고 메모리에 모아두었다가 트랜잭션 커밋할때 보냄
- 이 특징을 잘 활용하면 불필요한 쿼리를 줄이고 성능 최적화 가능
- 변경 감지 Dirty Checking
- JPA로 엔티티 수정할 때는 단순히 엔티티를 조회해서 값만 변경하면 되며, update 쿼리는 자동 생성됨
- 변경 감지는 영속 상태의 엔티티에만 적용됨
- 지연 로딩
- 영속성 컨텍스트 내에서 필요한 데이터만 로딩하므로, 트랜잭션이 유지되는 동안만 쿼리가 실행
댓글