728x90

Jackson을 사용하여 Json을 다룰때 LocalDateTime이 역직렬화가 되지 않는 문제가 발생한다. Meilisearch를 사용하면서 Json핸들러를 Gson(기본값)이 아니라 평소에 사용하는 Jackson핸들러를 사용했고, 이때 document들을 가져오는 method를 실행할 때, LocalDateTime 필드가 변환이 되지 않는 문제가 발생하였다. Java에서 Jackson버전 2.x를 사용할 때는 JavaTimeModule을 등록해줘야 한다고 한다. Java.time 타입은 ISO-8601형식으로 변환된다고 하면서 말이다. 3.x버전에서는 디폴트로 포함될 것이라고 설명되어 있다.


LocalDateTime의 역직렬화 문제

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"

이러한 에러 문구와 함께 LocalDateTime 필드에서 에러가 발생한다. 해당 문제를 해결하기 위해서는 jsr310모듈을 포함해주면 된다.

 

의존성 추가 및 Mapper에 Module 등록

우선, jsr310모듈 의존성을 추가해준다.

// build.gradle

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

그리고 ObjectMapper 객체 생성후 module을 등록해주면 된다.

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());

일반적으로 LocalDateTime의 역직렬화 문제를 해결하는데는 여기까지면 충분하다. 하지만 나는 Meilisearch 프레임워크를 사용하면서 문제가 발생했고 프레임워크 QuickStarter에서는 해당 문제를 찾아볼 수 없었다. 프레임워크 내부에서 ObjectMapper 객체를 생성하여 사용하고 있기 때문에 외부에서 아무리 Mapper에 모듈을 등록해줘도 쓸모가 없다.

 

Meilisearch 적용방법

Meilisearch를 사용할 때는 해당 문제를 해결하기 위해서 Client 객체 생성시 해당 조치를 취해주어야 한다.

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
new Client(new Config("http://localhost:7700", "masterKey", new JacksonJsonHandler(mapper)));

1,2번째 행은 위의 설명과 동일하다. Mapper에 모듈만 등록해주면 된다. 중요한 부분은 그 다음이다. Meilisearch의 Client 객체 생성 시  Config 객체를 파라미터로 받는다. 이때, JsonHandler에 JavaTimeModule을 등록한 Mapper를 파라미터로 받는 JacksonJsonHandler 객체를 포함하도록 Config 객체를 생성한다. 그리고 해당 Config를 사용하여 Client객체를 생성하면 된다.

Client에서는 JacksonJsonHandler 객체에서 Mapper를 별도로 가지고 있고 이 Mapper를 이용하여 json의 직렬화 및 역직렬화를 수행한다. 따라서 우리는 Handler 객체의 생성자를 이용하여 모듈을 등록한 Mapper를 Client가 사용할 수 있도록 조치해주면 LocalDateTime의 역직렬화 문제를 해결할 수 있다.

 

728x90

+ Recent posts