[백업][가리사니] job scheduler 크론 (cron) 과 크론 표현식
cron, spring

이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다. 오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.

크론 / 스케줄러 (배치) 시리즈

잡 스케줄러? 크론 표현식?

실무에서는 배치, 크론, 스케줄러, 예약작업, 잡 등으로 부르는데 일단 정리를 하고 넘어가보겠습니다.

스케줄러 (Scheduler), 잡 스케줄러, 예약작업 :

  • 새벽 3시에 업데이트 등과 같은 특정 시간/주기에 어떤 일을 하는 흔히 예약(반복/비반복) 하는 작업(Job)들을 실행시켜주는 주체입니다.

    크론 (Cron) :

  • [https://en.wikipedia.org/wiki/Cron
  • 본래는 의미로는 유닉스계열의 잡스케줄러 시스템이지만, 현재는 그냥 잡 스케줄러와 동일한 의미처럼 불립니다.

    배치 (Batch) :

  • 일괄처리로 대량의 작업을 하는 것 입니다.
  • 다만 대부분의 배치가 스케줄링 되기 때문에 업종이나 회사에 따라선 그냥 배치라고 부르기도 합니다.
  • 때문에 배치는 반드시 스케줄링 되는 것이 아닌 일괄처리 즉, 예약작업이 걸리지 않는 쉘스크립트나 SQL프로시저도 배치가 될 수 있습니다.
  • 즉, 여기서는 배치라는 표현보단 잡이라는 표현을 쓰도록 하겠습니다.

    잡 (Job) :

  • 흔히 스케줄링에서 배치라고 부르면 잡입니다.
  • 좀 더 정확한 의미로 스케줄링이 될 배치라고 보시면 됩니다.
  • 경우에 따라서는 해야할일로 단계별 잡이 있을 수 있습니다.

    크론 표현식 (Cron expression) :

  • 간단히 말해서 스케줄러계열의 표현식(expression) 입니다.
  • 정규표현식과 마찬가지로 구현체에 따라서 조금씩 다른 부분도 있습니다.
  • 여기서는 스프링 스케줄러 / 쿼츠 기반의 크론 표현식 주로 다루도록하겠습니다.

크론 표현식

리눅스 / 유닉스 크론 표현식

|분|시|일|월|요일| |-|-|-|-|-| |0-59|0-23|1-31 / ?|1-12|0-6 / ?|

스프링 스케줄러 / 쿼츠 크론 표현식

|초|분|시|일|월|요일|연도| |-|-|-|-|-|-|-| |0-59|0-59|0-23|1-31 / ?|1-12|0-6 / ?|생략가능|

주의점

  • 월은 0-11이 아닌 1-12 입니다.
  • 요일은 0:일요일 ~ 6:토요일 이지만 7도 일요일로 되어있습니다. 하지만 일관성을 위해 일요일을 한쪽으로 쓰는걸 권장합니다.

크론 표현식 예제

기본적인 표현식은 같으나 아래부터는 스프링 기반으로 설명하도록하겠습니다.

예를들어 2016년 11월 20일 오후 2시(14시) 10분 36초에 실행하려고 합니다. 자바기반 yyyy-MM-dd HH:mm:ss 로 표현하면 2016-11-20 14:10:36 입니다. 크론 표현식으로 표현한다면 아래와 같습니다.

36 10 14 20 11 ? 2016

여기서 보이는 ? 는 설정값 없음으로 오직 일[day-of-month:1-31], 요일[day-of-week:0-6]에서만 사용 가능합니다. 좀 더 응용해서 매년 11월 20일 오후 2시(14시) 10분 36초 에 실행하려고한다면 아래와 같이 표현할 수 있습니다.

36 10 14 20 11 ? *

혹은

36 10 14 20 11 ?

스프링 스케줄러와 쿼츠에서는 연도를 생략할 수 있습니다. 또한 *는 모든조건 즉, 와일드카드입니다. 그럼 매일 오후 2시(14시) 10분 36초 에 실행시키는 식을 써보도록하겠습니다.

36 10 14 * * ?

그럼 다시 매일 새벽 3시 정각에 실행시키려면 어떻게 표현해야할까요?

* * 3 * * ?

위처럼 설정하면 새벽 3시부터 새벽 4시 전까지 1초마다 실행될 것입니다. 왜냐면 모든초 모든분 3시 모든일… 이기 때문입니다.

0 0 3 * * ?

그래서 위처럼 설정해야 새벽 3시 0분 0초에 실행됩니다. 그럼 새벽 3시부터 4시전까지 10분 부터 5분마다 도는 크론을 설정해보도록하겠습니다.

0 10/5 3 * * ? [시작시간]/[단위]

이렇게 3시 10분 15분 20분 25분 30분 45분 50분 55분 이 실행됩니다. 일반적으로 이런단위 배치는 정각부터 실행됩니다. 그래서 보통은 0/단위를 씁니다. 그럼 10분마다 도는 크론을 설정해보겠습니다.

0 0/10 * * * ?

이렇게 설정하면 [0분 0초], [10분 0초], [20분 0초], [30분 0초], [40분 0초], [50분 0초] 이렇게 돌게 됩니다. 그밖에도 아래와 같은 표현식들이 있습니다.

크론 표현식 옵션

? : 조건없음 [, 요일 에서만 사용가능]
* : 모든 조건에서 
시작시간/단위 ( 0/5) : 해당 시작시간부터 해당 단위때 
시작범위-끝범위 ( 3-5) : 예제(3-5) 3에서 5까지 (3, 4, 5) 조건일때 .
x,y,z... ( 1,3,5) : 예제(1,3,5) 1,3,5 일때만 .
L : [, 요일 에서만 사용가능]
- 일에서 사용하면 : (L) 마지막 날짜입니다. 예를들어 1월이라면 31 2월이라면 윤년에 따라 28혹은 29 4월이라면 30일에 .
- 요일에서 사용하면 : (6L) 6(토요일) 마지막 토요일에 실행됩니다. 마지막주가 토요일이 없다면 그전주 토요일에 .
W : [일에서만 사용가능]
- 가장 가까운 평일(~) 찾습니다.
- 15W 라고 설정했다면 15일이 ~ 범위라면 해당 날짜에서 .
- 15W 15일이 토요일이라면 가장 가까운 금요일인 14일에 .
- 15W 15일이 일요일이라면 가장 가까운 월요일인 16일에 .
# : [요일에서만 사용가능]
- 예를들어 3#2 라고 썻다면 (수요일#2번째주)라는 의미가 됩니다.
-  2번째주의 수요일에 참이 됩니다.