JPA 영속성 컨텍스트
영속성 컨텍스트
- 영속성 컨텍스트란 엔티티를 영구로 저장하는 환경(context)라는 의미이다
- 영속성 컨텍스트 개념을 구현한게 entity manger이라고 생각을 하면 된다.
- 영속성 컨텍스트는 엔티티를 식별자 값으로 구분한다. 따라서 영속 상태는 식별자 값이 반드시 있어야 한다. 없으면 예외가 발생한다.
- 영속성 컨텍스트에 엔티티를 저장하면 이 엔티티는 언제 저장이 될까?
- JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영하는데 이를 플러시(flush)라 한다.
- 영속성 컨텍스트가 엔티티를 관리하면 다음과 같은 장점이 있다.
- 1차 캐시
- 동일성 보장
- 트랜잭션을 지원하는 쓰기 지연
- 변경 감지
- 지연 로딩
엔티티의 생명주기
- 비영속성(new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 상태
- 영속(managed) : 영속성 컨텍스트에 저장된 상태
- 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제(removed) : 삭제된 상태
Flush
플러시(flush())는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다. 플러시를 실행하면 다음과 같은 일이 일어난다.
- 변경 감지가 동작해서 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교해서 수정된 엔티티를 찾는다. 수정된 엔티티는 수정 쿼리를 만들어 쓰기 지연 SQL 저장소에 등록한다.
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다. (등록, 수정, 삭제 쿼리)
영속성 컨텍스트를 플러시하는 방법은 3가지가 있다.
- 직접 호출 하는 방법인데 엔티티 매니저의 flush() 메서드를 직접 호출해서 영속성 컨텍스트를 강제로 플러시 하면 도니다. 테스트나 다른 프레임워크와 JPA를 함께 사용할 때를 제외하고 거의 사용하지 않는다.
- 트랜잭션 커밋이 자동으로 플러시가 호출된다.
- JPQL 쿼리 실행 할때에도 플러시가 자동으로 호출된다.
'Database > JPA' 카테고리의 다른 글
JPA CascadeType (0) | 2018.09.08 |
---|---|
@ EnableTransactionManagement Advice Mode PROXY와 ASPECTJ (0) | 2018.06.03 |
Transactional with jpa repository (0) | 2018.05.28 |
Database Transaction Lock With JPA (0) | 2018.05.28 |