Spring Scheduled Job 사용 시 유의사항
Docker 환경에서 Spring Scheduled Job 사용 시 발생할 수 있는 Timezone 관련 문제와 해결 방법을 소개합니다.
Spring Boot Scheduled Job 기능을 사용하게 되었다.
거래대사 시스템은 Spring Boot Scheduled Job 을 이용해서 동작시키기로 했는데, 배포는 Docker 을 통해 관리하게 되어있다.
이 과정에서 유의해야 할 사항이 생겼다. 배포 서버의 OS Timezone 이 Seoul 로 맞추어져 있어도,
Docker Container 의 Timeone 이 UTC 로 맞추어진다면, Scheduled Job 이 예상하지 못한 시간에 실행될 수 있다.
이를 해결하기 위한 방법은 다음과 같다.
1. Spring Boot Application Configuration
package web.sebong;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.TimeZone;
@Slf4j
@SpringBootApplication
public class Application {
@PostConstruct
public void started() {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"));
log.info("CURRENT TIME : " + new Date());
}
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.run(args);
}
}
어플리케이션을 실행할 때, 어플리케이션의 timezone 을 Asia/Seoul 로 설정한다.
2. Docker 설정
docker run --name="$APP\_NAME-$IDLE\_PROFILE" \
-v $SERVER\_LOG\_PATH:$CONTAINER\_LOG\_PATH:rw \
-v /etc/localtime:/etc/localtime:ro -v /usr/share/zoneinfo/Asia/Seoul:/etc/timezone:ro \
--rm -d \
-p $IDLE\_PORT:$DOCKER\_PORT $JENKINS\_URL:5000/$APP\_NAME:latest 배포 서버 OS 의 localtime 을 docker 에 mount 시키는 것을 확인할 수 있다.
이것도 읽어보세요