네트워크를 통해 DB에 접근하는 시간 비용은 애플리케이션 서버에서 내부 메모리에 접근하는 시간 비용보다 수만에서 수십만 배 이상 비싸다. 따라서 조회한 데이터를 메모리에 캐시해서 DB 접근 횟수를 줄이면 애플리케이션 성능을 획기적으로 개선할 수 있다.
영속성 컨텍스트 내부에는 엔티티를 보관하는 저장소가 있는데 이것을 1차 캐시라 한다. 이것으로 얻을 수 있는 이점이 많지만, 일반적인 웹 애플리케이션 환경은 트랜잭션을 시작하고 종료할 때까지만 1차 캐시가 유효하다. OSIV를 사용해도 클라이언트의 요청이 들어올 때부터 끝날 때까지만 1차 캐시가 유효하다.
따라서 애플리케이션 전체로 보면 DB 접근 횟수를 획기적으로 줄이지는 못한다.
하이버네이트를 포함한 대부분의 JPA 구현체들은
애플리케이션 범위의 캐시
를 지원한다.(공유 캐시 or 2차 캐시)
2차 캐시를 이용하면 애플리케이션 조회 성능을 향상할 수 있다.

1차 캐시는 영속성 컨텍스트 내부에 있다. 엔티티 매니저로 조회하거나 변경하는 모든 엔티티는 1차 캐시에 저장된다. 트랜잭션을 커밋하거나 플러시를 호출하면 1차 캐시에 있는 엔티티의 변경 내역을 DB에 동기화 한다.
JPA를 JavaEE나 스프링 프레임워크 같은 컨테이너 위에서 실행하면 트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고,
트랜잭션을 종료할 때 영속성 컨텍스트도 종료한다.
물론 OSIV를 사용하면 요청(ex HTTP)의 시작부터 끝까지 같은 영속성 컨텍스트를 유지한다.
1차 캐시는 끄고 켤 수 있는 옵션이 아니다. 영속성 컨텍스트 자체가 사실상 1차 캐시다.

1차 캐시의 동작 방식 1. 최조 조회할 때는 1차 캐시에 엔티티가 없으므로 2. DB에서 엔티티를 조회한다. 3. 1차 캐시에 보관하고 4. 1차 캐시에 보관한 결과를 반환한다. 5. 이후 같은 엔티티를 조회하면 1차 캐시에 같은 엔티티가 있으므로 DB를 조회하지 않고 1차 캐시의 엔티티를 그대로 반환한다.
1차 캐시의 특징 - 1차 캐시는 같은 엔티티가 있으면 해당 엔티티를 그대로 반환한다.
따라서 1차 캐시는 객체 동일성(a==b)을 보장한다. - 1차 캐시는 기본적으로 영속성 컨텍스트 범위의 캐시다(컨테이너 환경에서는 트랜잭션 범위의 캐시, OSIV를 적용하면 요청 범위의 캐시)