본문 바로가기
TIL

[Java] cron 시간 설정 시 에러 발생

by 긍고 2021. 6. 2.
반응형

얼마 전, 일괄 작업을 위해 @Scheduled 어노테이션을 이용하여 배치 코드를 사용한 적이 있다. 보통 배치는 주기를 갖고 반복해서 실행되는데 내가 처리하려고 했던 것은 올해 특정일에 딱 한 번만 실행되어야 하는 작업이었고 cron 표현법을 이용하여 다음과 같이 배치 코드를 개발했었다.

@Scheduled(cron = "0 10 01 30 05 ? 2021")
public void test() {
    System.out.println("batch Test");
}

cron expression(크론 표현식)

위의 Scheduled 어노테이션 옆에 cron으로 몇 가지 숫자가 할당되어 있는 것을 볼 수 있는데 이것이 cron 표현식이다. 스프링 스케줄러에서 cron 표현식은 총 7자리의 숫자들로 시간을 표현할 수 있는데 각 자리의 뜻은 아래와 같다.

요일 연도
0-59 0-59 0-23 1-31 1-12 0-6 생략 가능
  • 요일은 0:일요일 ~ 6: 토요일
  • 마지막 7번째인 연도는 생략이 가능하다.
  • 일, 요일의 경우 사용하지 않을 경우 ?로 대체가 가능하다.

스프링 스케줄러에서 주의할 점

따라서 코드와 위 표에 따르면 0 10 01 30 05 ? 2021 은 2021년 5월 30일 새벽 1시 10분을 뜻한다. 이와 같이 크론 표현식의 문법을 잘 지켜서 설정을 했으나 위 코드대로 실행하면 에러가 발생한다.

에러 메시지에 따르면 쿼츠 / 스프링 스케줄러에서 cron 표현식은 연도를 표현할 수 있으나 @Scheduled 어노테이션을 사용할 때에는 반드시 연도를 생략한 표현식을 사용해야함을 알 수 있었다.

@Scheduled(cron = "0 10 01 30 05 ?")
public void test() {
    System.out.println("batch Test");
}

따라서 코드를 위와 같이 수정하고 해당 배치가 실행된 날 이후에는 불필요한 코드를 제거하도록 하여 문제를 해결할 수 있었다.

댓글