현재 진행중인 프로젝트에서 시간 데이터를 다루게 되었다.
그러면서 LocalDateTime.now() 같은 함수들을 사용하는 일이 발생했다.
이때 원하는 TimeZone이 있으면 LocalDateTime.now()에 LocalDateTime.now(ZoneId.of("Asia/Seoul")) 이런 형태로 명시해 주어야 한다.
우선 현재 날짜, 시각이 필요할때마다 저렇게 ZoneId를 명시해 주는것은 번거로운 일이라고 생각되었다.
혹여나 누군가의 실수로 명시하지 않은 부분이 존재한다면?
현재는 내가 한국에 거주중이여서 로컬 환경에서는 괜찮을 수 있지만
배포된 서버에 따라 충분히 원하지 않는 지역의 시간값이 들어갈 수 있다.
이렇게 작게 발생할 수 있는 실수조차 사전에 예방하는것이 좋다고 생각한다.
그러면 어떻게 해야할까?
LocalDate 클래스 내부에 now 함수는 다음과 같이 3개의 메서드로 오버로딩 되어있다.



parameter로 원하는 TimeZone을 명시해 줄 수 있지만 기본적으로 parameter가 없는 형태의 메서드도 지원하고 있다.
해당 메서드에서는 Clock.systemDefaultZone() 이라는 값을 사용해서 TimeZone을 설정하여 준다.
그러면 systemDefaultZone() 의 값만 원하는 형태로 변경한다면 애플리케이션 어디서든 LocalDateTime.now()를 호출하기만 하면 되는 것이다.
TimeZone의 setDefault() 라는 메서드를 사용하면 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);
}
}
다음과 같이 잘 설정된 것을 확인할 수 있다!
