Quartz cron 은 무엇이 다른가?
Quartz 는 유닉스 crontab 이 다섯 필드를 쓰는 자리에 여섯 또는 일곱을 쓴다. 앞에 붙는 필드가 초이고, 뒤에 선택적으로 연도가 붙는다. 이것만으로도 둘 사이에 옮긴 표현식이 대부분 깨진다 — 다섯 필드짜리 crontab 줄을 Quartz 에 붙여넣으면 초부터 요일까지로 읽혀, 09:00 에 돌리려던 작업이 전혀 다른 시각에 돈다.
Quartz 에는 crontab 에 대응이 없는 문자도 있다. ? 는 "지정하지 않음"이고 일과 요일 중 정확히 하나에 반드시 들어가야 한다 — Quartz 가 둘 다 지정하는 것을 금지하기 때문이다. L 은 마지막 날, W 는 가장 가까운 평일, # 은 그 달의 n번째 요일을 고른다. "둘째 금요일"을 적으려면 이 문법이 필요하다.
Cron expressions are comprised of 6 required fields and one optional field.
기능
- 초와 연도 필드
- 여섯·일곱 필드에 이름을 제대로 붙인다. 값이 엉뚱한 자리에 들어간 것을 엉뚱한 시각에 도는 것으로 짐작하는 대신 눈으로 본다.
- ? 규칙이 보이게
- Quartz 는 일과 요일 중 정확히 하나에 ? 를 요구한다. 표현식을 말로 되돌려 읽는 것이 둘 다 * 로 둔 것을 잡는 방법이다 — Quartz 는 그걸 그냥 거부한다.
- L·W·# 을 풀어 준다
- 문법 표와 대조하게 두지 않고, 실제로 붙여넣은 그 표현식에서 이 문자들이 무슨 일을 하는지 말해 준다.
- 실행 시각은 일부러 안 준다
- Quartz 전용 문자를 쓴 표현식에는 다음 실행 시각을 붙이지 않는다. 쓸 수 있는 파서들이 ? 와 L 을 Quartz 와 다르게 읽는데, 스케줄을 확인하러 온 페이지에서 틀린 시각을 보여주는 것은 안 보여주는 것보다 나쁘다.
사용법
- 1
표현식을 붙여넣는다
여섯 필드(맨 앞이 초) 또는 뒤에 연도가 붙은 일곱 필드.
- 2
문장을 읽는다
입력 바로 아래에 표현식을 말로 옮긴 문장이 나온다.
- 3
필드 분해를 확인한다
필드마다 이름이 붙어 있어, 실수로 붙여넣은 crontab 표현식이 한 필드 모자란 것으로 바로 드러난다.
- 4
Quartz 에서 직접 확인한다
? L W # 을 쓴 표현식은 실제 스케줄러에서 실행 시각을 확인한다 — 이 페이지는 일부러 짐작하지 않는다.
자주 묻는 질문
Quartz cron 표현식은 필드가 몇 개인가?
여섯 개가 필수다 — 초·분·시·일·월·요일 — 이고 일곱 번째로 연도가 선택이다. 유닉스 crontab 은 다섯이고 초 필드가 없다. 표현식이 둘 사이를 그대로 오가지 못하는 이유다.
Quartz 의 ? 는 무슨 뜻인가?
지정하지 않음이다. Quartz 는 일과 요일을 둘 다 제한하는 것을 허용하지 않으므로 둘 중 정확히 하나가 ? 여야 한다. 둘 다 * 로 두면 오류이고, crontab 줄을 옮길 때 가장 흔히 저지르는 실수다.
L·W·# 은 뭔가?
L 은 그 달의 마지막 날 또는 마지막 해당 요일, W 는 주어진 날에 가장 가까운 평일, # 은 그 달의 n번째 요일을 고른다. 6#2 는 둘째 금요일이다. 표준 crontab 에는 셋 다 없다.
crontab 표현식을 붙여넣어도 설명이 나오는 이유는?
설명이 필드 개수로 만들어지기 때문이다. 다섯 필드짜리는 crontab 으로 설명되고 그건 맞다 — 다만 Quartz 는 초 필드를 요구하므로 그 표현식을 거부한다. 필드 분해가 그 어긋남을 보여 준다.
Spring 도 같은 문법인가?
Spring 의 @Scheduled 는 Quartz 처럼 초가 앞에 붙은 여섯 필드를 받지만 연도 필드가 없고 L 과 # 의 처리가 버전마다 다르다. 기본 필드를 넘어서는 것은 쓰는 Spring 버전에서 확인한다.
여기서 막힌다면
이 도구가 따르는 규격
- Quartz — CronTrigger 튜토리얼 — 필드 목록, ? 규칙, 특수 문자 L·W·#.
- crontab(5) — 리눅스 매뉴얼 — Quartz 표현식이 대개 옮겨져 오는 다섯 필드 형식.