이 도구는 무엇인가요?
cron 표현식은 `분 시 일 월 요일`이라는 5개 필드로 구성된 간결한 스케줄 문자열로, Unix `cron` 데몬과 이를 본떠 만든 거의 모든 작업 스케줄러(crontab, Kubernetes CronJob, GitHub Actions의 `schedule:`, Airflow, Jenkins)에서 사용됩니다. 각 필드는 별표(`*`, "모든 값"을 의미), 특정 숫자, 쉼표로 구분된 목록(`1,15,30`), 범위(`9-17`), 단계 값(`*/15`, "15단위마다"를 의미), 또는 월과 요일의 경우 숫자 대신 세 글자 이름(`JAN`, `MON`)을 사용할 수 있습니다.
이 문법의 공식 정의는 Linux crontab(5) man 페이지에 있으며, 정확히 동일한 5개 필드, 특수 문자(`* , - /`), 그리고 Vixie cron(대부분의 Linux 배포판에 기본 탑재된 버전)을 포함한 대부분의 cron 구현체가 흔한 스케줄의 별칭으로 지원하는 8개의 `@` 약어(`@reboot`, `@yearly`/`@annually`, `@monthly`, `@weekly`, `@daily`/`@midnight`, `@hourly`)를 문서화하고 있습니다.
이 도구는 정확히 그 표준 5필드 형식을 구현합니다. 이는 Linux나 macOS 서버에서 `crontab -e`에 직접 입력하거나, Kubernetes CronJob의 `schedule:` 필드에 입력하는 형식입니다. Java의 Quartz Scheduler와 일부 벤더 도구에서 사용되는 다른 6~7필드 형식인 Quartz cron 문법은 지원하지 않습니다(어느 쪽이 필요한지는 아래 비교 섹션을 참고하세요).
왜 사용해야 할까요?
- 새로 합류한 팀에서 전임자가 남긴 데이터베이스 백업 cron 작업을 유지보수하게 됐는데 `0 2 */3 * *`라고만 적혀 있고 주석이 하나도 없을 때 — 그 문자열을 여기 붙여넣어 손대기 전에 사람이 읽을 수 있는 설명부터 받아보세요.
- 월요일부터 금요일 업무 시간에만 실행되는 스테이징 자동 배포 GitHub Actions 워크플로를 만들어야 하는데 필드 순서 중 어느 게 분이고 어느 게 시인지 매번 헷갈릴 때 — crontab 문서를 다시 찾아보는 대신 여기 드롭다운 빌더로 조합해보세요.
- 운영 서버의 cron 작업이 갑자기 같은 날 두 번씩 실행돼서 일 필드와 요일 필드 조합에 문제가 있는 게 아닌지 의심될 때 — 여기서 다음 5회 실행 시각을 확인해 그 유명한 OR 의미론 함정에 걸린 건지 확인해보세요.
- 클라이언트가 "매주 월요일 오전 8시"에 주간 보고서를 자동 발송해 달라고 요청했고 필드 위치 실수 없이 바로 유효한 cron 표현식이 필요할 때 — 빌더에 그 요구사항을 입력하고 결과를 그대로 서버 crontab에 복사하세요.
- 15분마다 실행되는 정리 작업용 Kubernetes CronJob을 설정하는데 시 필드의 `*/15`가 "15시간마다"를 뜻하는 건 아닌지 헷갈릴 때 — 운영 클러스터에 적용하기 전에 여기서 필드 구성부터 검증해보세요.
- Airflow 작업이 예상한 일정대로 돌지 않아 디버깅 중인데 Quartz cron과 표준 5필드 cron을 혼동한 게 원인이 아닌지 의심될 때 — 여기 비교표를 보고 사용 중인 도구가 실제 스케줄러 유형과 맞는지 확인해보세요.
사용 방법
- 표현식을 변환하려면 입력 필드에 5필드 cron 문자열(또는 `@daily`와 같은 @ 약어)을 입력하거나 붙여넣으세요.
- 그 아래에 표시되는 이해하기 쉬운 설명과 계산된 다음 5회의 실행 시각을 확인하세요. 둘 다 입력하는 대로 실시간으로 업데이트됩니다.
- 대신 스케줄을 만들려면 빌더 섹션을 열고, 다섯 개 필드 각각에 대해 모드(every / every N / 특정 값)를 선택한 다음 "표현식 생성"을 클릭하세요.
- 생성된 표현식은 위쪽 입력 필드에 채워지고 즉시 설명 패널과 다음 실행 시각 패널에 반영됩니다.
- 페이지 하단의 문법 범례를 `*`, `,`, `-`, `/`에 대한 빠른 참조로 활용하세요.
- 복사 버튼으로 최종 표현식을 복사해 crontab, CI 설정, 스케줄러에 붙여넣으세요.
예시
입력
*/15 9-17 * * MON-FRI결과
09:00, 09:15, 09:30, 09:45, 10:00 ... 17:45에, 월요일, 화요일, 수요일, 목요일, 금요일이 표현식은 15분마다 실행되지만, 09:00~17:59 시간대에만, 그리고 평일에만 실행됩니다. 전형적인 "업무 시간" 폴링 스케줄입니다.
표준 cron 대 Quartz cron
"cron 문법"은 하나의 보편적인 표준이 아닙니다. 가장 자주 마주치는 두 형식은 필드 수와 일부 특수 문자의 의미에서 차이가 있습니다. 아래 표를 사용해 사용하려는 스케줄러에 맞는 형식을 확인하세요.
| 항목 | 표준 cron (이 도구) | Quartz cron |
|---|---|---|
| 필드 수 | 5개 (분 시 일 월 요일) | 6개 또는 7개 (초, 그리고 선택적인 연도 추가) |
| 사용처 | Linux/macOS crontab, Kubernetes CronJob, GitHub Actions | Java Quartz Scheduler, 일부 엔터프라이즈 스케줄러 |
| 일과 요일이 둘 다 설정된 경우 | 둘 중 하나라도 일치하면 실행(합집합/OR) | 두 필드 중 하나에 `?`가 필수 — 둘 다 동시에 값을 설정할 수 없음 |
| 추가 특수 문자 | `* , - /` 외에는 없음 | `?`, `L`(마지막 날), `W`(가장 가까운 평일), `#`(해당 월의 n번째 요일) 추가 |
| 초 단위 스케줄링 | 지원하지 않음 | 지원함 (첫 번째 필드) |
관련 도구
설정, 스케줄, 타임스탬프를 다루고 계신가요? 다음 도구들은 cron 생성기와 잘 어울립니다.
개발자가 가장 자주 걸리는 cron 함정
- 일 필드와 요일 필드를 둘 다 채우면 AND로 동작할 거라고 착각하는 경우 — 실제 표준 POSIX cron은 OR 논리를 쓰기 때문에 작업이 예상보다 자주 실행되는 대표적인 버그 원인이 됩니다.
- 일요일이 구현체에 따라 0과 7 둘 다로 표현될 수 있다는 점을 잊는 경우, 다른 개발자가 남긴 오래된 cron 작업을 읽을 때 헷갈리기 쉽습니다.
- cron 표현식이 서버 시간대를 자동으로 맞춰줄 거라고 가정하는 경우 — 실제로 cron은 코드를 작성한 위치의 시간대가 아니라 해당 서버의 로컬 시스템 시각을 기준으로 일정을 실행합니다.
- Stack Overflow 예제를 복사할 때 프로젝트가 실제로 어떤 스케줄러를 쓰는지 확인하지 않고 초 필드와 `?`/`L`/`W` 문자가 있는 Quartz cron 문법을 표준 5필드 cron과 섞어 쓰는 경우.
자주 묻는 질문
cron 표현식이란 무엇인가요?
cron 표현식은 Unix `cron` 데몬 및 호환 스케줄러를 위해 반복 일정을 지정하는 5필드 텍스트 문자열(`분 시 일 월 요일`)입니다. 각 필드는 `*`(모든 값), 숫자, 쉼표로 구분된 목록, 범위(`a-b`), 단계 값(`*/n`)이 될 수 있으며, 월과 요일 필드는 `JAN`이나 `MON` 같은 세 글자 이름도 허용합니다. 전체 명세는 crontab(5) man 페이지에 문서화되어 있습니다.
일과 요일이 둘 다 제한되면 어떻게 되나요?
이는 cron의 잘 알려진 함정입니다. POSIX cron 규칙에 따르면 일 필드와 요일 필드가 둘 다 제한되어 있을 때(`*`가 아닐 때), 두 조건 중 하나만 만족해도 작업이 실행됩니다. 즉 교집합(AND)이 아니라 합집합(OR)입니다. 예를 들어 `0 4 8 * MON`은 매월 8일 오전 4시와 매주 월요일 오전 4시 모두에 실행되며, 8일이 마침 월요일인 경우에만 실행되는 것이 아닙니다. 이 도구는 다음 실행 시각을 계산할 때 정확히 이 합집합 동작을 구현합니다.
표준 cron과 Quartz cron — 어느 쪽이 필요한가요?
이 도구는 Linux/macOS `crontab`, Kubernetes CronJob, GitHub Actions의 `schedule:`, 그리고 대부분의 Unix 계열 작업 실행기에서 사용하는 표준 5필드 POSIX/Vixie cron 문법을 생성합니다. Java의 Quartz Scheduler와 이를 기반으로 만들어진 도구(일부 엔터프라이즈 스케줄러, 오래된 Spring Batch 설정)에서 사용하는 Quartz cron은 앞에 초 필드를 추가하고 일부 특수 문자의 의미를 바꾼 다른 6~7필드 형식입니다(일 필드에서 "특정 값 없음"을 뜻하는 `?`, "마지막 날", "가장 가까운 평일", "해당 월의 n번째 요일"을 뜻하는 `L`/`W`/`#`). 사용하는 스케줄러의 필드 수가 6개 또는 7개이거나, 문서에 `?`, `L`, `W`, `#`이 언급되어 있다면 Quartz 전용 도구가 필요합니다. 이 생성기가 만든 표현식은 그곳에서 올바르게 해석되지 않습니다. 필드가 정확히 5개(또는 `@daily`와 같은 약어)라면 이 도구가 맞습니다.
@yearly, @monthly, @weekly, @daily, @hourly 단축 표현은 무엇을 의미하나요?
이들은 표준은 아니지만 널리 지원되는 약어로, 흔히 쓰이는 5필드 표현식으로 확장됩니다. `@yearly`/`@annually` = `0 0 1 1 *`(매년 1월 1일 자정에 한 번), `@monthly` = `0 0 1 * *`(매월 1일 자정), `@weekly` = `0 0 * * 0`(매주 일요일 자정), `@daily`/`@midnight` = `0 0 * * *`(매일 자정), `@hourly` = `0 * * * *`(매시 정각). 이 도구는 이들을 모두 해석해 확장된 5필드 표현식과 정확히 동일하게 처리합니다.
숫자 대신 요일/월 이름을 사용할 수 있나요?
네. 월 필드는 `JAN`부터 `DEC`까지 세 글자 이름을 허용하고, 요일 필드는 `SUN`부터 `SAT`(대소문자 구분 없음)를 숫자와 바꿔서 사용할 수 있습니다. 요일 숫자는 0~6이며 0은 일요일입니다. 일부 구현체는 일요일을 나타내는 7도 허용하는데, 이 도구는 이를 0으로 정규화합니다. 범위와 목록도 이름으로 사용할 수 있습니다. 예: `MON-FRI` 또는 `JAN,JUN,DEC`.
제 cron 표현식이 서버로 전송되나요?
아니요. 파싱, 이해하기 쉬운 설명, 다음 실행 시각 계산은 모두 브라우저 내 JavaScript에서 로컬로 처리됩니다. 입력하거나 생성한 내용은 기기 밖으로 절대 나가지 않습니다.
이 도구가 제 서버의 시간대를 고려해서 계산하나요?
자동으로는 아닙니다 — cron 자체는 표현식 안에 시간대 정보를 담지 않으며, 실행 시각은 해당 cron 데몬이 돌아가는 시스템의 시간대에 따라 달라집니다. 이 도구는 지금 사용 중인 기기의 현재 시각을 기준으로 다음 5회 실행 시각을 계산하므로, 운영 서버가 UTC를 쓰고 여러분은 한국 표준시(KST)를 쓴다면 실제 일정을 결론짓기 전에 시차를 먼저 계산해야 합니다.
일 필드와 요일 필드를 분명히 맞게 입력했는데 왜 예상과 다른 날짜에 cron 작업이 실행되나요?
일(day-of-month) 필드와 요일(day-of-week) 필드 사이의 OR 의미론 함정에 걸렸을 가능성이 큽니다 — 두 필드 모두 특정 값(즉 `*`가 아닌 값)으로 설정되면, cron은 둘 중 하나만 만족해도 작업을 실행하며 둘 다 만족해야 실행하는 것이 아닙니다. 위쪽 FAQ에서 일/요일 상호작용 항목을 다시 확인하고, 여기서 다음 5회 실행 시각을 검증해 실제 동작을 확인해보세요.
이 도구를 GitHub Actions나 GitLab CI 스케줄을 만드는 데 써도 되나요?
됩니다 — GitHub Actions와 GitLab CI의 `schedule:` 필드는 모두 이 도구가 구현한 것과 정확히 동일한 표준 5필드 POSIX/Vixie cron 문법을 사용하므로, 여기서 만든 표현식을 수정 없이 그대로 워크플로 YAML 파일에 붙여넣을 수 있습니다.
분에 60이나 월에 13처럼 유효 범위를 벗어난 숫자를 잘못 입력하면 어떻게 되나요?
실제 cron 데몬은 구현체에 따라 그런 범위 밖 값을 거부하거나 예상치 못하게 동작할 수 있습니다 — 이 도구는 드롭다운 빌더가 각 필드마다 유효한 값만 선택지로 제시하므로 애초에 범위를 벗어난 숫자가 담긴 표현식을 만들 수 없어서 이런 실수를 사전에 방지해줍니다.