Cron, 크론은 본래 유닉스 계열의 운영체제에서 시간 기반으로 잡 스케쥴링을 하는 후면 프로세스의 명칭이다. 이 때 잡 스케쥴링의 파라미터로 사용되는 표현식을 Cron 표현식이라고 한다. 유닉스나 리뉵스의 스케쥴링 작업에도 사용되지만, 자바 스프링 기반의 Quartz 등으로 서버 스케쥴러를 개발할 때에도 종종 사용된다.
[ Spring boot 에서 Quartz Scheduler, Cron을 사용한 스케쥴러 구현 : http://www.leafcats.com/93 ]
크론 표현식은 Job 스케쥴을 관리하거나 스케쥴러 개발을 할 때 필요한 순간마다 검색해서 사용하곤 했다. 사실 크론 표현식을 생성해주는 cronMaker와 같은 사이트에서 편하게 만들 수 있지만, 표현식을 읽을 수 있는것도 매우 중요하기 때문에 한번 정리해 두려고 한다.
Cron Expression
Cron 표현식은 7개로 구분된 단위 표현식으로 이루어진 String 문자열이다. 각각의 단위는 초/분/시 등으로 세분화되어 사용되며 각각의 단위는 공백(" ") 으로 구분된다. 아래 코드를 보면 한눈에 알 수 있다.
1. 가장 앞에 오는 단위는 초(Seconds)이다.
2. 두번째는 분(Minutes)을 나타낸다.
3. 세번째는 시(Hours)를 나타낸다.
4. 네번째는 일(Day-of-Month, DOM)을 나타낸다.
5. 다섯번째로 월(Month)에 대한 정보를 기술한다.
6. 여섯번째는 요일(Day of Week)을 나타낸다. 요일은 0~6의 숫자로 쓸 수도 있지만 "MON", "SUN"과 같이 요일의 약자로 사용할 수도 있다.
7. 마지막으로 일곱번째에는 연도(Year)가 온다. 연도는 optional이다.
- 와일드카드(*) 문자는 '매 번'을 의미한다.
- 물음표(?) 는 '설정값 없음'을 나타낸다. 이는 일(DOM)과 요일(DOW)에만 사용할 수 있다.
- 슬래쉬(/) 는 값 증가 표현에 사용된다. 분(Minutes) 항목에 "10/15" 라고 쓴다면, "10분부터 시작해서 매 15분마다" 를 의미한다.
- 샾(#)은 k#N으로 사용되며, 이 달의 N번째 K요일을 의미한다. 요일(DOW) 항목에 "5#2" 라고 적는다면, "이 달의 두번째 목요일"을 뜻한다.
- 문자 "L" 은 마지막(Last)를 의미한다. L은 일(DOM)과 요일(DOW)에만 사용할 수 있다. 예를 들어 일(DOM)항목에 L이 사용된다면 단순하게 해당 월의 마지막 날을 의미한다. 조금 다른 방법으로도 사용되는데, 특정 값 뒤에 사용된다면 "이 달의 마지막 날"을 의미하게 된다. 예를들어 요일에 "6L"을 준다면, "이 달의 마지막 금요일" 을 의미하게 된다.
- 문자 "W"는 해당 날로부터 가장 가까운 평일(Weekday)을 의미한다. 예를 들어 일(DOM) 항목에 "10W"라고 준다면, "이 달의 10째 날로부터 가장 가까운 평일"을 의미한다.
- 각각의 단위는 범위나 목록으로 나타낼 수도 있다. 일(DOM)에 "1-15"라고 적는다면 1일부터 15일까지를 뜻한다.
- 각각의 항목은 항목에 유효한 값만이 들어올 수 있다. 예를 들어 일은 1 ~ 31 사이의 숫자만 허용되고, 시간은 0~23 사이의 시간만 허용한다.
Cron Expression Examples
위에 정리한 내용으로 만든 몇 가지 예제이다. 예제는 quart-scheduler.org의 tutorial-lesson에서 따왔다.
1. “0 0/5 * * * ?” : 매 시 5분마다 수행.
2. “10 0/5 * * * ?” : 10초 뒤 5분마다 수행.
3. “0 30 10-13 ? * WED,FRI” : 매 주 수요일과 금요일 10시~13시 30분에 수행.
4. “0 0/30 8-9 5,20 * ?” : 매 월 5일과 20일에 8시~9시대에 30분 간격으로 수행. (8:00, 8:30, 9:00, 9:30) 수행
사실 크론 표현식 자체가 어려운것은 아니지만 다소 혼동을 주는 표현들이 많다. 때문에 실제 업무에서 사용한다면, 직접 만들기 보다는 cronMaker와 같은 사이트를 사용해서 표현식을 만든 뒤에 검증하는 방법을 사용하는 것이 좋다.