Redis LocalDateTime 역직렬화 에러

정명진·2023년 7월 12일
1
post-custom-banner

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();
    }

해결 완료

profile
개발자로 입사했지만 정체성을 잃어가는중... 다시 준비 시작이다..
post-custom-banner

0개의 댓글