가이드 / cron 표현식
cron 표현식 완전 정리
— 읽는 법, 예시 모음, 함정 4가지
구조: 왼쪽부터 분·시·일·월·요일
┌───────── 분 (0-59)
│ ┌─────── 시 (0-23)
│ │ ┌───── 일 (1-31)
│ │ │ ┌─── 월 (1-12)
│ │ │ │ ┌─ 요일 (0-7, 0과 7 = 일요일)
│ │ │ │ │
0 4 * * * → "매일 4시 0분"각 자리에 들어갈 수 있는 것: 숫자(4), 전부(*), 목록(1,15), 범위(9-18), 간격(*/5). 이 다섯 가지 조합이 전부입니다.
👉 표현식을 넣고 다음 실행 시각을 바로 확인하려면 cron 표현식 검사기를 써보세요 (가입 불필요).
자주 쓰는 표현식 모음 (복붙용)
| 표현식 | 의미 |
|---|---|
| * * * * * | 1분마다 |
| */5 * * * * | 5분마다 |
| */30 * * * * | 30분마다 |
| 0 * * * * | 매시 정각 |
| 0 */2 * * * | 2시간마다 (짝수 시 정각) |
| 0 4 * * * | 매일 새벽 4시 |
| 30 23 * * * | 매일 밤 11시 30분 |
| 0 9 * * 1-5 | 평일(월~금) 오전 9시 |
| 0 10 * * 6,0 | 주말(토·일) 오전 10시 |
| 0 0 * * 1 | 매주 월요일 자정 |
| 0 6 1 * * | 매월 1일 오전 6시 |
| 0 0 1 1 * | 매년 1월 1일 자정 |
| 0 3 * * 0 | 매주 일요일 새벽 3시 |
| 0 8-18 * * * | 매일 8시~18시 사이 매시 정각 |
| */10 9-18 * * 1-5 | 평일 근무시간(9~18시)에 10분마다 |
함정 1 — 요일 0도 일요일, 7도 일요일
요일 필드는 0~7인데 0과 7 둘 다 일요일입니다. 월요일이 1이에요. “일요일=1”로 착각하면 매주 월요일에 도는 배치가 됩니다.
함정 2 — “일”과 “요일”을 같이 쓰면 OR
0 4 13 * 5는 “13일이면서 금요일”이 아니라 “13일 또는금요일”에 돕니다. 표준 cron의 오래된 명세라 대부분의 구현이 이렇습니다. 둘 다 만족할 때만 돌리려면 스크립트 안에서 날짜를 한 번 더 검사하세요.
함정 3 — */N은 “N분마다”가 아니라 “N으로 나눠떨어질 때”
*/15는 0·15·30·45분에 돕니다 — 등록한 시점부터 15분 간격이 아니에요. 그리고 */7처럼 60이 안 나눠지는 값은 0·7·14…56분에 돌고 다음 시 0분으로 점프해서 간격이 들쭉날쭉해집니다.
함정 4 — 그 표현식, 서버 시간대 기준입니다
클라우드 서버는 대부분 UTC라서 0 4 * * *가 한국 오후 1시에 돕니다. 자세한 확인·해결법은 crontab이 안 돌아갈 때 체크리스트 8번 항목을 보세요.
보너스 — Spring의 cron은 필드가 6개
Spring @Scheduled(cron = "0 0 4 * * *")는 맨 앞에 초 필드가 하나 더 있습니다. crontab 표현식을 그대로 붙여넣으면 의미가 한 칸씩 밀려요. Spring Batch 감시는 전용 가이드에 정리해뒀습니다.
표현식은 맞게 썼는데, 정말 그 시각에 돌고 있을까?
cron 표현식이 맞아도 서버 재부팅·권한 변경·시간대 문제로 조용히 안 도는 날이 옵니다. BatchWatch에 같은 표현식으로 모니터를 만들어두면, 예정 시각에 성공 신호가 안 올 때 디스코드·슬랙·텔레그램으로 알림이 갑니다. cron을 모르는 팀원을 위한 “매일 오전 4시” 같은 쉬운 입력도 지원해요.