티스토리 뷰

 

[Redis] @Cacheable 삽질기

조회 성능 향상을 위해 Spring Data Redis를 도입했고 간단해 보이는 @Cacheable, @CachePut 등을 사용하기로 결정했다 그런데 LocalDateTime을 변환할 때 살짝 문제가 있었다 가장 쉬운 해결 방법은 아래와 같

ryumodrn.tistory.com

위 글에서 이어지는 글이다

해결은 금방 했는데 이제야 올리게 됐다

Redis를 사용하면서 @Cacheable로 데이터를 캐싱할 때 발생했던 문제다

LocalDateTime을 JSON 형태로 직렬화 / 역직렬화할 때 LocalDateTime이 풀어 헤쳐지던 문제인데 해결은 간단했다

 

 

 

@JsonFormat(pattern=어쩌구, timezone=저쩌고)로도 풀 수 있지만

이 애노테이션을 모든 LocalDateTime 타입 필드에 붙여주기 귀찮으므로 전역적으로 serialize / deserialize 하는 것이다

ObjectMapper를 사용해 직렬화 / 역직렬화를 수행하는데 이를 커스텀 해주면 된다

내가 사용하는 커스텀 버전은 아래와 같다

직렬화 / 역직렬화를 수행할 때 커스텀한 이 녀석을 주입 받아 사용해야 한다

 

 

 

사용한 메서드들을 간략하게 설명해보자면

.findAndRegisterModules()

ObjectMapper 클래스의 메서드로써 JDK ServiceLoader에 의해 기본적으로 제공되는 모듈들을 찾아 넣어주는 것이다

.enable(SerializationFeature.INDENT_OUTPUT)

JSON 형태로 저장하거나 출력할 때 인덴트를 맞춰서 formatting 해주는 녀석이다

.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)

Date를 TimeStamp 형식으로 직렬화하지 못하게 하고

.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

역직렬화하는 대상에 모르는 속성 (필드) 이 있더라도 역직렬화를 수행하라는 의미에서 저 속성에 false를 넣어주는 것이고

.registerModules(new JavaTimeModule(), new JsonBindingResultModule(), new DateTimeFormatModule());

여기가 핵심이다

JavaTimeModule 혹은 JDK8Module을 넣어주면 LocalDateTime 직렬화 / 역직렬화가 가능하다

JsonBindingResultModule, DateTimeFormatModule은 내가 작성한 모듈로 저게 없어도 수행에는 지장이 없다

댓글
링크
글 보관함
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Total
Today
Yesterday