API/JPA
2차 캐시
시뻘건 튼튼발자
2024. 9. 21. 12:47
반응형
1차 캐시 vs 2차 캐시
- 1차 캐시
- JPA의 EntityManager에 의해 관리되는 캐시다.
- 트랜잭션 범위 내에서만 유효하며, 동일한 Entity를 요청하면 데이터베이스에 접근하지 않고 캐시된 데이터를 반환한다.
- 2차 캐시
- EntityManager에 의해 관리되지 않는 전역 캐시로, 애플리케이션의 여러 세션에서 공유된다.
- 여러 트랜잭션과 여러 클라이언트에서 동일한 데이터를 요청할 때 유용하다.
- 캐시된 데이터는 설정된 TTL(Time To Live) 또는 만료 정책에 따라 만료될 수 있다.
JPA 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차 캐시에 대한 동작 방식을 정의하는 데 사용된다.
- ALL: 모든 엔티티와 쿼리가 2차 캐시에 저장되며, 캐시를 사용할 수 있는 모든 엔티티에 대해 캐시가 활성화된다. 가장 높은 성능을 제공하지만, 애플리케이션의 모든 엔티티에 대해 캐시를 사용하는 것이기 때문에 메모리 소비가 증가할 수 있다.
- NONE: 2차 캐시를 사용하지 않는다.
- ENABLE_SELECTIVE: 기본적으로 2차 캐시를 사용하지만, 엔티티나 쿼리에 대해 개별적으로 캐시를 활성화하거나 비활성화할 수 있다. 이 모드는 특정 엔티티에 대해서만 캐시를 사용할 수 있도록 유연성을 제공한다.
- DISABLE_SELECTIVE: 기본적으로 모든 캐시는 비활성화되지만, 일부 엔티티에 대해 명시적으로 캐시를 사용할 수 있도록 설정할 수 있다. 캐시를 활성화할 수 있는 특정 엔티티를 지정할 수 있으며, 그 외의 엔티티는 캐시를 사용하지 않는다.
- UNSPECIFIED: 기본값. JPA 제공자는 기본 설정에 따라 캐시를 활성화하거나 비활성화할 수 있다. 이 모드는 특정 구현체에 따라 다르게 동작할 수 있으며, 명시적인 설정이 필요할 때는 ALL이나 NONE, 또는 ENABLE_SELECTIVE 등을 사용하는 것을 권장한다.
반응형