Cron 표현식 해석기

"0 9 * * 1-5" 같은 크론 표현식이 정확히 언제 실행되는지 미리 확인해보세요.

Cron 표현식의 5개 필드와 6필드 형식

표준 Cron 표현식은 왼쪽부터 분, 시, 일, 월, 요일 순서로 5개 필드를 공백으로 구분해 씁니다. 각 필드에서는 네 가지 기호를 조합합니다.

위치필드허용 값비고
1 (6필드일 때만)초0-596필드 형식에서 맨 앞에 붙는 구현이 많음 (Quartz, Spring, node-cron 등)
1분0-595필드 표준의 첫 번째 필드
2시0-2324시간제
3일1-31없는 날짜(2월 30일 등)는 실행되지 않음
4월1-12 또는 JAN-DEC이름은 대소문자 구분 없음(이 도구 기준)
5요일0-7 또는 SUN-SAT0과 7이 모두 일요일 (Vixie cron 계열)

Linux의 crontab과 대부분의 CI 도구는 5필드를 쓰지만, Quartz·Spring·node-cron처럼 초 단위 작업이 필요한 라이브러리는 맨 앞에 초 필드를 추가한 6필드를 씁니다. 같은 문자열 0 9 * * 1-5(5필드)와 0 0 9 * * 1-5(6필드)는 모두 "평일 9시 정각"을 뜻하지만, 필드 수를 헷갈려 5필드 식을 6필드 도구에 넣으면 각 값이 한 칸씩 밀려 전혀 다른 시각이 됩니다. 이 도구는 필드가 5개면 5필드, 6개면 6필드(초 시작)로 자동 판별합니다.

구현체마다 다른 점

Cron은 하나의 표준 문서가 아니라 여러 구현의 관습입니다. 아래는 널리 알려진 사양을 정리한 것이며, 버전에 따라 달라질 수 있으니 실제 사용하는 도구의 공식 문서를 최종 확인하세요.

구현필드 수요일 값그 외 특징
Linux crontab (Vixie/cronie 계열)50-7, 0과 7 모두 일요일@daily 등 매크로, 일·요일 둘 다 지정하면 OR
GitHub Actions schedule50-6 (POSIX)UTC 기준, 최소 간격 5분, 부하 시 지연될 수 있음
Kubernetes CronJob50-6기본은 컨트롤러 시간대, timeZone 필드로 지정 가능(버전 확인)
Quartz6~7 (초 시작, 선택 년)1-7, 1이 일요일일·요일 중 하나는 반드시 ?, L·W·# 지원
Spring @Scheduled6 (초 시작)0-7 또는 이름, 0·7이 일요일?, L, W, # 지원, 일·요일 동시 지정 시 해석이 Vixie와 다를 수 있음
AWS EventBridge 규칙6 (분 시 일 월 요일 년)1-7, 1이 일요일일·요일 중 하나는 반드시 ?
node-cron5 또는 6 (초는 선택, 맨 앞)0-7초 필드를 생략하면 5필드로 동작

가장 흔한 사고는 요일 번호입니다. Vixie 계열에서 일요일은 0(또는 7)이고 수요일은 3이지만, Quartz와 AWS EventBridge는 1이 일요일이라 수요일이 4입니다. 숫자 대신 MON-FRI 같은 이름을 쓰면 이 차이를 피할 수 있습니다. 이 도구는 Vixie 계열(0과 7이 일요일) 기준으로 해석하며 Quartz 전용 기호 ?, L, W, #를 만나면 지원하지 않는다고 알려 줍니다.

일(day)과 요일(weekday)이 동시에 지정되면?

Vixie 계열 cron과 POSIX 규칙에서는 일 필드와 요일 필드가 둘 다 제한된 값(맨 앞이 *가 아닌 값)이면, 둘 중 하나라도 만족하는 날 실행됩니다(OR). 한쪽이 *로 시작하면 다른 쪽 조건만 적용됩니다. 그래서 "매월 첫째 일요일"은 0 0 1-7 * 0으로 쓸 수 없습니다. 이 식은 1~7일이거나 일요일인 날(매주 일요일 + 매월 1~7일) 모두에서 실행됩니다. 첫째 일요일만 원하면 크론 식은 매주 일요일로 두고 스크립트 안에서 날짜가 7 이하인지 검사하는 방식이 흔합니다.

참고로 이 도구는 Vixie 방식대로 필드가 *로 시작하는지로 제한 여부를 판단합니다. 그래서 */2처럼 별표로 시작하는 일 필드는 "제한 없음"으로 취급되어 요일 조건과 OR가 아닌 AND로 결합됩니다. Quartz처럼 둘을 동시에 지정할 수 없게 하거나 Spring처럼 다르게 처리하는 구현도 있으므로, 같은 식이라도 도구에 따라 결과가 달라질 수 있습니다.

