1. @Configuration
- 이 클래스가 스프링 설정 클래스임을 나타냅니다.
- 빈(Bean) 정의를 포함할 수 있고, 스프링 컨테이너가 이 클래스를 보고 빈을 등록합니다.
2. cacheManager 메서드
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
ObjectMapper customObjectMapper = JsonMapper.builder()
.enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS)
.build();
customObjectMapper.activateDefaultTyping(
LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.PROPERTY
);
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(customObjectMapper);
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(
RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())
);
return RedisCacheManager.builder(connectionFactory)
.cacheDefaults(config)
.build();
}
- 목적: 스프링의
@Cacheable, @CachePut, @CacheEvict 같은 캐시 애노테이션과 연동할 RedisCacheManager 빈을 생성합니다.
RedisCacheManager는 캐시 저장소로 Redis를 사용하게 해주고, 캐시 관련 설정을 담당합니다.
주요 부분 설명:
ObjectMapper.activateDefaultTyping()
- 직렬화 시 타입 정보 포함하도록 설정 (역직렬화 시 어떤 클래스인지 알아야 하므로)
NON_FINAL: final이 아닌 클래스만 타입 정보 포함
- 위험성: 보안 이슈 있음 → 믿을 수 있는 내부 시스템에서만 사용 권장
GenericJackson2JsonRedisSerializer serializer
- 위에서 설정한
ObjectMapper로 동작하는 JSON 직렬화기
- 이걸로 Redis에 저장되는 값들이 JSON 문자열로 저장됨
RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(...)
- 캐시의 value(값) 직렬화 방법을 설정합니다.
- 여기서는
GenericJackson2JsonRedisSerializer를 사용해 JSON 형식으로 직렬화합니다.
- 기본 직렬화 방식은 JDK 직렬화로, 가독성이 떨어지고, 언어 독립적이지 않아서 JSON으로 많이 교체합니다.
RedisCacheManager.builder(connectionFactory)
- Redis 서버와 연결하는 커넥션 팩토리를 주입받아, 캐시 매니저를 빌드합니다.
.cacheDefaults(config)
- 위에서 만든 캐시 설정을 기본값으로 적용합니다.
.build()
- 최종
RedisCacheManager 인스턴스를 생성합니다.
3. stringRedisTemplate 메서드
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
}
- 목적: Redis에 문자열 키와 문자열 값을 쉽게 저장하고 조회할 수 있는
StringRedisTemplate 빈을 생성합니다.