카테고리 없음
[Redis] CacheManager 디폴트 값은 레디스? / RedisConfig 설정
개발에목마른쭌
2023. 7. 12. 00:35
많은 블로그에서 RedisConfig, CacheManager 를 설정하라고 한다.
그래서 이것저것 테스트해봤는데 아무것도 설정하지 않고 Redis와 연결만 시켜준 후에
Spring에서 제공하는 Cache 관련 어노테이션을 사용하니 의도와는 다르게 자동으로 Redis에 저장이 되었다......
한참 찾아보니, gradle에 아래 설정을 추가하면 자동으로 default 값이 ConcurrentMapCache 에서 RedisCache로 설정된다고 한다.
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
하지만 Redis 에 TTL, 직렬화를 비롯한 여러 가지 설정을 본인의 애플리케이션에 적합하게 설정하기 위해서는 RedisConfig를 작성해주어야 한다.
아래는 RedisConfig 설정 예시이다. (출처 https://bcp0109.tistory.com/386)
@EnableCaching
@Configuration
public class CacheConfig {
/**
* Spring Boot 가 기본적으로 RedisCacheManager 를 자동 설정해줘서 RedisCacheConfiguration 없어도 사용 가능
* Bean 을 새로 선언하면 직접 설정한 RedisCacheConfiguration 이 적용됨
*/
@Bean
public RedisCacheConfiguration redisCacheConfiguration() {
return RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(60))
.disableCachingNullValues()
.serializeKeysWith(
RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())
)
.serializeValuesWith(
RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())
);
}
/**
* 여러 Redis Cache 에 관한 설정을 하고 싶다면 RedisCacheManagerBuilderCustomizer 를 사용할 수 있음
*/
@Bean
public RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() {
return (builder) -> builder
.withCacheConfiguration("cache1",
RedisCacheConfiguration.defaultCacheConfig()
.computePrefixWith(cacheName -> "prefix::" + cacheName + "::")
.entryTtl(Duration.ofSeconds(120))
.disableCachingNullValues()
.serializeKeysWith(
RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())
)
.serializeValuesWith(
RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())
))
.withCacheConfiguration("cache2",
RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(2))
.disableCachingNullValues());
}
}
- computePrefixWith: Cache Key prefix 설정
- entryTtl: 캐시 만료 시간
- disableCachingNullValues: 캐싱할 때 null 값을 허용하지 않음 (#result == null 과 함께 사용해야 함)
- serializeKeysWith: Key 를 직렬화할 때 사용하는 규칙. 보통은 String 형태로 저장
- serializeValuesWith: Value 를 직렬화할 때 사용하는 규칙. Jackson2 를 많이 사용함
RedisManagerBuilderCustomizer 같은 경우는 상황에 따라, 메서드에 따라서 다른 설정으로 캐시를 적용하고 싶을 때 캐시 이름으로 구분하여 사용할 수 있게끔 한다.