본문 바로가기

FrameWork/Spring Boot

Spring Boot - Timezone을 설정한 채로 배포하기(-Duser.timezone을 사용하지 않고)

Spring Boot에서 Timezone을 설정하여 배포하기

1. Timezone을 설정해야 했던 시나리오

Spring Boot를 이용해 서버를 구축하고 있던 중, 특정 도메인이 시간에 종속되는 상황이었습니다. 때문에, Timezone에 의존할 수 밖에없었습니다. 도메인을 간략히 설명드리자면, 사용자가 회원가입을 할때, 오전 10시에서 오후 6시사이에만 가능하도록 해야했습니다.

 

위의 메소드는 해당 문제상황을 간단하게 재연한 로직입니다. register()는 사용자가 "/test" 엔드포인트로 접근했을때, 회원가입을 시도했다고 가정한 메소드입니다.

 

먼저 LocalDateTime.now().getHour()를 이용해 현재시간을 저장합니다. 그림에서 보시는바와 같이 현재 시간은 오후 1시 즉, 13시 이므로, 조건에 만족하기 때문에 성공하게 됩니다. 성공을 했으니 실제 프로덕트 환경에 배포를 해야겠습니다.

 

 

어? 이상하게 현재 회원가입이 불가능한 시각이라고하며 Exception이 발생하는것을 볼 수 있습니다.

 

저의 경우 AWS에 배포를 하게 되었는데, 그곳 Server의 Timezone이 저희와 맞지 않기 때문에 발생하는 에러입니다. console에 시각을 출력해본 결과 21시가 나타나는것을 볼 수 있습니다.

 

 

 

Timezone 설정

검색을 통해 알아본결과 -Duser.timezone=타임존 매개변수와 함께 실행을 하게 되면, 원하는 Timezone으로 설정을 할 수 있음을 알게되었습니다.

 

보시는바와 같이 성공함을 알 수 있습니다.

 

 

 

 

2. 문제점

이 처럼 수동으로 실행시, timezone을 설정해야하는 경우, 경험을 해본결과, 매 배포시 이를 기억하고 수시로 입력해주어야 하는 불편함과 까먹고 매개변수로 입력하지 않은 경우, 사용자들이 회원가입을 하지 못하는 불상사가 발생하였습니다.

 

물론 자동배포환경을 구성하며 script에 sudo java -jar -Duser.timezone=Asia/Seoul ...을 마지막에 입력하도록 구성하면, 해결할 수 있습니다만, 이번 포스팅에서는 자동배포환경 구성이 안되어있는 경우 간단히 해결하는 법을 알려드리겠습니다.

 

 

 

3. 빈 생명주기를 이용한 Timezone 자동설정

@PostConstruct는 Bean이 완전히 초기화 된 후, 단 한번만 호출되는 메소드 입니다. @SpringBootApplication 어노테이션이 부여된 Application Class에서 @PostContstrcut가 부여된 메소드를 생성하고 위그림과 같이 입력을 하게되면, 어플리케이션 실행시 Timezone을 설정할 수 있습니다.