캐시는 언제까지 캐싱할지, 몇회만큼 캐싱할지 등 구체적인 설정이 가능 해야 한다.
모든 캐시 구현체들은 해당 설정들을 조정 할수 있도록 방법을 제공한다.
redis 는 기본적으로 TTL 활용할수 있는데 RedisCacheManager 역시 아래 2개의 메소드를 통해 RedisCacheConfiguration 를 전달해서 설정 가능하다.
withInitialCacheConfigurations 에서 관리되는 cachName 인지 먼저 보고 없으면 cacheDefaults 의 설정값으로 동작 하는 방식이다.
withInitialCacheConfigurations(Map<String, RedisCacheConfiguration> confMap)
cachName별 conf를 Map 으로 셋업 한다.
cacheDefaults(RedisCacheConfiguration conf)
기본 conf 셋업 한다.
@Configuration
@RequiredArgsConstructor
public class CacheConfig {
@Bean(name = "redisCacheManager")
public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
return RedisCacheManager.builder(connectionFactory)
.cacheDefaults(defaultConf())
.withInitialCacheConfigurations(confMap())
.build();
}
private RedisCacheConfiguration defaultConf() {
return RedisCacheConfiguration.defaultCacheConfig()
.serializeKeysWith(fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(fromSerializer(new GenericJackson2JsonRedisSerializer()))
.entryTtl(Duration.ofMinutes(1));
}
private Map<String, RedisCacheConfiguration> confMap() {
Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();
cacheConfigurations.put("cacheName1", defaultConf().entryTtl(Duration.ofMinutes(30L)));
cacheConfigurations.put("cacheName2", defaultConf().entryTtl(Duration.ofMinutes(600L)));
return cacheConfigurations;
}
}
withInitialCacheConfigurations 에서 관리되지 않는 cacheName 이라면 모두 cacheDefaults 설정대로 동작한다.
말 그대로 default 설정이기 때문에 보수적으로 설정해주는것이 좋아 1분 TTL 을 적용했다.
.entryTtl(Duration.ofMinutes(1));
또 redis 저장시 별도 설정이 없다면 JDK 직렬화를 이용하여 저장 하는데, 전혀 human readable 하지 못하다.
따라서 사람에게 유용한 json 형식으로 포맷팅 하기 위해 밸류 직렬화 방식으로 GenericJackson2JsonRedisSerializer 를 설정한다.
.serializeKeysWith(fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(fromSerializer(new GenericJackson2JsonRedisSerializer()))
이렇게 설정이 된경우 @Cacheable 에서 사용되는 cacheName 에 따라 30분, 600분, 1분이 적용된다.
RedisCacheManager 에서 캐시 이름별로 세부설정을 다르게 할수 있는 방법을 알아봤다.
이제 TTL 이나 Serializer 를 각각 다르게 설정해줄수 있다.