Caffeine Cache Config값은 두가지의 방법으로 설정할 수 있다.
1) application.yml -> yml에 등록만 해주면 spring이 알아서 cache 등록을 해준다.
2) Config Custom Bean 생성 -> 캐시가 여러개 일 경우 각각의 Config Policy(정책) 설정 가능
일단 들어가기에 앞서 gradle을 등록해두자. (https://github.com/ben-manes/caffeine)
//caffeine cache 설정
implementation("com.github.ben-manes.caffeine:caffeine:3.1.2")
1. application.yml
spring:
data:
mongodb:
database: mser
# username:
# password:
host: localhost
port: 27017
cache:
caffeine:
spec: maximumSize=500,expireAfterWrite=5s
yml을 활용한 설정은 매우 간단한다. 위와 같이 몇가지의 설정값만 입력해주면 cache 정책 적용이 완료 된다.
2. Custom Config 설정
대부분 실무에서는 application.yml 설정보다 Custom Config 설정을 진행한다. 왜냐하면 하나의 어플리케이션 내 모든 데이터가 공통된 캐시 정책을 가져가기보다 상황에 맞게 데이터 별로 캐시 정책을 가져가기 때문이다.
2-1) 간단한 Config 설정 진행해보기
우선 간단한 Config 설정 부터 확인해보자.
@Configuration
@EnableCaching
class CacheConfiguration {
@Bean("caffeineCacheManager") // cacheManager 등록, 굳이 이름까지 명명할 필요는 없다.
fun cacheManger(): CacheManager {
val cacheManager = CaffeineCacheManager()
cacheManager.setCaffeine(cacheConfig())
return cacheManager
}
fun cacheConfig(): Caffeine<Any, Any> {
return Caffeine.newBuilder()
.maximumSize(200)
.expireAfterAccess(300, TimeUnit.SECONDS)
}
}
여기서 Bean 이름을 입력하지 않아도 상관없다.
@Bean("caffeineCacheManager")
cacheManager 반환값을 가진 함수를 Bean 등록 했기 때문에 spring에서는 자동으로 cacheManger 함수가 default cacheManager로 인식하기 때문이다.
혹시나 CaffeineCache, Ehcache 더 나아가 Redis Cache를 활용할 수도 있기에 나는 따로 Bean 이름을 붙였다.
fun cacheConfig(): Caffeine<Any, Any> {
return Caffeine.newBuilder()
.maximumSize(200)
.expireAfterAccess(300, TimeUnit.SECONDS)
}
maximumSize 및 exprireAfterAcess 값등 캐시값에 대한 여러가지를 설정할 수 있다.
2-2) application.yml + custom Config 설정
보통 실무에서는 application.yml에 다양한 cache 정책을 설정하고 이를 properties로 불러와 custom Config 설정을 진행한다.
이에 내가 적용했던 코드를 예시로 정리해보고자 한다.
다음과 같이 application.yml에 설정을 하고 Base와 Er에 각각의 Name에 대한 Cache Config을 설정하고자 한다.
cache:
caffeine:
policy:
base:
maximumSize: 300
expireTime: 300
er:
maximumSize: 200
expireTime: 500
우선 application.yml 값들을 불러오자.
@ConstructorBinding
@ConfigurationProperties("cache.caffeine")
data class CaffeineProperties(
val policy: Map<String,CashPolicy>? = null
) {
class CashPolicy(
val maximumSize: Long,
val expireAfterWrite: Long
)
fun getPolicy(type: String): CashPolicy? {
return policy!![type]
}
enum class CacheType {
base, er
}
}
- Enum class를 통해 application.yml에 정의한 Cache명을 불러온다.
- getPolicy를 통해 Cache명에 해당하는 정책 정보를 불러온다. (maximumSize, ExprireAfterWrite)
fun caffeineMapConfig(): Map<String, Caffeine<Any, Any>> {
val caffeineMap = HashMap<String, Caffeine<Any, Any>>()
CaffeineProperties.CacheType.values().forEach {
val policyInfo = properties.getPolicy(it.name)
val caffeine = Caffeine.newBuilder()
.maximumSize(policyInfo!!.maximumSize)
.expireAfterWrite(policyInfo.expireAfterWrite, TimeUnit.SECONDS)
caffeineMap[it.name] = caffeine
}
return caffeineMap
}
- CaffeineProperties의 값들을 불러와서 Caffeine 객체를 만들어 낸다.
- cacheManager로 등록하기 위해 Map<캐시명, 캐시정책> 형태로 구성한다.
@Bean("caffeineCacheManager")
fun cacheManager(): CacheManager {
val cacheManager = CaffeineCacheManager()
val caffeineMapConfig = caffeineMapConfig()
caffeineMapConfig.forEach {
cacheManager.registerCustomCache(it.key, it.value.build())
}
return cacheManager
}
- CaffeineCacheManger를 호출하여 registerCustomCache를 통해 캐시정보를 등록해준다.
Bean등록을 통해 해당 프로젝트의 기본 CacheManger는 CaffeineCash로 적용되며 Er, Base 캐시명을 가진 캐시정책이 등록된다.
끝.
코드는 여기에
https://github.com/pminsu01/springGrpc
'개발 지식 > Spring Framework' 카테고리의 다른 글
[Spring] Coroutine Suspend Cache Hit 가 되지 않다. (0) | 2023.02.11 |
---|---|
[Spring] 구글 smtp 서버를 활용한 메일 보내기 (1) | 2023.01.15 |
[Reactive Mongo] Reactive MongoDB QueryDSL 버전 충돌 (0) | 2022.08.22 |
[Test] MongoDB 단위 테스트(Unit Test) 작성해보기 (4) | 2022.06.06 |
[Spring] SpringBoot + WebFlux + Kotlin + ReactiveMongo 프로젝트 생성 (1) | 2022.05.01 |
댓글