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