영속성 컨텍스트
- JPA를 이해하는데 가장 중요한 용어
- “엔티티”를 영구 저장하는 환경이라는 뜻
- 영속성 컨텍스트는 논리적인 개념이다.
- 엔티티 매니저를 영속성 컨텍스트에 접근한다.
- ★★★ 영속성 컨텍스트와 엔티티 매니저는 서로 비슷한 것이지 동일한 건 아니다. ★★★
영속성 컨텍스트의 이점
- 1차 캐시
- 동일성 보장
- 트랜잭션을 지원하는 쓰기 지연
- 변경 감지
- 지연 로딩
엔티티의 생명주기
- 비영속 (new/transient)
- 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
- 객체를 생성만 하고 영속성 컨텍스트(엔티티 매니저)에 아무것도 넣지 않은 상태
- JPLA랑 전여 관계없는 상태
- 영속 (managed)
- 영속성 컨텍스트에 관리되는 상태
- em.persist(객체명);을 통해서 영속성 컨텍스트(엔티티 매니저)에 객체를 저장한 상태
- 1차 캐시에 올라가서 JPA가 관리하는 상태
- 준영속 (detached)
- 삭제 (removed)
1차 캐시
- 데이터베이스의 한 트랙잭션 안에서만 효과가 있다.
- 위의 이유때문에 크게 이점을 얻을 수 있는 장점이랄꺼까지는 없지만
그래도 비즈니스 로직이 복잡할 때는 어느 정도 도움이 된다.
동일성 보장
- 영속 엔티티의 동일성 (identity) 보장 => 같은 트랜잭션에 한해서 보장, 1차 캐시의 기능
트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
변경 감지(Dirty Checking)
지연 로딩(Lazy Loading)
준영속 상태
플러시
- 정의 : 영속성 컨텍스트 변경내용을 데이터베이스에 반영하는 것
- 플러시가 발생하면 일어나는 일
- 변경 감지
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송 (등록/수정/삭제)
- 1차 캐시 유지
- 플러시 방법
- em.flush() : 직접 호출
- 트랜잭션 커밋 : 자동 호출
- JPQL 쿼리 실행 : 자동 호출
- 플러시 특징
- 영속성 컨텍스트를 비우지 않음
- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
- 트랜잭션이라는 작업 단위가 중요 → 커밋 직전에만 동기화하면 된다.
- 플러시 옵션
- 사용법 : em.setFlushMode(FlushModeType.COMMIT)
- FlushModeType.AUTO (기본값) : 커밋이나 쿼리를 실행할 때 플러시
- FlushModeType.COMMIT : 커밋할 때만 플러시 (크게 이점 없음)
출처