Spring Cache(@Cacheable) + Spring Data Redis 사용 시 record 직렬화 오류 원인과 해결
백엔드
Spring Cache(@Cacheable) + Spring Data Redis 사용 시 record 직렬화 오류 원인과 해결
두줄요약
Spring Cache와 Redis에서 record 캐싱 시 발생하는 역직렬화 오류의 원인과 해결책을 정리했습니다. Jackson의 타입 정보 처리와 GenericJackson2JsonRedisSerializer의 동작 방식까지 함께 설명했습니다.
문제 상황
- Spring Cache(@Cacheable)와 Spring Data Redis 조합에서 record 반환값 캐싱 시 두 번째 요청부터 역직렬화 예외 발생
- GenericJackson2JsonRedisSerializer와 커스텀 ObjectMapper 사용 시 JSON에
@class타입 정보가 빠져InvalidTypeIdException발생
원인 분석
activateDefaultTyping(..., NON_FINAL, ...)설정으로 final 클래스인 record에는 타입 정보가 붙지 않음- 캐시 조회 시 원본 타입을 모르는 상태에서 JSON 내부 타입 정보에 의존하므로 역직렬화 실패
- 첫 요청은 저장만 수행되어 정상처럼 보이고, 실제 문제는 재조회 시점에 드러남
해결 방법
DefaultTyping.EVERYTHING사용으로 모든 타입에 타입 정보 포함- record 대신 일반 class 사용
@JsonTypeInfo를 붙인 Wrapper로 감싸 다형성 타입 정보 보장
주의할 점
EVERYTHING설정은 직렬화 크기 증가와 성능 부담 가능성 존재- Spring Data Redis는 ObjectMapper 기본 커스터마이징을 책임지지 않으므로 개발자 주입 설정 필요
- 캐시가 실제 동작하는 재조회 시나리오 테스트 필요
