API/JPA

2차 캐시

시뻘건 튼튼발자 2024. 9. 21. 12:47
반응형

1차 캐시 vs 2차 캐시

  • 1차 캐시
    • JPA의 EntityManager에 의해 관리되는 캐시다.
    • 트랜잭션 범위 내에서만 유효하며, 동일한 Entity를 요청하면 데이터베이스에 접근하지 않고 캐시된 데이터를 반환한다.
  • 2차 캐시
    • EntityManager에 의해 관리되지 않는 전역 캐시로, 애플리케이션의 여러 세션에서 공유된다.
    • 여러 트랜잭션과 여러 클라이언트에서 동일한 데이터를 요청할 때 유용하다.
    • 캐시된 데이터는 설정된 TTL(Time To Live) 또는 만료 정책에 따라 만료될 수 있다.

JPA 2차 캐시 기능

[그림 1] 2차 캐시

 

JPA 2차 캐시는 성능을 높이고 데이터베이스 부하를 줄이기 위해 사용된다. JPA에서는 기본적으로 2차 캐시를 제공하지 않지만, Hibernate와 같은 JPA 구현체를 통해 2차 캐시 기능을 사용할 수 있다.

2차 캐시 설정 방법

  • properties 설정
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.jcache.JCacheRegionFactory
spring.jpa.properties.hibernate.cache.use_query_cache=true
  • entity 설정
@Entity
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Product {
    // ...
}
  • CacheConcurrencyStrategy: 캐시의 동시성 제어 전략을 설정할 수 있다. 주요 옵션은 아래와 같다.
    • READ_ONLY: 데이터가 변경되지 않는 경우. 성능이 좋고, 쓰기 작업이 없을 때 사용한다.
    • READ_WRITE: 데이터가 변경될 수 있으며, 트랜잭션의 일관성을 유지한다.
    • NONSTRICT_READ_WRITE: 데이터의 일관성 보장이 덜 중요한 경우에 사용한다.
    • TRANSACTIONAL: 트랜잭션의 범위 내에서 동시성을 보장한다.

SharedCacheMode는 JPA의 EntityManagerFactory가 어떻게 캐시를 공유할지를 결정하는 설정이다. 이는 주로 JPA 2차 캐시에 대한 동작 방식을 정의하는 데 사용된다.

  1. ALL: 모든 엔티티와 쿼리가 2차 캐시에 저장되며, 캐시를 사용할 수 있는 모든 엔티티에 대해 캐시가 활성화된다. 가장 높은 성능을 제공하지만, 애플리케이션의 모든 엔티티에 대해 캐시를 사용하는 것이기 때문에 메모리 소비가 증가할 수 있다.
  2. NONE: 2차 캐시를 사용하지 않는다.
  3. ENABLE_SELECTIVE: 기본적으로 2차 캐시를 사용하지만, 엔티티나 쿼리에 대해 개별적으로 캐시를 활성화하거나 비활성화할 수 있다. 이 모드는 특정 엔티티에 대해서만 캐시를 사용할 수 있도록 유연성을 제공한다.
  4. DISABLE_SELECTIVE: 기본적으로 모든 캐시는 비활성화되지만, 일부 엔티티에 대해 명시적으로 캐시를 사용할 수 있도록 설정할 수 있다. 캐시를 활성화할 수 있는 특정 엔티티를 지정할 수 있으며, 그 외의 엔티티는 캐시를 사용하지 않는다.
  5. UNSPECIFIED: 기본값. JPA 제공자는 기본 설정에 따라 캐시를 활성화하거나 비활성화할 수 있다. 이 모드는 특정 구현체에 따라 다르게 동작할 수 있으며, 명시적인 설정이 필요할 때는 ALL이나 NONE, 또는 ENABLE_SELECTIVE 등을 사용하는 것을 권장한다.
반응형