DataBase
Redis LocalDateTime 역직렬화 에러
winwin-k9
2023. 9. 8. 21:37
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 CacheManager cacheManager() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY);
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(objectMapper);
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.serializeKeysWith(RedisSerializationContext.SerializationPair
.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair
.fromSerializer(genericJackson2JsonRedisSerializer))
.entryTtl(Duration.ofSeconds(60));
return RedisCacheManager.RedisCacheManagerBuilder
.fromConnectionFactory(redisConnectionFactory())
.cacheDefaults(redisCacheConfiguration)
.build();
}
728x90