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