[Spring Boot] 서버 TimeZone 설정하기

Monday·2024년 5월 31일

문제 상황

현재 진행중인 프로젝트에서 시간 데이터를 다루게 되었다.
그러면서 LocalDateTime.now() 같은 함수들을 사용하는 일이 발생했다.
이때 원하는 TimeZone이 있으면 LocalDateTime.now() LocalDateTime.now(ZoneId.of("Asia/Seoul")) 이런 형태로 명시해 주어야 한다.

느낀 문제점

코드의 중복

우선 현재 날짜, 시각이 필요할때마다 저렇게 ZoneId를 명시해 주는것은 번거로운 일이라고 생각되었다.

관리 어려움

혹여나 누군가의 실수로 명시하지 않은 부분이 존재한다면?
현재는 내가 한국에 거주중이여서 로컬 환경에서는 괜찮을 수 있지만
배포된 서버에 따라 충분히 원하지 않는 지역의 시간값이 들어갈 수 있다.
이렇게 작게 발생할 수 있는 실수조차 사전에 예방하는것이 좋다고 생각한다.

그러면 어떻게 해야할까?

LocalDateTime.now() 알아보기

LocalDate 클래스 내부에 now 함수는 다음과 같이 3개의 메서드로 오버로딩 되어있다.


parameter로 원하는 TimeZone을 명시해 줄 수 있지만 기본적으로 parameter가 없는 형태의 메서드도 지원하고 있다.

해당 메서드에서는 Clock.systemDefaultZone() 이라는 값을 사용해서 TimeZone을 설정하여 준다.

그러면 systemDefaultZone() 의 값만 원하는 형태로 변경한다면 애플리케이션 어디서든 LocalDateTime.now()를 호출하기만 하면 되는 것이다.

defaultTimeZone 설정하기

TimeZonesetDefault() 라는 메서드를 사용하면 defaultTimeZone을 설정할 수 있다.

코드

public class Application {
    public static void main(String[] args){
        TimeZone.setDefault(TimeZone.getTimeZone("America/Guatemala"));

        SpringApplication.run(Application.class, args);
    }
}

다음과 같이 어플리케이션클래스의 main 함수에 defaultTimeZone을 설정하는 코드를 적용하면 된다.
물론 @PostConstruct 같은 어노테이션을 활용하는 방법도 있을 것이다.

확인하기

@Slf4j
public class MatchingBoardApplication {
    public static void main(String[] args){
//        TimeZone.setDefault(TimeZone.getTimeZone("America/Guatemala"));

        log.info("{}", Clock.systemDefaultZone());

        SpringApplication.run(MatchingBoardApplication.class, args);
    }
}

예시를 보고 왜 값이 "America/Guatemala" 인지 의아했을수도 있다.
한국에서 거주중이기에 다음과 같이 log로 확인해보면 기본값이 "Asia/Seoul" 로 설정되어 있다.

그렇다면 TimeZone"America/Guatemala" 로 설정해보자

public class Application {
    public static void main(String[] args){
        TimeZone.setDefault(TimeZone.getTimeZone("America/Guatemala"));

        log.info("{}", Clock.systemDefaultZone());

        SpringApplication.run(Application.class, args);
    }
}

다음과 같이 잘 설정된 것을 확인할 수 있다!

profile
차근차근 꾸준히

0개의 댓글