ObjectMapper로 LocalDateTime를 Json으로 직렬화하기(Serialize)

스프링부트에서 자주 사용되는 객체중에 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

 

댓글

Designed by JB FACTORY