1. 캐시를 사용하는 이유
- 애플리케이션 서버 내부 메모리에 접근하는 시간보다 네트워크를 통해 데이터베이스에 접근하는 시간 비용은 수만에서 수십만 배 이상 비싸다.
- 그래서 조회한 데이터를 내부 메모리에 캐시 하면 서버의 성능을 획기적으로 올릴 수 있다.
2. 1차 캐시
1) 1차 캐시란?
- 영속성 컨텍스트 내부에 엔티티를 보관하는 저장소를 1차 캐시라고 함.
2) 특징
- 트랜잭션을 시작하고 종료할 때까지만 1차 캐시가 유효.
- 클라이언트 요청 후 응답하기 전까지 1차 캐시가 유효.
3) 단점
- scope가 너무 작다.
- 즉, 애플리케이션 전체 범위가 아니므로, 성능을 획기적으로 향상하지는 못 함.
4) 내부 동작
- 영속성 컨텍스트 내부 저장소에 보관되어 있음.
- 클라이언트 요청을 받고 트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 1차 캐시에 엔티티를 저장해놓는다. 그 후 응답을 하면, 영속성 컨텍스트가 종료되고 1차 캐시도 사라진다. **
- 1차 캐시는 옵션이 아니라 필수이다. 즉, 영속성 컨텍스트 자체를 1차 캐시라고 할 수 있다.
3. 2차 캐시(공유 캐시)
1) 2차 캐시
- 애플리케이션 범위의 캐시를 지원해주는 것을 의미.
2) 2차 캐시 특징
- 애플리케이션에서 공유하는 캐시
- 즉, 애플리케이션이 종료될 때까지 캐시가 유지된다.
- 영속성 유닛(단위) 범위의 캐시
- 조회한 객체의 복사본을 만들어서 반환
- 데이터베이스 기본 키를 기준으로 캐시하지만 영속성 컨텍스트가 다르면 객체 동일성(a == b)을 보장하지 않는다.
3) 2차 캐시 동작 방식
(1) 2차 캐시에 찾는 데이터가 없는 경우
- 엔티티 매니저를 통해 데이터를 조회할 때, 우선 2차 캐시에서 찾는다.
- 데이터가 2차 캐시에 없다면, 데이터베이스에서 찾는다.
- 그 찾은 데이터를 2차 캐시에 보관한다.
- 2차 캐시는 그 저장된 데이터를 복사하여 객체를 리턴해준다.
(2) 2차 캐시에 찾는 데이터가 있는 경우
- 그 객체를 복사하여 리턴해준다.
4) 2차 캐시가 복사본을 만들어서 리턴하는 이유
- 여러 곳에서 같은 객체를 동시에 수정하는 문제가 발생할 수 있으므로