Redis에는 여러 직렬화 방법이 있다.
그 중 나는 GenericJackson2JsonRedisSerializer 를 사용했다.
GenericJackson2JsonRedisSerializer?
객체의 클래스를 지정하지 않고 모든 Class Type을 JSON 포맷으로 저장하게 해주는 직렬화 방법이다.
하지만 몇가지 단점이 있는데 바로 LocalDateTime 역직렬화시 에러가 나는것과... 객체의 패키지 와 클래스명까지 같이 저장하기 때문에 경로가 달라지면 에러가 발생한다.. MSA에서 문제가 좀 있을수도 있겠다.
아무튼 localdatetime 이 캐싱에 같이 들어가서 문제가 발생했다.
가장 쉬운 방법인 해당 방법을 사용했다.
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime startDate;
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime endDate;
하지만 해당 방법은 효과가 없었다..
계속 에러를 뽑아낸다.
그러던중 직렬화 옵션을 사용자가 커스터마이징해서 넘기면 해결 가능하다는 글을 보게 되었고, 다음과 같이 시도했다.
@Bean
public RedisCacheManager redisCacheManager(RedisConnectionFactory connectionFactory) {
// local date time 역직렬화 위해 추가 코드
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(objectMapper);
//
RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(60))
.disableCachingNullValues()
.serializeKeysWith(
RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())
)
.serializeValuesWith(
RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer)
);
Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();
for (CacheType value : CacheType.values()) {
cacheConfigurations.put(value.name(),
RedisCacheConfiguration.defaultCacheConfig()
.prefixCacheNameWith("cache")
.entryTtl(Duration.ofHours(value.getExpireTime()))
.disableCachingNullValues()
.serializeKeysWith(
RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())
)
.serializeValuesWith(
RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer)
));
}
return RedisCacheManager.RedisCacheManagerBuilder
.fromConnectionFactory(connectionFactory)
.cacheDefaults(configuration)
.withInitialCacheConfigurations(cacheConfigurations).build();
}
해결 완료