Spring LocalDateTime - 직렬화 / 역직렬화 오류

hanana·2024년 2월 4일
0
post-custom-banner

스프링부스 서버에서
로그인시점에 유저정보를 캐싱해주기 위하여 redis를 도입했다.
그러나 막상 login API를 호출하면 제목과 같은 에러가 발생했다.

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time
type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.
jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain:
${myPackage}.User["registeredAt"])

해석을 해보면 기본적으로 제공하는 Jackson 라이브러리에서 LocalDateTime타입을 지원하지 않으니, jackson-datatype-jsr310 모듈을 추가하라고 설명해준다.

해당 문제는 단순히 Redis만의 문제가 아니라
Mockmvc를 이용한 테스트에서도 ObjectMapper를 사용할 때 발생하는 듯한 오류로 보인다.
구글링을 통해서 문제를 해결해 보았다.

implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
implementation 'com.fasterxml.jackson.core:jackson-databind'

의존성을 추가한 뒤,
LocalDateTime 타입의 필드에 @JsonSerialize,@JsonDeserialize어노테이션을 추가해준다.

data class User (
    val userName: String,
    val _password: String,
    var userRole: UserRole? = null,
    
    // 자바에서 해당 어노테이션을 사용할땐 아래와 같이 사용한다.
    // @JsonSerialize(using = LocalDateTimeSerializer.class)
    // @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    
    @field:JsonSerialize(using = LocalDateTimeSerializer::class)
    @field:JsonDeserialize(using = LocalDateTimeDeserializer::class)
    var registeredAt: LocalDateTime? = null,
    @field:JsonSerialize(using = LocalDateTimeSerializer::class)
    @field:JsonDeserialize(using = LocalDateTimeDeserializer::class)
    var updatedAt: LocalDateTime? = null,
    @field:JsonSerialize(using = LocalDateTimeSerializer::class)
    @field:JsonDeserialize(using = LocalDateTimeDeserializer::class)
    var deletedAt: LocalDateTime? = null,
    
    
    var id: Long? = null,
 )

이후 다시 로그인 메소드를 실행하면 성공적으로 진행되며

유저정보가 정상적으로 캐싱되었음을 확인할 수 있다.


그러나!
어디까지나 학습을 위해서 오류를 해결하기위해 적용을 해본것이지

캐싱하는 목적이 매 요청마다 해당 유저가 유효한지 검증하는 과정에서 DB IO를 줄이기 위한 수단으로 사용하였기 때문에

사실 유저정보를 캐싱하는데 있어서 SpringSecurity 관련 필드나,
로그인시간 등을 굳이 캐시로 들고있을 필요는 없을것 같다는 생각이 든다.
그래서 그냥 속편하게 @JsonIgnore처리를 해주었다. ^^;;

profile
성숙해지려고 노력하지 않으면 성숙하기까지 매우 많은 시간이 걸린다.
post-custom-banner

0개의 댓글