JPA 의 기본 개념들에 대해 더 공부한 것을 작성하고자 한다.
준영속 상태
- 준영속 상태는 영속성 컨텍스에서 해제된 상태
- 영속성 컨텍스트가 지원하는 어떤 기능도 동작하지 않는다.
- 영속 상태였었기 때문에 식별자 값을 가지고 있다.
영속 상태
- 영속성 컨텍스트에서 관리하는 상태
- 영속성 컨텍스트가 지원하는 기능에 동작한다.
영속성 컨텍스트
- 엔티티 클래스에서 만들어진 엔티티를 영구 저장하고 관리하는 환경
- 엔티티 클래스는 @Entity 가 있는 클래스이며 이 클래스에서 엔티티가 생성된다.
- 영속성 컨텍스트는 엔티티를 식별자 값으로 구분한다.
- 영속 상태 또는 준영속 상태는 식별자 값을 가지고 있다.
1차 캐시
- 영속성 컨텍스트 내부에 엔티티를 보관하는 저장소
- 엔티티 매니저가 엔티티를 조회할 때 1차 캐시를 조회한 후 없으면 DB 조회를 한다.
- 네트워크를 통해 DB를 조회하는 시간 비용이 비싸기 때문에 캐시를 이용하는 것은 효율적이다.
- 1차 캐시는 트랜잭션 시작부터 종료까지만 유효하다. (트랜잭션이 종료되면 영속성 컨텍스트도 종료되어 1차 캐시도 지워진다)
flush
detach
- 준영속 상태로 변경하며, 영속성 컨텍스트로부터 분리된 상태이다.
persist
clear
close
remove
merge
- 준영속 상태 엔티티를 이용해서 새로운 영속 상태의 엔티티로 반환한다.
- 파라미터로 넘어온 준영속 상태의 식별자값으로 엔티티 조회 (1차캐시 -> DB)
- 조회된 영속 엔티티에 준영속 엔티티의 값을 채워 넣어 새로운 영속 상태 엔티티로 반환
- merge 는 모든 필드를 그대로 변경하기 때문에 기존 값을 잃고 null 값이 들어갈 수 있다.
- 이를 방지하기 위해 서비스 계층에서 더티 체킹 사용
쓰기 지연 저장소
- 한 트랜잭션 안에서 이뤄지는 update 나 save 의 쿼리를 쓰기 지연 저장소에 가지고 있다가 트랜잭션이 커밋되는 순간 (flush) 한번에 DB에 날리는 것
- 쓰기 지연 저장소가 작동하지 않는 경우
- Identity 옵션을 사용하는 경우는 DB 에 저장이 되어야 id 값을 알 수 있기 때문에..
- 트랜잭션이 종료되는 시점에 쿼리가 발생하지 않고 순서대로 println 과 함께 실행됨
- Identity 가 아니라면 insert, update, delete 는 트랜잭션 종료 시점에 쿼리가 한번에 나감
즉시로딩, 지연로딩