간격(/)의 함정

*/n은 "n 간격으로 반복"이 아니라 "범위의 시작값부터 n씩 더한 값들만 허용"입니다. 범위가 n의 배수로 끝나지 않으면 마지막 간격이 짧아집니다.

시작점이 있는 5/15(5부터 15 간격) 같은 표기는 구현마다 허용 여부가 갈립니다. 이 도구는 5-59/15와 같게 5, 20, 35, 50으로 해석하지만, 이식성을 위해서는 범위를 명시한 5-59/15를 쓰는 편이 안전합니다.

시간대와 서머타임

Cron의 시각은 실행 환경의 시간대로 해석됩니다. 서버가 UTC라면 한국 시간(UTC+9) 오전 9시에 돌리려면 0 0 * * *이어야 합니다(UTC 0시 = KST 9시). GitHub Actions의 schedule은 UTC 기준이므로 한국 시간 오전 9시는 0 0 * * *입니다. 위 도구에서 시간대를 UTC로 바꾸면 UTC 기준 다음 실행 시각을 확인할 수 있습니다. 한국에는 서머타임이 없지만 서머타임이 있는 지역의 시간대를 쓰는 서버에서는 해당 시각이 건너뛰어지거나 두 번 나타날 수 있고, 처리 방식은 구현마다 다릅니다. 이 도구는 현지 시간 모드에서 존재하지 않는 시각(시간이 앞당겨져 사라진 구간)은 건너뜁니다.

검산 예시

예시 1 (OR 규칙): 0 0 1 * 0을 2026년 10월에 적용하면 10월 1일(목요일)과 일요일인 4일, 11일, 18일, 25일, 총 5번 실행됩니다. "매월 1일이면서 일요일"이라는 AND로 오해하면 10월에는 한 번도 실행되지 않는다고 생각하게 됩니다.

예시 2 (실행 횟수): */15 9-17 * * 1-5는 하루에 시 9~17(9개) × 분 0·15·30·45(4개) = 36번, 평일 5일 동안 180번 실행됩니다. 마지막 실행은 17:45이며 18:00에는 실행되지 않습니다.

예시 3 (존재하지 않는 날짜): 0 0 31 * *은 31일이 있는 달에만 실행되어 1년에 7번입니다. 0 0 30 2 *은 2월 30일이 없으므로 영원히 실행되지 않으며, 이 도구는 이런 식을 만나면 해당 사실을 알려 줍니다.

실무에서 자주 하는 실수

이 도구가 하지 않는 것

표현식에 쓸 정규식을 점검하려면 정규식 테스터를, 실행 시각을 숫자 타임스탬프로 다룰 때는 Unix 타임스탬프 변환기를, 작업 ID로 쓸 고유 값이 필요하면 UUID 생성기를, 스케줄러가 호출하는 API 토큰의 만료를 확인하려면 JWT 디코더를 함께 활용해 보세요. 작업 결과 JSON 로그를 정리할 때는 JSON 포맷터가 편리합니다.

자주 묻는 질문

초(seconds) 필드도 지원하나요?

네. 필드를 6개 입력하면 맨 앞을 초로 해석합니다(Quartz, Spring, node-cron 관례). Linux crontab과 GitHub Actions는 초를 지원하지 않는 5필드 형식입니다.

다음 실행 시각은 어떤 시간 기준인가요?

기본은 이 도구를 실행하는 브라우저의 현재 시각과 시간대입니다. 시간대 선택 항목에서 UTC로 바꾸면 UTC 기준으로 계산합니다. 실제 서버의 시간대가 다르다면 해당 서버/서비스의 설정을 함께 확인해야 합니다.

요일에서 0과 7은 어떻게 다른가요?

Vixie 계열 cron에서는 둘 다 일요일입니다. 이 도구도 7을 일요일로 처리합니다. 다만 POSIX 표준 자체는 0-6만 정의하고, Quartz·AWS는 1이 일요일이라 숫자 의미가 다릅니다. 이름(SUN-SAT)을 쓰면 안전합니다.

"0 0 13 * 5"는 13일의 금요일인가요?

아닙니다. 일과 요일이 둘 다 지정되면 OR이므로 "매월 13일 또는 매주 금요일"에 실행됩니다. 13일의 금요일만 원하려면 금요일에 실행하고 스크립트에서 날짜가 13일인지 검사해야 합니다.

입력한 표현식이 서버로 전송되나요?

아니요. 모든 해석과 계산은 브라우저 안에서만 처리됩니다.

"실행 시각이 없습니다"라는 메시지는 무엇인가요?

이 도구는 오늘부터 약 9년 범위(윤년 주기 포함)를 탐색합니다. 그 안에서도 실행 시각이 없으면 2월 30일, 4월 31일처럼 달력에 존재하지 않는 일·월 조합일 가능성이 높습니다.