Spring Cache(@Cacheable) + Spring Data Redis 사용 시 record 직렬화 오류 원인과 해결
77
AI 요약

이 글은 AI가 원문을 분석하여 핵심 내용을 요약한 것입니다.

Spring Cache(@Cacheable)와 Spring Data Redis에서 record 직렬화 문제

이 게시물은 Spring Data Redis에서 GenericJackson2JsonRedisSerializer를 사용할 때 record와 @Cacheable 조합에서 발생하는 직렬화 오류 문제를 다룹니다.

문제 원인과 분석

  • ObjectMapper 설정에서 DefaultTyping.NON_FINAL은 final인 record에 타입 정보를 추가하지 않음
  • 타입 정보가 JSON에 없으면 역직렬화 시 InvalidTypeIdException 발생
  • 첫 요청은 정상 처리되나 두 번째 요청부터 캐시 역직렬화 시 오류가 발생

Jackson과 다형성 처리

  • Jackson은 다형성 지원을 위해 명시적으로 타입 정보를 포함해야 하며, final 클래스는 타입 정보 생략
  • record는 final이므로 DefaultTyping.NON_FINAL 설정에서 타입 정보가 누락되어 문제 발생

해결책과 한계

  • DefaultTyping.EVERYTHING 설정은 타입 정보 누락 문제를 해결하지만 비효율적이고 권장되지 않음
  • record 대신 일반 클래스를 사용하거나 Wrapper 클래스로 감싸 @JsonTypeInfo를 활용하는 방법
  • Spring Data Redis는 ObjectMapper 커스터마이징 책임을 사용자에게 위임하고 있음

근본적 해결 방향

GenericJackson2JsonRedisSerializer는 JSON 내부 타입 정보로만 역직렬화를 수행하므로, 타입 정보를 포함하도록 ObjectMapper를 명확히 설정하는 것이 필요합니다.

연관 게시글