back-end/spring boot

Caffeine Cache 사용하기

study-minjeong 2024. 7. 30. 13:28

스프링 공식 라이브러리는 아니지만, 스프링 부트에서도 지원할 정도의 신뢰도 높은 캐시 라이브러리이다.

캐시에 항목 자동 로딩, 측정된 시간을 기반으로 캐시 만료, 첫번째 요청이 발생할 때 비동기적으로 새로고침하는 기능을 제공해준다.

Caffeine cache는 초당 데이터 처리량에서 우수한 지표를 보여주고 있다. Read와 Write에서 최고의 성능을 보여주고 싶다면 Caffeine cache를 사용하는 것이 좋다.

 

 

적용하는 방법을 알아보자!

1. dependency 추가 

build.gradle에 라이브러리를 추가해준다.

implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'com.github.ben-manes.caffeine:caffeine'

 

 

2. CacheType 생성

확장성을 고려하여 enum으로 생성하였다.

enum CacheType {
    cache("cache", 1, TimeUnit.MINUTES);

    private final String cacheName
    private final int expiredAfterWrite
    private final TimeUnit timeUnit
}

 

 

3. cache 세팅

@Configuration
class CacheConfig {

    @Bean
    List<CaffeineCache> caffeineCaches() {
        return Arrays.stream(CacheType.values())
                .map(cache -> new CaffeineCache(cache.getCacheName(), Caffeine.newBuilder().recordStats()
                        .expireAfterWrite(cache.getExpiredAfterWrite(), cache.getTimeUnit())
                        .build()))
                .toList()
    }

    @Bean
    CacheManager cacheManager(List<CaffeineCache> caffeineCaches) {
        SimpleCacheManager cacheManager = new SimpleCacheManager()
        cacheManager.setCaches(caffeineCaches)
        return cacheManager
    }

}

CacheManager는 설정해둔 프로퍼티로 만든 List<CaffeineCache>를 set한다. 이 CacheManager를 Bean으로 CacheName을 이용해 추상화된 in-memory 캐싱을 사용할 수 있다.

 

 

파라미터

- recordStats: 캐시에 대한 Statics 적용

- initialCapacity: 내부 해시 테이블의 최소한의 크기 설정

- maximumSize: 캐시에 포함할 수 있는 최대 엔트리 수

- maximumWeight: 캐시에 포함될 수 있는 엔트리의 최대 무게

- expireAfterAccess: 마지막으로 읽은 후 특정 기간이 경과하면 캐시에서 제거되도록 하는 시간

- expireAfterWrite: 마지막으로 쓴 후 특정 기간이 경과하면 캐시에서 제거되도록 하는 시간

- refreshAfterWrite: 캐시가 생성되거나 마지막으로 업데이트된 후 지정된 시간 간격으로 캐시를 새로 고침

 

-> expireAfterAccess와 Write가 같이 적용되면, write가 우선순위로 적용됨

-> maximumSize와 maximumWeight은 함께 지정될 수 없음

 

 

4. 로직에 적용

@Cachable로 적용시켜준다.

2024.07.29 - [back-end/spring boot] - spring boot 기본 캐시 사용