Programing/Java & Spring

[Spring] TimeZone에 대해 활용해보자

세기루민 2024. 8. 21. 18:01
728x90

회사에서 최근에 TimeZone을 이용하여 권역에 따른 서비스 분리 운영을 진행하려고 한다.

조건은 서비스의 코드는 동일 코드지만, 컨테이너 혹은 Application의 TimeZone을 분할하는 방향으로 설계가 되었고

이에 따라 나는 어플리케이션 단에서 TimeZone을 유동적으로 처리할 수 있도록 구성이 필요했다.

 

즉, Application에 TimeZone 설정하는 방법에 대해 해당 포스팅에서 리뷰해보려고 한다.

 

 

1. TimeZone이란 무엇인가?

TimeZone이란 전 세계적으로 사용되는 표준 시간을 의미한다. 

주로 UTC/GMT를 많이 사용하는 편이고 예를 들어 한국 기준을 표준 시간대로 변경하면 UTC+9라는 값을 가지게 된다.

 

2. TimeZone을 사용해야 하는 이유?

우선적으로 TimeZone을 사용해야 하는 이유는 나라별로 시간이 다르다는 점이다.

나라별로 시간이 다르기 때문에 나라별 시간의 오차를 줄이기 위해서는 표준 시간대인 TimeZone을 이용해야 한다. 

IT 서비스 뿐만 아니라 항공기 스케줄, 글로벌 금융 거래 등 다양한 분야에서 TimeZone을 이용하고 있고

이는 각 나라별 사용자들에게 시간적인 혼선을 최소화 할 수 있도록 한다. 

 

3. Application TimeZone 적용하기

TimeZone에 대한 이론과 필요한 이유를 간단히 알아봤다. 

이제부터는 본격적으로 코드에 적용하는 방향성을 리뷰해보려고 한다.

 

Application TimeZone 적용하는 방식은 크게 2가지 방식으로 가능하다. 

  1. Application에 직접 적용하는 방식 
  2. Application에 직접 적용하지 않고, 서버의 TimeZone을 이용하는 방식
    • 다만, 2번 방법의 경우는 서버가 존재해야 함으로 로컬 환경 혹은 개인 개발 공부시에는 적용이 불가능할 수 있다.

이번 포스팅에서는 1번 방식으로 적용하려고 한다.

사실 2번도 1번과 동일한 방식이고 개인적으로 2번 방식이 조금 더 선호하는 방식이다. 

  • Application 내 굳이 TimeZone 설정을 안할 수 있기 때문

 

3.1 Application TimeZone 적용 > configuration 파일 생성하기

@Configuration
public class DefaultTimeZoneConfiguration {
	
    // 타임존에 대한 환경 변수를 관리하는 Class
    private final TimeZoneProperties timeZonePeroperties;
    
    public DefaultTimeZoneConfiguration(TimeZoneProperties timeZonePeroperties) {
        this.timeZonePeroperties = timeZonePeroperties
    }
    
    @PostConstruct
    public void defaultTimeZoneInit() {
    	// defaultTimeZone에 대해 전달받은 TimeZoneId로 설정한다. 
        // 즉, Asia/Seoul로 DefaultTimeZone을 설정한다면, LocalDateTime.now() 할 때 한국 시간으로 출력된다.
    	TimeZone.setDefault(TimeZone.getTimeZone(timeZoneProperties.getTimeZoneId));
    }

}
  • 위와 같이 DefaultTimeZone에 대해서 원하는 TimeZoneId로 설정해주면 어플리케이션이 실행할 때 TimeZoneId에
    해당하는 표준 시간대로 변경된다. 
    • 여기서 TimeZoneId란 타임존 식별자를 의미하며 예를 들어  우리나라를 표기하면 "Asia/Seoul"로 표기할 수 있다. 

 

TimeZoneProperties.class

@Component
@Data
public class TimeZoneProperties {
	
    @Value("${timezone.identifier}")
    private String timeZoneId;
    
}
  • Configuration에서 사용한 TimeZoneId 값에 대해서는 Properties로 관리한다.
  • 또한 TimeZoneID값에 대해서는 서버 환경에 따라 변경이 가능한 값으로 환경변수 처리를 한다.

 

Application.yml 

timezone:
  identifier : ${TIMEZONE_IDENTIFIER}
  • Application.yml 파일에는 환경변수로 전달 받으려는 값을 설정해준다. 

 

4. JDBC TimeZone 설정 

JPA를 사용하는 사용자들은 이미 사용중인 설정 중 하나일 것이다.

다만, DB에 Insert/Update시 사용되는 TimeZone과 Application의 TimeZone을 일치하도록 구성하기 위해 맞춰 줄 필요가 있다.

 

Application.yml 

spring:
  jpa:
    properties:
      hibernate:
        jdbc:
          time_zone : ${TIMEZONE_IDENTIFIER}

 

5. 마치며 

TimeZone에 대해 로직을 수정하는 건 어렵지 않다.

다만, 뭐든 정책과 스팩을 정의하는 설계 단계에서 가장 오래 걸린다는 걸 이번에 또 느꼈다.

모든 개발자 분들 존경하며 화이팅입니다...ㅎ

 

 

728x90