ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Redis LocalDateTime 역직렬화 에러
    DataBase 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

    댓글

Designed by Tistory.