요즘 회사에서 Spring Boot 2.0, JPA, Hibernate 기반으로 API 서버를 새로 개발하고 있다.
다들 알다시피, Java 8부터는 시간 관련 클래스인 LocalDateTime 클래스가 새로이 추가되었다.
기존 Date 클래스와 여러 날짜 관련 유틸성 클래스들의 문제점들을 보완한 새로운 클래스이다.
Spring Boot 버전대별로 LocalDateTime 클래스의 값을 Json 형태의 String 값으로 변환하는 방법을 설명하도록 하겠다.
# Spring Boot (version: 1.5.x)
{
"localDateTime": {
"month": "JUNE",
"year": 2019,
"dayOfMonth": 19,
"dayOfWeek": "WEDNESDAY",
"dayOfYear": 170,
"hour": 8,
"minute": 40,
"nano": 761000000,
"second": 24,
"monthValue": 6,
"chronology": {
"id": "ISO",
"calendarType": "iso8601"
}
}
}
String 형태로 값이 반환되는것이 아닌, 각 항목별로 JSON Serialized 되어 리턴되는데, 이는 Jackson-databind 라이브러리가 LocalDateTime을 지원하지 않기 때문에 위와 같이 반환이 된다.
이를 해결하기 위해서는 jackson-datatype-jsr310 모듈을 추가해줘야 한다. gradle 기준으로 다음과 같다.
// https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310
compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.9.9'
해당 라이브러리를 추가하고 다시 테스트를 해보면 응답 값이 다음과 같이 반환된다.
{
"localDateTimeWithJSR310": [
2019,
6,
19,
8,
50,
18,
3000000
]
}
처음보단 나아졌지만 원하는 형태의 결과 값이 아니다. 마지막으로 다음과 같이 설정을 추가한다.
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
# 또는 아래와 같이 설정한다.
spring.jackson.date-format=com.fasterxml.jackson.databind.util.StdDateFormat
그러면 다음과 같이 원하는 String 형태로 리턴이 된다.
{
"localDateTimeWithJSR310": "2019-06-19T08:54:18.474"
}
# Spring Boot (version: 2.0.0^)
Spring Boot 2.0 버전 이상에서는 라이브러리를 추가하거나, 특정한 설정을 하지 않아도 LocalDateTime 클래스를 String 형태로 잘 리턴해준다. 그 이유는 Spring Boot 2.0부터는 jackson-datatype-jsr310를 내장하고 있기 때문이다.
하지만 다음과 같이 특정 어노테이션으로 인해 jackson-datatype-jsr310 이 무시되는 경우가 있다.
@EnableWebMvc
@Configuration
public class WebMVCConfiguration implements WebMvcConfigurer {
...
// 특정한 설정 추가
...
}
@EnableWebMvc 어노테이션을 사용하면 Spring MVC 모드가 되어, Spring Boot의 Auto Configuration 기능이 활성화되지 않는다. 따라서 @EnableWebMvc를 활성화하고 LocalDateTime 값을 JSON 응답으로 받으면 다음과 같이 반환된다.
{
"localDateTimeWithJSR310": [
2019,
6,
19,
8,
50,
18,
3000000
]
}
WebMVC 설정이 필요한 경우 @EnableWebMvc 어노테이션을 사용하지말고, WebMvcConfigurer 인터페이스를 구현하여 설정을 적용한 뒤에 해당 클래스에 @Configuration 어노테이션을 붙여 스프링 부트가 설정 클래스로 인식하게 해야 한다
'Programming > Spring' 카테고리의 다른 글
[SpringBoot] Redis Channel Subscribe with MessagePack (0) | 2019.09.18 |
---|---|
[SpringBoot] Redis Publish Channel Subscribe (0) | 2019.09.18 |
[Spring Boot] @Schedule로 스케줄 프로그래밍 하기 (0) | 2019.08.22 |
[SpringBoot] 에러 로그 모니터링 with Sentry (0) | 2019.08.04 |
Spring Boot Logging (Convert To JSON Format) (2) | 2019.05.27 |