Redis @Cacheable 사용 중 날짜 포맷 트러블슈팅

KUN·2025년 7월 9일

Redis

목록 보기
6/6

문제

@Cacheable 실습 중 발생한 오류에 대해서 트러블슈팅을 자세하게 기록해보겠다.
에러 메세지에 해답이 다 나와있어서 금방해결하긴 했지만
해결 과정을 체계적으로 정리하여 비슷한 문제를 겪는 개발자에게 도움이 되고자 한다.


원인 분석

에러 메시지 및 로그 분석

위 내용을 요약해보면 다음과 같다.
java.time.LocalDate 타입을 JSON으로 직렬화하려면 
jackson-datatype-jsr310 모듈을 추가해줘야 한다.

왜 이런 오류가 발생했을까? 근본적으로 무슨 일 인지 확인해보자.


문제의 근본 원인 도출 과정

실제로 내 Entity 에 LocalDate 를 쓰는 곳이 있다.
( 위 에러에도 나와있듯, ConcertResponse("date") 이 부분이다. )

데이터는 Repository 에서 값은 가져와지지만,
이 LocalDate 를 직렬화 하지 못해서 Redis Cache로 등록하지 못한다.
아래는 문제의 흐름을 나타냈다.

간단하게 호출 순서를 정리하면 다음과 같다.

1. getConcert() 메서드로 콘서트 정보를 가져온다.
2. Redis Cache에 정보가 없으므로(Miss), Repository 에서 콘서트 정보를 가져온다.
3. 가져온 정보를 Redis Cache에 저장한다. <- 여기서 문제 발생
-, Repository 에서 값을 가져오는 건 되지만, 
  LocalDate 직렬화 문제로 Redis 에 등록하지 못하는 문제가 발생했다.


관련 시스템 또는 설정 점검

실제로 jackson-data-type-jsr310 의존성이 명시 되어있지않다.
자바 8 날짜/시간 타입 적렬화 자원이 부족한 걸로 파악되었다.

방금 추가된 LocalDate 를 저장하기 위해서 JSON 직렬화/역직렬화 로직이 추가를 해야한다.


해결 과정

요약본

  • jackson-datatype-jsr310 모듈을 프로젝트에 추가
  • Redis 캐시 직렬화용 ObjectMapper에 JavaTimeModule 등록
  • 캐시 설정을 수정해 직렬화 모듈 적용

실제 진행

결과( 캐시에서 조회 실패)

성공하는 듯 보였으나, 이제 캐시에서 조회하려고 누르는 순간?

Redis에서 꺼낸 캐시 데이터가 (ConcertResponse) 객체가 아니라 LinkedHashMap 형태여서,
프로그램이 LinkedHashMap을 (ConcertResponse)로 바로 변환할 수 없어서 발생한 문제라고 나온다.

두번째 진행

↓↓↓↓↓

결과는 아래서


검증 및 결과

Cache Miss 일 경우 캐시에 등록 ( OK )
Cache Hit 일 경우 캐시에서 가져오기 ( OK )

둘다 작동에 성공하였다.

profile
배우노라, 실험하노라, 기록하노라

0개의 댓글