Redis 캐싱 직렬화 오류

임채륜·2025년 7월 28일

작업일기

목록 보기
5/6
post-thumbnail

❗️문제 발생

작업을 진행하면서 요청이 집중될 것으로 예상되는 구간에 Redis 캐싱을 도입하던 중,
Facade 레이어에서 List<Entity> 형식의 도메인을 불러오는 메서드에서 캐싱이 적용되지 않는 문제가 발생했다.

조사해보니 Redis에 아예 저장이 되지 않았고,
이는 내부적으로 사용하는 Jackson2JsonRedisSerializer가 해당 도메인을 직렬화하지 못했기 때문이었다.
즉, 객체를 JSON 문자열로 바꾸는 과정에서 예외가 발생한 것이다.


🧪 원인 분석

Spring에서 기본으로 사용하는 Jackson2JsonRedisSerializer는
직렬화 대상 객체에 기본 생성자, getter, setter 등이 명확히 존재해야 하고,
불변 객체 또는 복잡한 제네릭 구조일 경우 제대로 직렬화하지 못하는 문제가 있다.

내 경우는 List<CustomDto> 형태의 응답 객체를 캐싱하려고 했는데,
이 CustomDto 안에 또 다른 커스텀 객체가 중첩돼 있었고,
그 안에 직렬화되지 않는 필드가 포함되어 있었다.


🛠 해결 방법

  1. RedisTemplate에 사용할 Serializer를 명시적으로 지정해주었다.
  2. 또는 GenericJackson2JsonRedisSerializer로 교체하였다.
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(connectionFactory);
    
    // Key Serializer
    template.setKeySerializer(new StringRedisSerializer());
    
    // Value Serializer - GenericJackson을 사용해 직렬화 문제 방지
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    
    return template;
}

Redis 캐싱에서 직렬화/역직렬화는 정말 중요한 부분이다.

특히 DTO에 불변 객체, 제네릭, 중첩 구조가 있을 경우
Jackson2JsonRedisSerializer가 직렬화를 실패할 수 있으므로 주의해야 한다.

GenericJackson2JsonRedisSerializer는 대부분의 케이스에서 안정적으로 동작해서,
특별한 이유가 없다면 기본으로 사용하는 것이 좋다.


😂 충격실화..?

블로그글 왜 날라감.?
하. 내가 열심히 쓴거 어디감.

profile
성장하는 괴발자

0개의 댓글