JPA (1) :: 영속성 컨텍스트

ggyu_55·2023년 5월 8일
0

JPA 메모

목록 보기
1/3

Persistence Context

"엔티티를 영구 저장하는 환경"


1. 엔티티 매니저를 통해 영속성 컨텍스트에 접근한다.

EntityManager.persist(entity);


2. 스프링과 같은 컨테이너 환경에서 앤티티 매니져는 영속성 컨텍스트와 N:1관계를 가진다.


3. 영속성 컨텍스트의 주기

New :: 컨텍스트와 전혀 관계가 없는 새로운 상태 (엔티티를 생성만 하고 저장하지 않음)

Managed :: 영속성 컨텍스트에 의해서 관리되는 상태 (엔티티를 컨텍스트에 저장)

Detached :: 컨텍스트에 저장되었다가 분리된 상태

removed :: 컨텍스트에서 제거된 상태


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

1. 1차 캐시

  • 영속성 내부에 1차 캐시가 존재
  • 1차 캐시에 저장된 이후에는 DB가 아닌 1차 캐시에서 조회한다.
  • 1차 캐시에 없다면 DB에서 조회하여 1차 캐시에 저장한다. (영속성 컨텍스트에)
  • 한 트랜잭션 안에서 동작한다. (비즈니스 로직이 복잡할 수록 강점)

2. 동일성 보장

  • 1차 캐시를 통해 반복 가능한 읽기(REPEATABLE READ) 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공한다.

3. 트랙잭션을 지원하는 쓰기 지연

  • 엔티티 매니져는 데이터를 변경하려면 트랜잭션을 하여야 한다.
  • 트랜잭션을 커밋하는 순간 DB에 INSERT 요청을 한다.
  • 트랜잭션이 완성되지 않은다면 뭔 짓을 하던 DB에 반영되지 않는다.

4. 변경감지

  • 스냅샷 을 이용하여 내용 변경을 감지한다.
  • 값을 바꾸려면 뭔가 "Update"를 해야 할 것 같지만,
  • 영속성 컨텍스트에 엔티티가 최초로 들어온 순간을 1차 캐시 내부에 스냅샷으로 찍어둔다.
  • 트랜잭션 커밋 순간에 엔티티와 스냅샷을 비교하여 변경점이 있다면 UPDATE 쿼리를 먼저 반영하고 커밋한다.

4-1. Flush :: 영속성 컨텍스트의 변경내용을 데이터베이스에 반영

1. 영속성 컨텍스트를 비우지 않는다.

2. 컨텍스트의 변경내용을 데이터베이스에 동기화한다.

3. 커밋 직전에 동기화한다

  • 플러시가 발생하면,
    - 변경점을 감지하고
    - 수정된 엔티티를 쓰기 지연 SQL 저장소에 등록
    - 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
  • 영속성 컨텍스트를 플러시 시키려면,
    - em.flush() 호출 :: 직접 호출
    - 트랜잭션을 커밋 :: 플러시 자동 호출
    - JPQL 쿼리 실행 :: 플러시 자동 호출
  • 플러시 모드 옵션
    em.setFlushMode(FlushModeType.COMMIT)
    - FlushModeType.AUTO :: 기본 값, 커밋이나 쿼리를 실행할 때 플러시
    - FlushModeType.COMMIT :: 커밋할 때만 플러시

5. 지연로딩


0개의 댓글