💻JPA의 영속성 컨텍스트에 관해 공부하였다.
1. 엔티티 조회, 1차 캐시
-
조회를 하면 jpa는 영속성 컨텍스트에서 1차캐시를 탐색한다. 1차캐시에 멤버엔티티가 있으면 그 값을 조회함, 디비를 거치지 않는다.
-
없으면 JPA가 DB에서 조회하고, 1차캐시에 저장 이후 반환한다.
-
실무에선 고객의 비즈니스가 끝나면 영속성, 1차캐시를 지우기 때문에 , 실제로 엄청난 효율이 좋진 않다.
-
2차캐시 : 애플리케이션 전체가 공유하는 캐시
-
비즈니스 로직이 굉장히 복잡한 경우에는 도움이 됨
-
EX)조회를 했는데 select 쿼리가 안나감. 1차캐시에서 가져왔다는 증거
- 마찬가지로 처음 조회할때는 select하지만, 조회한 결과가 1차캐시에 남아있으므로 조회 쿼리가 한번만 실행된 것을 확인할 수 있다.
)
2. 영속 엔티티의 동일성 보장
1. 동일한 값을 find하여 비교했을 때 true값을 반환 하는 것을 확인할 수 있다. (==), 1차캐시가 있기 때문
3. 엔티티등록 트랜잭션을 지원하는 쓰기지연
- 쓰기지연 sql저장소에 넣었다가 트랜잭션이 커밋되면 그 값들이 데이터베이스 에 flush된다.
4. 엔티티 수정 - 변경감지
- 변경 시 별도로 PERSIST를 하지 않아도 자동으로 변경된다.
- JPA는 커밋하는 시점에 내부적으로 FLUSH를 하는데, 이 때 엔티티와 스냅샷을 비교한다. 값을 읽어온 최초 시점을 스냅샷이라고 둔다. 멤버값을 변경했을때, 처음에 가져온 스냅샷과 엔티티를 비교한다. 이때 변경을 감지하면 UPDATE쿼리를 쓰기지연 SQL저장소에 저장하고, COMMIT시 데이터베이스에 FLUSH한다.