728x90
반응형
Jpa 1차, 2차 캐시
1차 캐시
- Jpa 에서 1차 캐시는 영속성 컨텍스트 내부에 엔티티를 보관하는 저장소입니다.
1차 캐시 동작 방식 (데이터가 1차 캐시에 없을 때)
- 최초 조회 시, 엔티티가 없으므로 DB 데이터를 조회합니다.
- DB 에서 조회해온 데이터를 영속성 컨텍스트 내부 저장소에 (1차 캐시) 보관합니다.
- 1차 캐시에 있는 데이터를 반환합니다.
1차 캐시 동작 방식 (데이터가 1차 캐시에 있을 때)
- 1차 캐시 (영속성 컨텍스트) 에 데이터가 있으므로 데이터를 반환합니다. (DB 를 조회하지 않습니다.)
1차 캐시 특징
- 1차 캐시는 객체의 동일성을 보장합니다. (객체끼리 비교했을 때, 같습니다. 객체 1 == 객체 2)
- OSIV (Open Session In View) 를 사용한다면 서버에서 응답이 나갈 때 까지 1차 캐시가 유효하지만, OSIV 가 꺼져있으면 (기본 값) 트랜잭션이 종료되면 1차 캐시는 없어집니다.
1차 캐시 관련 주의사항
- EntityManager 를 통해 save 를 하면 영속성 컨텍스트에 저장됩니다. 그런데 JPQL 을 사용할 경우 영속성 컨텍스트를 조회하지 않고 데이터베이스를 먼저 조회합니다.
- 호출순서는 다음과 같습니다.
- JPQL 을 통해 DB 조회 합니다.
- 조회한 결과를 영속성 컨텍스트에 저장 시도합니다.
- 영속성 컨텍스트에 조회한 결과가 있다면 (식별자 값으로 구분) DB 에서 조회한 데이터를 버립니다.
2차 캐시
- 2차 캐시는 애플리케이션 범위의 캐시이며, 애플이케이션이 종료될 때 까지 유지됩니다.
2차 캐시 동작 방식
- 영속성 컨텍스트에서 2차 캐시를 조회합니다.
- 2차 캐시에 데이터가 없으면 DB 를 조회합니다.
- DB 에서 조회한 데이터를 2차 캐시에 보관합니다.
- 2차 캐시에 저장된 엔티티를 복사해서 반환합니다.
- 복사해서 반환하기에 객체가 동일하지 않습니다.
- 또한, 복사하는 이유는 동시성 떄문인데 엔티티를 그대로 반환할 경우 여러 군데에서 데이터를 변경하고 사용하는 문제에 대해 동시성 관련 문제가 발생합니다.
2차 캐시는 왜 필요한가?
- 2차 캐시를 사용한다면 DB 를 조회하는게 아니라 2차 캐시를 조회하기에 조회 성능을 끌어올릴 수 있습니다.
Reference
'Jpa' 카테고리의 다른 글
jpa merge vs persist 동작방식 및 목적 정리 (0) | 2021.06.25 |
---|---|
Jpa OSIV (Open Session In View) (0) | 2021.04.22 |
Jpa EntityManager 설명 (영속성 컨텍스트와 연관) (0) | 2021.04.02 |
jpa fetch join 설명 (0) | 2021.03.18 |
Jpa One to Many Non primary key 로 연결해서 조회 (0) | 2021.02.05 |
댓글