Cron 표현식 생성기
Cron 정기 작업 표현식 시각적 생성 및 파싱 도구
Cron 표현식이란?
Cron 표현식은 정기 작업을 구성하기 위한 문자열로, 6 또는 7개의 필드로 구성되며 각각 초, 분, 시, 일, 월, 주, 년(선택)을 나타냅니다. 각 필드는 특정 문자를 사용하여 시간 규칙을 정의하며, Linux 시스템과 다양한 작업 스케줄링 프레임워크에서 널리 사용됩니다. 여러 사람이 함께 사용할 때는 입력, 전제, 기대 결과를 미리 맞춰 결과가 잘못 해석되지 않도록 해야 합니다.
사용 방법
사용 방법
- 생성 또는 파싱 모드를 선택합니다
- 드롭다운으로 시간 필드(초, 분, 시, 일, 월, 요일)를 설정합니다
- 프리셋을 클릭하면 일반적인 표현을 빠르게 채울 수 있습니다
- 생성 모드에서는 표현식과 다음 5회 실행 시간을 표시합니다
- 파싱 모드에서는 기존 표현식을 검증하고 실행 시간을 표시합니다
구문 기호
- * — 모든 유효한 값
- , — 여러 값을 나열 (예: 1,3,5)
- - — 범위 (예: 1-5)
- / — 단계 간격 (예: */5는 5마다 실행)
- ? — 특정 값 없음 (일 또는 요일 필드용)
- L — 월/주의 마지막 날
- W — 가장 가까운 평일
- # — N번째 요일 (예: 2#3 = 셋째 주 화요일)
개발 참고사항
- 결과를 빠른 참조로 활용한 뒤, 실제 코드나 빌드, API 환경에서 반드시 테스트하세요.
- 버전, 방언, 환경 변수, 프로젝트 규칙 등을 함께 고려하세요.
중요 참고사항
- 일(day)과 요일(weekday) 필드는 동시에 값을 가질 수 없으며, 하나는 ?를 사용해야 합니다
- 각 필드에는 유효 범위가 있습니다: 분 0-59, 시 0-23
- 필드 순서는 고정입니다: 초 분 시 일 월 요일 연도
- 요일은 대소문자를 구분하지 않습니다; MON과 mon은 동일합니다
활용 사례
기술 원리
Cron 표현식은 고정된 순서의 필드에 대해 0개 이상의 시간 일치 제약 조건을 인코딩합니다. 클래식 Vixie/BSD cron(Linux crond에서 사용)은 5개 필드를 사용합니다: 분(0-55), 시(0-23), 일(1-31), 월(1-12 또는 JAN-DEC), 요일(0-6 또는 SUN-SAT, 관례적으로 일요일=0). Spring과 Egistix 라이브러리로 널리 퍼진 Quartz 스케줄러는 선행 초 필드를 추가하여 6필드가 되고, 선택적으로 후행 연도 필드를 추가하여 7필드가 됩니다. 각 필드는 리터럴 값, 목록(1,3,5), 범위(1-5), 단계(0/15는 0부터 15마다), 또는 모든 값과 일치하는 와일드카드 *를 사용할 수 있습니다. 물음표 ?는 Quartz 전용 표식으로 "특정 값 없음"을 의미하며, 다른 하나에 제약이 있을 때 일 또는 요일 위치 중 정확히 하나에만 나타나야 합니다. 다음 N개 실행 시간을 계산하기 위해 탐욕적 순방향 탐색 알고리즘을 사용합니다: 기준 시점(보통 현재)에서 시작하여, 제약과 일치하지 않는 가장 하위 필드를 증가시키고, 모든 하위 필드를 최솟값으로 리셋하며, 필드가 오버플로(예: 분이 59를 넘거나, 시가 23을 넘음)하면 상위 필드로 캐스케이드합니다. 이를 Donovan/Spoonhour 반복 방법이라 하며, K(보통 5)개의 후보와 F개의 필드 수에 대해 O(K x F)로 실행됩니다. 요일 이름(MON, FRI 등)은 소문자로 변환되어 일치시키며, 월 이름 약어도 허용됩니다. Quartz의 L 특수 문자는 해당 월의 마지막 요일 발생으로 해석됩니다(예: 0 0 0 ? * 5L는 마지막 금요일). 월의 마지막 날부터 아래로 세어 요청된 요일을 찾는 방식으로 계산됩니다. W 문자는 주어진 일에 가장 가까운 평일(월~금)을 찾으며, 필요하면 인접한 월로 넘어갑니다. 시간대 처리는 가장 흔한 설정 오류입니다: 표현식 자체에 시간대 메타데이터가 없으므로, 같은 0 0 9 * * ?도 America/New_York, Asia/Tokyo, UTC의 서버에서 각각 다른 UTC 오프셋에 발동합니다. @daily(0 0 0 * * ?), @hourly(0 0 * * * ?), @reboot(데몬 시작 시 1회 실행, 시간 표현식 아님), @weekly(0 0 0 ? * 1) 같은 축약형은 파싱 전에 동등한 6필드 형식으로 확장됩니다. 흔한 함정은 일 + 요일 결합입니다: 클래식 cron에서는 어느 하나가 일치하면 작업이 실행되고(OR 로직), 일부 최신 방언은 AND 로직으로 전환됩니다. 표현식 0 0 0 15 * 5는 Vixie cron에서 "15일 자정 AND 모든 금요일"을 의미하며, 많은 초보자가 생각하는 "15일 자정 OR 금요일"이 아닙니다. Y2038 문제는 cron에 직접 영향을 주지 않지만(time_t 사용), 32비트 Unix crond를 실행하는 임베디드 장치는 2038-01-19T03:14:07Z에 time_t 부호 있는 32비트 정수가 오버플로합니다.
- 클래식 5필드: 분 시 일 월 요일; Quartz는 초(6필드)와 선택적으로 연도(7필드)를 추가합니다.
- ?는 일/요일 중 하나에 값이 있을 때 다른 하나에 위치해야 합니다; *는 해당 필드의 모든 값과 일치합니다.
- 일 + 요일은 Vixie cron에서 OR, 일부 최신 스케줄러에서 AND입니다 - 배포 전에 확인하세요.
- L은 해당 월의 마지막 요일로 해석됩니다: 예) 0 0 0 ? * 5L = 마지막 금요일, 월의 길이에서 계산됩니다.
- W는 주어진 날짜에 가장 가까운 영업일(월~금)을 찾습니다; 인접한 월로 넘어갈 수 있습니다.
- Cron 표현식에는 시간대 메타데이터가 없습니다: 같은 표현식이 스케줄러에 따라 서버 로컬 시간, UTC 또는 명명된 시간대에 발동합니다.
- Y2038: 32비트 time_t는 2038-01-19 03:14:07 UTC에 오버플로합니다; 레거시 임베디드 시스템의 crond에 영향을 미칩니다.
- 축약형 @hourly/@daily/@midnight/@weekly/@monthly/@yearly/@reboot는 동등한 5필드 또는 6필드 표현식으로 확장됩니다.
- 단계 연산자 /는 가장 왼쪽 값부터 카운트합니다: 시 필드의 2/3는 2, 5, 8, 11, 14, 17, 20, 23에 발동합니다.
- 다음 N개 실행 시간을 기준 시점에서 계산하기 위한 O(KxF)의 5회 반복 탐욕적 순방향 탐색입니다.
예시
매일 자정 (일일 백업)
표현식 : 0 0 * * *
의미 : 매일 00:00에 실행
다음 실행 : 2026-06-11 00:00, 2026-06-12 00:00, 2026-06-13 00:00
사용 사례 : 데이터베이스 백업, 일일 리포트 생성15분마다 실행 (헬스 체크)
표현식 : */15 * * * *
의미 : 매시간 0, 15, 30, 45분에 실행
다음 실행 : 14:00, 14:15, 14:30, 14:45, 15:00
사용 사례 : API 헬스 체크, 큐 폴링, 동기화 작업평일 오전 9시 (업무 시간 알림)
표현식 : 0 9 * * 1-5
의미 : 월요일부터 금요일까지 09:00에 실행
다음 실행 : 월 09:00, 화 09:00, 수 09:00, 목 09:00, 금 09:00
사용 사례 : 스탠드업 미팅 알림, Slack 일일 다이제스트매월 1일 03:30 (월간 청구)
표현식 : 30 3 1 * *
의미 : 매월 1일 03:30에 실행
다음 실행 : 7월 1일 03:30, 8월 1일 03:30, 9월 1일 03:30
사용 사례 : 월간 청구서 발행, 로그 로테이션, 아카이브매주 일요일 자정 (주간 정리 작업)
표현식 : 0 0 * * 0
의미 : 매주 일요일 00:00에 실행 (Linux cron에서 0 = 일요일)
다음 실행 : 일 00:00, 일 00:00, 일 00:00
사용 사례 : 주간 리포트 메일 발송, 캐시 삭제, 모델 재학습Quartz (초 단위 포함) - 30초마다 실행
표현식 : */30 * * * * ?
의미 : 30초마다 실행 (6필드 Quartz 문법)
다음 실행 : 14:00:00, 14:00:30, 14:01:00, 14:01:30
참고 : day-of-month가 *이므로 day-of-week는 ?로 지정합니다. 이 형식에는 Linux cron이 아닌 Quartz를 사용하세요.자주 묻는 질문
어떤 cron 형식이 지원되나요?
표준 5필드 cron(분 시 일 월 요일), 6필드(초 포함, Quartz/Spring 및 다양한 클라우드 스케줄러에서 사용), 선택적 연도가 포함된 7필드를 지원합니다. 페이지에서 형식을 선택할 수 있고, 표현식을 만들 때 각 필드의 의미를 설명해 줍니다.
왜 일(dayOfMonth)과 요일(dayOfWeek)이 둘 다 필드에 있나요?
표준 cron은 둘을 OR 조건으로 처리합니다. 즉 '매월 1일이거나 매주 월요일'이면 어느 한 조건만 맞아도 실행됩니다. 두 조건을 AND로 처리하려면 보통 비표준 ?-구문(Quartz) 또는 별도의 우회법이 필요합니다. 페이지에 다음 실행 시간이 표시되니 의도대로 동작하는지 시각적으로 확인하세요.
이 페이지에서 만든 스케줄이 실제로 시스템에서 실행되나요?
아니요. 이 페이지는 표현식을 생성하고 검증할 뿐, 실제 작업은 사용자의 스케줄러(Linux cron, GitHub Actions, Kubernetes CronJob, AWS EventBridge, Quartz 등)에서 실행됩니다. 스케줄러마다 cron 방언이 조금씩 다르므로 대상 환경에 맞는 형식을 선택하세요.
이 스케줄은 어떤 시간대를 사용하나요?
표준 Unix cron은 시스템의 로컬 시간대를 사용합니다. 클라우드 스케줄러는 제각각인데, AWS EventBridge와 GitHub Actions는 기본 UTC, Kubernetes CronJob은 API 서버의 시간대를 사용합니다. 사용 중인 스케줄러의 문서를 확인하고, 서머타임 전환 시 작업이 예상치 못한 시간에 실행될 수 있다는 점도 기억하세요.
'30분마다'는 어떻게 표현하나요?
*/30 * * * * (분 = 0,30; 매 시간, 매일, 매월, 매 요일). '업무 시간에만 15분마다'로 표현하려면 */15 9-17 * * 1-5 (월~금 9~17시로도 제한)을 사용합니다. 페이지에 다음 5~10개의 실행 시간이 표시되니 확인하세요.
실제 운영 환경 스케줄에 사용해도 안전한가요?
이 페이지는 표현식만 생성하며, 실제 작업 실행은 스케줄러의 몫입니다. 먼저 표현식을 샘플 실행으로 테스트하고(대부분의 스케줄러에 '수동 실행' 옵션이 있음), 자정(00:00)에 작업을 예약하는 것은 피하세요. 많은 시스템의 작업이 그 시각에 몰려 부하 스파이크가 발생합니다.
데이터가 서버로 전송되나요?
아니요. 표현식 파싱과 다음 실행 시간 계산은 브라우저에서 JavaScript cron 라이브러리를 사용해 처리됩니다.