Post

[JPA] 영속성 관리 - 내부 동작 방식

[JPA] 영속성 관리 - 내부 동작 방식

김영한 ‘자바 ORM 표준 JPA 프로그래밍 - 기본편’을 보고 정리한 내용입니다.


1. JPA에서 가장 중요한 2가지


1
2
1. 객체와 관계형 데이터베이스의 매핑 이해
2. 영속성 컨텍스트의 개념과 동작 방식


2. 영속성 컨텍스트


  • 의미: 엔티티를 영구 저장하는 환경
  • 접근 방법: 엔티티 매니저를 통해서 영속성 컨텍스트에 접근할 수 있다. (EntityManager.persist(entity))
  • 특징: 영속성 컨텍스트는 논리적인 개념이고, 눈에 보이지 않는다.


2.1 엔티티의 생명 주기

1
2
3
4
1. 비영속: 단순히 객체를 생성한 상태. 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태이다.
2. 영속: 영속성 컨텍스트에 의해 관리되는 상태
3. 준영속: 한번 영속되었지만, 영속성 컨텍스트에서 분리된 상태
4. 삭제: 삭제된 상태


중요한 점: 쿼리가 날라가는 시점은 트랜잭션을 커밋할 때이다.


3. 영속성 컨텍스트의 이점


  • 1차 캐시
  • 동일성 보장
  • 트랜잭션을 지원하는 쓰기 지연
  • 변경 감지
  • 지연 로딩


3.1 엔티티 조회, 1차 캐시

  • 엔티티를 persist()하면 영속성 컨텍스트 내부의 1차 캐시에 저장된다.
  • 조회 시 DB 접근 전 1차 캐시를 먼저 확인한다.
  • 만약 1차 캐시에 없다면, DB에서 조회하고, DB에 있다면 1차 캐시에 저장하고 반환한다.
  • 1차 캐시는 데이터베이스 한 트랜잭션 안에서만 관리된다.


3.2 영속 엔티티의 동일성 보장

  • 같은 트랜잭션 안에서 같은 ID로 조회한 엔티티는 동일한 인스턴스(==)로 반환된다.
  • 1차 캐시로 반복 가능한 읽기 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션에서 제공한다.


3.3 엔티티 등록 - 쓰기 지연

  • JPA는 트랜잭션 커밋 전까지 SQL을 모아두었다가 한 번에 전송한다.
  • INSERT 쿼리도 쓰기 지연 SQL 저장소에 보관 후, 커밋 시 실행한다.


3.4 엔티티 수정 - 변경 감지

  • JPA는 스냅샷(초기 상태 복사본)을 보관한다.
    • 1차 캐시에는 id, Entity, 스냅샷이 존재한다.
  • 커밋 시 엔티티와 스냅샷을 비교하여 변경된 필드를 감지한다.
  • JPA가 엔티티와 스냅샷 일일이 비교한다.
  • 변경 사항이 있으면 UPDATE 쿼리를 쓰기 지연 SQL 저장소에 등록하고, 커밋 시 실행한다.


4. 플러시(Flush)


4.1 플러시란?

플러시는 영속성 컨텍스트의 변경 내용을 DB에 반영하는 과정.


4.2 동작 과정

  1. 변경 감지
  2. 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  3. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송 (등록, 수정, 삭제 쿼리)


4.3 영속성 컨텍스트를 플러시 하는 방법

  • em.flush() - 직접 호출
  • 트랜잭션 커밋 - 플러시 자동 호출
  • JPQL 쿼리 실행 - 플러시 자동 호출

참고: 플러시를 해도 1차 캐시는 유지된다.


5. 준영속 상태


5.1 준영속 상태란?

  • 영속 상태 엔티티가 영속성 컨텍스트에서 분리되는 것
  • 즉, JPA에서 관리되지 않게 된다.
  • 직접 쓸일은 거의 없다고 한다.


5.2 준영속 상태로 만드는 방법

  • em.detach(): 특정 엔티티만 준영속 상태로 전환
  • em.clear(): 영속성 컨텍스트를 완전히 초기화
  • em.close(): 영속성 컨텍스트를 종료
This post is licensed under CC BY 4.0 by the author.