본문으로 바로가기

[Spring] Timezone 적용 (feat.@JsonFormat)

category Framework/Spring 2021. 12. 3. 17:46

main 메소드가 선언된 어플리케이션의 클래스에 아래와 같이 @PostConstruct 를 통해 타임존을 설정한다.

package com.tutorial.tailerbox;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import javax.annotation.PostConstruct;
import java.util.TimeZone;

@SpringBootApplication
public class TailerboxApplication {

    @PostConstruct
    void started() {
        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"));
    }

    public static void main(String[] args) {
        SpringApplication.run(TailerboxApplication.class, args);
    }

}

 

@JsonFormat

Entity 또는 DTO 에서 필드 타입에 @JsonFormat 어노테이션을 사용하는 경우 timezone 을 지정하지 않을 시 응답 데이터로 전환될 때 기본값이 UTC로 전송이 되는데.. 이걸 모든 날짜에 해당하는 프로퍼티에 코딩을 하는게 귀찮고 깔끔하지가 않다..

    ...
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
    private Timestamp createdAt;
    ...

@Jackson2ObjectMapperBuilderCustomizer 사용하기

@JsonFormat 어노테이션은 Jackson 라이브러리에서 제공되며 spring-boot-starter-web 에 포함되어있다.

configuration 을 정의한 패키지에 아래와 같이 클래스를 생성하고 다음의 코드를 작성한다.

package com.tutorial.tailerbox.config;

import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.format.DateTimeFormatter;
import java.util.TimeZone;

@Configuration
public class DateFormatConfiguration {

    private static final String dateFormat = "yyyy-MM-dd";
    private static final String datetimeFormat = "yyyy-MM-dd HH:mm:ss";

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return jacksonObjectMapperBuilder -> {
            jacksonObjectMapperBuilder.timeZone(TimeZone.getTimeZone("Asia/Seoul"));
            jacksonObjectMapperBuilder.simpleDateFormat(datetimeFormat);
            jacksonObjectMapperBuilder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
            jacksonObjectMapperBuilder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(datetimeFormat)));
        };
    }

}

Jackson2ObjectMapperBuilderCustomizer 는 JSON 응답값을 변경할 수 있는 인터페이스이다.

Jackson2ObjectMapperBuilder 클래스는 Jackson 라이브러리의 기본적인 설정을 사용하는데, Jackson2ObjectMapperBuilderCustomizer 인터페이스를 이용해서 우리가 원하는 대로 JSON 응답값을 변경할 수 있도록 해준다.

날짜 형식을 변경하기 위해서 사용하기 때문에 DateFormatConfiguration이라는 이름으로 만들었지만, JSON 응답에 관련된 수정을 하게된다면 클래스 이름을 그에 맞게 만들면 된다. 여기서는 날짜 형식만 변경하지만 이 외에도 JSON 응답값의 인덴트(띄어쓰기) 설정 등 여러가지를 변경할 수 있다.