본문 바로가기
Jpa

Jpa 1차, 2차 캐시

by 무대포 개발자 2022. 2. 9.
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 을 사용할 경우 영속성 컨텍스트를 조회하지 않고 데이터베이스를 먼저 조회합니다.
  • 호출순서는 다음과 같습니다.
    1. JPQL 을 통해 DB 조회 합니다.
    2. 조회한 결과를 영속성 컨텍스트에 저장 시도합니다.
    3. 영속성 컨텍스트에 조회한 결과가 있다면 (식별자 값으로 구분) DB 에서 조회한 데이터를 버립니다.

2차 캐시

  • 2차 캐시는 애플리케이션 범위의 캐시이며, 애플이케이션이 종료될 때 까지 유지됩니다.

2차 캐시 동작 방식

  • 영속성 컨텍스트에서 2차 캐시를 조회합니다.
  • 2차 캐시에 데이터가 없으면 DB 를 조회합니다.
  • DB 에서 조회한 데이터를 2차 캐시에 보관합니다.
  • 2차 캐시에 저장된 엔티티를 복사해서 반환합니다.
    • 복사해서 반환하기에 객체가 동일하지 않습니다.
    • 또한, 복사하는 이유는 동시성 떄문인데 엔티티를 그대로 반환할 경우 여러 군데에서 데이터를 변경하고 사용하는 문제에 대해 동시성 관련 문제가 발생합니다.

2차 캐시는 왜 필요한가?

  • 2차 캐시를 사용한다면 DB 를 조회하는게 아니라 2차 캐시를 조회하기에 조회 성능을 끌어올릴 수 있습니다.

Reference

댓글