[JPA] 2차 캐시에 대하여

bagt13·2022년 10월 28일
2

JPA

목록 보기
1/13
post-thumbnail

1차 캐시에 대한 내용은 학습하고 기록도 했었지만, 2차 캐시에 대해서는 잘 기억이 나지 않아 정리해놓으려 합니다.

1차 캐시란?

1차 캐시는 한마디로 영속성 컨텍스트 내부에 존재하는 엔티티 보관소이다.

JPA 기초와 1차 캐시



2차 캐시

2차 캐시란 애플리케이션 범위에서 공유하는 캐시를 JPA에서는 공유 캐시(Shared Cache)라고 하며, 2차 캐시 (Second Level Cache, L2 Cache)라고 부르기도 한다.

2차 캐시는 애플리케이션을 종료할 때까지 캐시가 유지된다.

  • JPA에서 데이터를 조회할 때 1차캐시에 먼저 조회한 후, DB에서 조회한다고만 알고 있었는데, DB 접근 이전에 2차 캐시 조회가 일어나는것이었다.

  • DB에서 조회한 데이터는 2차 캐시에 보관되고, 2차 캐시는 해당 엔티티의 복사본을 만들어 1차 캐시에 반환하며, 이는 동시성을 극대화시키기 위함이다.

    예를 들어, 2차 캐시에 저장된 엔티티를 여러 곳에서 동시에 수정하면 문제가 발생하기 때문에 락을 걸어야 하는데, 이는 동시성의 저하를 일으키기 때문에, 복사본을 반환하여 동시에 수정할 수 있도록 한다.

-> 영속성 컨텍스트가 다르면 객체 동일성을 보장하지 않는다.

- 앞서 말했듯, 2차 캐시는 애플리케이션 범위에서 공유된다.
- 그 안에서 수많은 영속성 컨텍스트/트랜잭션이 일어나며, 동시에 일어날 수도 있다.
- 2차 캐시는 영속성 컨텍스트마다 다른 복사본을 반환함으로써 동시성 문제를 예방한다.

여기서 2차 캐시가 필요한 이유를 찾은 것이다.

만일 1차 캐시만 존재한다면, 여러 개의 영속성 컨텍스트가 DB에서 엔티티를 조회해서 같은 엔티티를 각각의 1차 캐시에 보관해놓고 수정할 수 있다.

따라서 2차 캐시를 애플리케이션에서 공유하도록 하고, 2차 캐시를 통해 복사본을 1차 캐시로 반환하도록 함으로써 이 문제를 해결할 수 있다.


2차 캐시가 없는 경우

2차 캐시 적용



2차 캐시의 장점

  • 네트워크를 통해 데이터베이스에 접근하는 횟수를 줄일 수 있기 때문에, 애플리케이션 조회 성능을 항상시킬 수 있다.
  • 1차 캐시만 사용했을 때의 문제점을 해결해준다.

2차 캐시 사용법

Entity에 @Cacheable을 붙여주면 캐시 모드를 설정할 수 있다.

application.yml

spring:
  jpa:
    properties:
	  javax:
        persistence:
          sharedCache:
            mode: ENABLE_SELECTIVE
            
      hibernate:
        generate_statistics: true
          format_sql: true
          
          cache:
            use_second_level_cache: true
            region:
              factory_class: org.hibernate.cache.ehcache.EhCacheRegionFactory         
logging:
  level:
    net:
      sf:
        ehcache: debug            

  • 2차 캐시 활성화
spring.jpa.properties.hibernate.cache.use_second_level_cache = true
  • 2차 캐시 처리할 클래스 지정
spring.jpa.properties.hibernate.cache.region.factory_class
  • 캐시 적용 여부를 확인할 수 있다.
spring.jpa.properties.hibernate.generate_statistics = true

cache mode

cache mode설명
ALL모든 엔티티 캐시
NONE캐시 비활성화
ENABLE_SELECTIVECacheable=true 로 설정된 엔티티만 캐시
DISABLE_SELECTIVECacheable=false 만 캐시 비활성화
UNSEPCIFIEDJPA 구현체 (hibernate)의 default 적용

+더 자세한 내용은 직접 적용해보고 기록해보기

profile
주니어 백엔드 개발자입니다😄

0개의 댓글