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 쿼리는 자동 생성됨
    • 변경 감지는 영속 상태의 엔티티에만 적용됨

 

  • 지연 로딩
    • 영속성 컨텍스트 내에서 필요한 데이터만 로딩하므로, 트랜잭션이 유지되는 동안만 쿼리가 실행

'Back-end' 카테고리의 다른 글

Hibernate/JPA Batch Insert/Update  (1) 2025.03.17
JPA의 Bulk Insert : ID 생성 전략에 따른 성능 비교  (0) 2025.03.14
JSP의 기본 구조  (0) 2025.01.12
Oracle DB와 MySQL DB 비교 (CAP 이론 관점)  (0) 2025.01.06
ProxySQL 테스트  (0) 2024.12.15

댓글