cron 표현식 읽는 법 — 5칸 구조와 예시 모음
백업 스크립트, 배치 작업, GitHub Actions 스케줄 — 주기 실행이 필요한 곳엔 어김없이 0 9 * * 1 같은 cron 표현식이 등장합니다. 다섯 칸의 의미만 알면 바로 읽고 쓸 수 있습니다. 구조와 자주 쓰는 예시, 헷갈리는 함정을 정리합니다.
5칸 구조 — 분·시·일·월·요일
cron 표현식은 공백으로 구분된 다섯 칸입니다. 왼쪽부터:
| 칸 | 의미 | 허용 값 |
|---|---|---|
| 1 | 분 | 0 ~ 59 |
| 2 | 시 | 0 ~ 23 |
| 3 | 일(날짜) | 1 ~ 31 |
| 4 | 월 | 1 ~ 12 |
| 5 | 요일 | 0 ~ 6 (0 = 일요일) |
0 9 * * 1 = "분이 0, 시가 9, 날짜·월은 아무 때나, 요일이 월요일" → 매주 월요일 오전 9시.
특수문자 4가지 — * , - /
*— 모든 값: 그 칸은 조건 없음.,— 나열:1,15(일 칸) = 1일과 15일.-— 범위:1-5(요일 칸) = 월~금./— 간격:*/5(분 칸) = 5분마다,*/2(시 칸) = 2시간마다.
자주 쓰는 표현식 모음
| 표현식 | 의미 |
|---|---|
*/5 * * * * | 5분마다 |
0 * * * * | 매시 정각 |
0 9 * * * | 매일 오전 9시 |
30 18 * * 1-5 | 평일(월~금) 오후 6시 30분 |
0 9 * * 1 | 매주 월요일 오전 9시 |
0 0 1 * * | 매월 1일 자정 |
0 3 * * 0 | 매주 일요일 새벽 3시 (백업 단골) |
0 0 1 1 * | 매년 1월 1일 자정 |
헷갈리는 함정 3가지
- 서버 시간대: 많은 서버·CI가 UTC로 돕니다. 한국 시간 오전 9시에 돌리려면
0 0 * * *(UTC 0시 = KST 9시)처럼 9시간을 빼야 합니다. - 요일 숫자: 0이 일요일입니다(7을 일요일로 받는 구현도 있음). "월요일 = 1"만 기억하면 안전합니다.
- 일 + 요일 동시 지정: 표준 cron에서 날짜와 요일을 둘 다 지정하면 OR 조건이 되어, 둘 중 하나만 맞아도 실행됩니다. "매월 1일이 월요일일 때"처럼 AND를 의도했다면 스크립트 안에서 추가로 확인해야 합니다.
실제로 돌려 본 다음 실행 시각
2026년 10월 3일(토) 12:00을 현재 시각으로 두고 cron 표현식 도구가 계산한 다음 실행 시각입니다.
| 표현식 | 다음 실행 | 하루 실행 횟수 |
|---|---|---|
*/5 * * * * | 12:05 · 12:10 · 12:15 | 288회 |
*/7 * * * * | 12:07 · 12:14 · 12:21 | 216회 |
*/40 * * * * | 12:40 · 13:00 · 13:40 | 48회 |
0 */5 * * * | 15:00 · 20:00 · 다음 날 00:00 | 5회 |
0 0 31 * * | 10-31 · 12-31 · 01-31 | 해당 월만 |
0 9 13 * 5 | 10-09(금) · 10-13(화) · 10-16(금) | — |
*/7은 "7분마다"가 아닙니다. 매시 0, 7, 14 … 56분에 돌고 다음 시각의 0분으로 넘어가므로 56분과 0분 사이는 4분입니다. */40은 40분과 20분 간격이 번갈아 나옵니다. 간격을 일정하게 하려면 60이나 24의 약수를 써야 합니다.
31일로 지정하면 31일이 없는 11월을 건너뛰고, 일과 요일을 함께 지정한 0 9 13 * 5는 "13일의 금요일"이 아니라 "매월 13일 또는 매주 금요일"에 실행됩니다. 배포 전에 다음 실행 시각 서너 개를 눈으로 확인하면 이런 착각을 대부분 잡을 수 있습니다.
왼쪽부터 분(0~59), 시(0~23), 일(1~31), 월(1~12), 요일(0~6, 0=일요일) 순서입니다. 예를 들어 0 9 * * 1은 '매주 월요일 오전 9시 0분'을 뜻합니다. *는 '모든 값'이라는 의미로, 그 칸의 조건을 따지지 않겠다는 뜻입니다.
간격(step)을 뜻합니다. 분 칸의 */5는 '5분마다'(0, 5, 10…55분), 시 칸의 */2는 '2시간마다'입니다. 쉼표(,)는 나열(1,15 = 1일과 15일), 하이픈(-)은 범위(1-5 = 월~금)를 의미합니다. 세 가지를 조합하면 대부분의 주기를 표현할 수 있습니다.
먼저 서버의 시간대를 확인하세요. 많은 서버가 UTC로 동작해 한국 시간보다 9시간 늦게 실행된 것처럼 보입니다. 다음으로 요일 숫자(0=일요일)가 의도와 맞는지, 그리고 일(day)과 요일(weekday)을 동시에 지정했는지 확인하세요. 표준 cron에서 둘을 함께 지정하면 둘 중 하나만 맞아도(OR 조건) 실행되어 예상보다 자주 돌 수 있습니다.