- 영속성 컨텍스트의 개념을 파악한다.
- 엔티티의 상태
- 영속성 컨텍스트의 이점을 파악한다.
- 1차 캐시
- 쓰기 지연
- 변경 감지
- 지연 로딩
JPA를 이해함에 있어 매우 중요하다.
- 영속성 컨텍스트 : 데이터의 집합체인 엔티티를 영구 저장하는 환경을 의미한다.
엔티티의 상태
영속성 컨텍스트와 관련하여, 엔티티는 아래 네 가지의 상태를 가질 수 있다.
1. 비영속 상태 : 영속성 컨텍스트에 연관없는 새로운 상태
즉, 자바 진영 내에서 객체만 생성한 상태이다.
2. 영속 상태 : persist()를 통해 영속성 컨텍스트에서 관리하는 상태
3. 준영속 상태 : 영속성 컨텍스트에서 분리된 상태
4. 삭제 : 삭제된 상태
1차 캐시 (엔티티 조회)
persist() 를 실행하면 엔티티는 영속성 컨텍스트 내의 1차 캐시에 저장,
즉 영속이 된다.
- 이후 find() 함수를 통해 영속된 엔티티를 조회하는 경우, 영속성 컨텍스트는 DB에서 조회하는 것이 아닌 1차 캐시에서 엔티티를 찾아서 반환해준다.
만일 1차 캐시에 없는 "member2"를 조회하면 어떻게 반환받을까?
물론 DB에는 존재함을 가정한다.- 찾고자하는 엔티티가 1차 캐시에 존재하지 않는 경우, 영속성 컨텍스트는 DB를 조회하여 1차 캐시에 저장한 후 엔티티를 반환해준다.
이러한 1차 캐시 기능을 통해 약간의 조회 성능을 향상시킬 수 있다.
주의할 점은, 1차 캐시는 하나의 Transaction 내에서만 이루어진다는 것이다.
따라서 10명이 find()를 실행하면, 10개의 1차 캐시를 가지게 된다.
쓰기 지연
entityManager는 데이터를 변경할 때 transaction을 실행해야한다.
persist() 함수는 엔티티를 1차 캐시에 저장할 뿐 DB에 저장하지 않는다.
- persist() 함수가 실행되면, INSERT SQL을 쓰기 지연 SQL 저장소에 쌓아둔다.
이후 transaction을 commit하는 시점에 쌓아둔 SQL query를 DB에 전송한다.
변경 감지 (Dirty Checking)
commit 시점에 SQL query를 DB에 전송하여 데이터를 INSERT하는 것을 배웠다.
이는 데이터를 UPDATE 할 때도 마찬가지이다.
- 영속 엔티티를 수정하면, 영속성 컨텍스트는 1차 캐시 내의 스냅샷을 통해 변경된 값을 감지하고, UPDATE query를 쓰기 지연 SQL 저장소에 쌓아둔 후 commit 시점에 query를 수행한다.
- 스냅샷 : persist() 혹은 find()를 수행하면 엔티티의 모든 값이 스냅샷에 저장된다. 이후 값이 변경되면 스냅샷과의 비교를 통해 변경 감지를 수행한다.
이러한 기능을 통해 아래와같이 update() 등의 함수가 없이 아주 간편하게 엔티티를 수정할 수 있다.정말 너무 신기하다..
없어도 된다.
JPA 즉시 로딩과 지연 로딩 에서 알아보자.