Persistence Context
출처 : 인프런 김영한님의 강의 “자바 ORM 표준 JPA 프로그래밍 - 기본편” 중 일부
🚫 아래 내용은 주관적인 생각이므로 사실과 다를 수 있습니다.
개요
JPA의 영속성 컨텍스트에 대한 내용
내용
PersistenceContext는 Entity 영속에 사용되는 논리적인 개념
EntityManager를 통해 PersistenceContext에 접근한다
Entity의 생명주기
- 비영속(new/transient)
- 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
- Entity 객체를 생성하기만 하고,
EntityManager의 영속성 컨텍스트에 넣지 않은 상태
- 영속(managed)
- 영속성 컨텍스트에 관리되는 상태
- em.persist(…) 메소드로 Entity 객체를 저장(영속)한 상태
- 준영속(detached)
- 영속성 컨텍스트에 저장되었다가 분리된 상태
- em.detach(…) 메소드로 Entity 객체를
영속성 컨텍스트에서 분리한 상태
- 삭제(removed)
- 삭제된 상태
- em.remove(…) 메소드로 Entity 객체를 삭제한 상태
영속성 컨텍스트의 이점
- 1차 캐시
- 영속성 컨텍스트에 Entity들을 저장하면서 캐싱을 하고,
DB에 질의하기 전에 영속성 컨텍스트 안에 해당 Entity가
캐싱되어 있는지 먼저 확인해서 불필요한 DB 연결을 최소화 함
- 영속성 컨텍스트에 Entity들을 저장하면서 캐싱을 하고,
- 동일성(identity) 보장
- 1차 캐시로 반복 가능한 읽기(REPEATABLE READ) 등급의
트랜잭션 격리 수준을 DB가 아닌 Application 차원에서 제공
- 1차 캐시로 반복 가능한 읽기(REPEATABLE READ) 등급의
- 트랙잭션을 지원하는 쓰기 지연(transactional write-behind)
- 1차 캐시에 Entity 객체가 저장되면,
JPA가 INSERT Query를 작성해서 쓰기 지연 SQL 저장소에 저장
- 1차 캐시에 Entity 객체가 저장되면,
- 변경 감지(Dirty checking)
- 트랜잭션을 커밋하는 시점에 1차 캐시에 저장된 Entity와
DB에서 읽어온 원본(스냅샷)을 비교해 차이가 있다면
UPDATE Query를 작성해서 쓰기 지연 SQL 저장소에 저장
쓰기 지연 SQL 저장소의 Query들을 DB에 전송하고 커밋
- 트랜잭션을 커밋하는 시점에 1차 캐시에 저장된 Entity와
- 지연 로딩(Lazy loading)
플러시란?
영속성 컨텍스트의 변경내용을 DB에 반영
플러시가 발생했을 때 일어나는 일들
- 변경 감지
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 DB에 전송
영속성 컨텍스트를 플러시 하는 방법
- em.flush() - 직접 호출
- 트랜잭션 커밋 - 플러시 자동 호출
- JPQL 쿼리 실행 - 플러시 자동 호출
플러시 모드 옵션
em.setFlushMode(FlushModeType);
- FlushModeType.AUTO
- (기본값) 커밋이나 쿼리를 실행할 때 플러시
- FlushModeType.COMMIT
- 쿼리가 아닌 커밋할 때만 플러시
웬만하면 플러시 모드 옵션은 건드리지 말고 기본값을 사용
플러시 주의사항
- 플러시는 영속성 컨텍스트를 비우지 않음
- 영속성 컨텍스트의 변경내용을 DB에 동기화
- 트랜잭션이라는 작업 단위가 중요
- 커밋 직전에만 동기화하면 됨
준영속 상태
Entity를 준영속 상태로 만드는 방법
- em.detach(…)
- Entity 객체를 영속성 컨텍스트에서 분리하면
관리를 받지 않아 해당 객체는 Dirty check 하지 않음
- Entity 객체를 영속성 컨텍스트에서 분리하면
- em.clear()
- 엔티티 매니저의 영속성 컨텍스트를 초기화
- em.close()
- 영속성 컨텍스트를 종료
댓글남기기