ObjectMapper로 LocalDateTime를 Json으로 직렬화하기(Serialize)
- 웹 개발/Spring Boot
- 2021. 2. 4. 16:00
스프링부트에서 자주 사용되는 객체중에 ObjectMapper 객체가 있습니다.
저는 개인적으로 많이 쓰지는 않지만 Util로 만들어서 Json String으로 만들어서 디비에 저장하거나 혹은 Json String을 특정 객체로 매핑시킬 때 사용하게 되는데요.
이 객체는 사실 기본조건일 때, 스프링 부트에서 직렬화/역직렬화(Serialize, Deserialize)를 담당합니다. 즉, ResponseEntity가 response body를 json으로 직렬화 할때, ObjectMapper가 사용되게 됩니다.
그러나 기본조건으로 java8에서 등장한 LocalDateTime, LocalDate, LocalTime과 같은 객체들을 아래와 같이 직렬화합니다.
기본조건으로 직렬화한 LocalDateTime
{
"year": 2017,
"month": "AUGUST",
"era": "CE",
"dayOfMonth": 1,
"dayOfWeek": "TUESDAY",
"dayOfYear": 213,
"leapYear": false,
"monthValue": 8,
"chronology": {
"id":"ISO",
"calendarType":"iso8601"
}
}
뭐... 개인적 특성에 따라 정확한 정도를 표현하는데에는 관점의 차이가 있지만 날짜정보 하나를 포함하기 위한 비용으로는 너무 많은 정보가 있는것 같다는 생각이 듭니다.
해당 column에 '2021-01-01 12:00:00' 혹은 '2021-01-01' 정도만 필요하다면 말이죠.
Jackson JavaTimeModule
'2021-01-01'과 같은 String에 LocalDate를 매핑하도록 Jackson을 구성하려면 JavaTimeModule을 활성화해야합니다. 다음과 같이 Jackson ObjectMapper 인스턴스에 모듈을 등록 할 수 있습니다.
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
모듈은 ObjectMapper에게 LocalDateTime으로 작업하는 방법을 가르치고, 매개 변수 WRITE_DATES_AS_TIMESTAMPS는 JSON에서 날짜를 문자열로 표시하도록 매퍼에게 지시합니다.
스프링 부트를 사용한다면 ObjectMapper는 Bean 형태로 주입하여 제공됩니다. 따라서 application.yml이나 application.properties에 다음과 같이 사용할 수도 있습니다.
// application.yml
spring:
jackson:
serialization:
WRITE_DATES_AS_TIMESTAMPS: false
// application.properties
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false