프로젝트로 66일 동안 습관을 유지하는 서비스를 만들고 있었다. 매일 자정 습관을 인증했는지 확인하는 지 체크하는 요구사항이 있었다.
@Transactional
@Scheduled(cron = "0 0 0 * * *")
public List<Challenge> notAuthTodayCheck() {
...
return challenges;
}
분명 로컬에서는 잘 실행되었는데, EC2 배포 후에는 로직이 잘 작동되지 않았다.
확인해보니 자정에 실행되어야 할 로직이 9시간 전인 오후 3시에 실행되었다. (처음에는 로직을 잘못 짠줄 알고 한참 헤맸다ㅠㅠ)
이유가 뭐였을까?
EC2에서 새 인스턴스를 만들게되면 KST가 아닌 UTC로 표시된다.
UTC는 한국시간보다 9시간 느리기 때문에 한국 시간으로 자정에 실행되어야 할 로직이 UTC 기준 오후 3시에 실행되었던 것이다.
그럼 EC2 서버 시간을 UTC에서 KST로 바꿔보자
EC2 Timezone 설정
아래 명령어를 입력해주자
1. 현재 Timezone을 확인한다.
sudo date
2. 기존에 지정된 시간 파일을 삭제해준다.
sudo rm /etc/local/time
3. 한국 Timezone으로 변경한다.
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
4. 변경된 Timezone을 확인한다.
그런데...
EC2 Timezone을 변경했는데도 로직은 3시에 실행되었고 톰캣 로그도 여전히 UTC로 나왔다. 그래서 열심히 알아보던 중 알게 된 사실!
서버 시간과 톰캣 시간은 별개였던 것이다.
로직은 톰캣 시간을 기준으로 실행되기 때문에 서버에서 실행되는 톰캣의 Timezone을 변경해주어야 한다!
해결 : 톰캣 Timezone 설정
@SpringBootApplication 애너테이션이 붙은 클래스에 아래와 같이 입력하면, 애플리케이션이 실행되면서 지정한 Timezone으로 설정된다.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableScheduling;
import javax.annotation.PostConstruct;
import java.util.TimeZone;
@EnableJpaAuditing
@EnableScheduling
@SpringBootApplication
public class ServerApplication {
public static void main(String[] args) {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul")); // EC2에서도 Tomcat 서버의 시간을 서울 시간으로 변경한다.
SpringApplication.run(ServerApplication.class, args);
}
}
톰캣 Timezone을 변경하였더니 원래 요구사항대로 자정에서 로직이 잘 실행되었다.
스케줄러를 사용하지 않았다면 모르고 지나쳤을 트러블을 알게되어서 재밌었다.
다음 프로젝트에서는 EC2에서 새 인스턴스를 생성하면 바로 Timezone을 설정해줘야겠다.