Kotlin Spring + Mybatis + Mysql 샘플 데이터 토이프로젝트 -10 Inmemory cahce 적용

선종우·2024년 9월 25일
0

Spring 노트

목록 보기
10/10
  • 프로젝트에 CaffeineCache를 적용해보았다.
  • 캐시 설정을 한 곳에서 관리하기 위해 CacheType을 enum으로 선언하였다.
enum class CacheType(
    val cacheName: String,
    val capacity: Int,
    val maximumSize: Long,
    val expireTime: Long
) {
    DEFAULT(CacheConstant.DEFAULT, 100, 500L, 60L)
}
  • 각 설정에 대한 의미는 아래와 같다
    • initalCapacity : 캐시 초기 크기, 캐시된 데이터가 증가하면 캐시 크기를 증가시키는 조정이 필요하다
    • maximumSize : 캐시 최대 크기, 데이터가 maximumSize를 넘어서면 캐시 제거 정책에 따라 기존 데이터를 제거한다
    • expireTime: 캐시 만료 시간(Time based eviction policy 사용 시 설정)
  • 캐시 설정은 아래와 같이 빈으로 생성한다
@Configuration
@EnableCaching
class CacheConfig {
    @Bean
    fun cacheManager(): CacheManager {
        val caches = CacheType.entries.map { cache ->
            CaffeineCache(
                cache.cacheName,
                Caffeine.newBuilder()
                    .initialCapacity(cache.capacity)
                    .expireAfterAccess(cache.expireTime, TimeUnit.SECONDS)
                    .evictionListener<Any, Any>{key, _, cause -> println("cache eviction! $key :: $cause")}
                    .maximumSize(cache.maximumSize)
                    .build()
            )
        }

        val cacheManager = SimpleCacheManager()
        cacheManager.setCaches(caches)
        return cacheManager
    }
}
  • cache 생성 시 eviction 정책을 설정할 수 있다. 정책에는 size-based, time-based, reference-based가 있다.
  • size-based : 크기 기반 정책, 캐시 사이즈가 maximumSize로 설정한 크기 이상이 될 때 eviction을 수행한다
  • Time-based : 캐시 만료기준을 지정하고 기준에 따라 캐시를 삭제한다. 기준은 expire-after-access, expire-after-write, custom-policy가 있다.
  • Reference-based : WeakReference를 이용해 Strong Referece가 없는 캐시의 key나 value를 삭제할 수 있도록 한다
  • evictionListerner를 설정해서 캐시의 삭제여부를 로깅할 수도 있다

baeldun 참고자료

0개의 댓글