현재 언어: 한국어 영어로 보기

Cron 표현식 해설

cron 표현식을 붙여 넣으면 평이한 말로 설명해 드려요. 표준 5필드와 초를 포함한 6필드 cron을 모두 지원합니다.

예시 (클릭해서 시도)

  1. 위 입력창에 cron 표현식을 입력하거나 붙여 넣으세요.
  2. 바로 아래에 표시되는 평이한 언어 설명을 확인하세요.
  3. 예시 칩을 클릭하면 입력창에 들어가고 바로 해석 결과가 표시돼요.
  4. 빨간색 오류가 뜨면 수정해 가며, 의도한 실행 시점과 설명이 맞을 때까지 반복하세요.
어떤 도구인가요?

이 도구는 표준 Unix cron 표현식(5필드)이나 초를 포함한 Quartz 스타일(6필드)을 받아 "At 09:00 AM, Monday through Friday"처럼 사람이 읽기 좋은 설명으로 바꿔 줍니다. 일반 연산자 — *, ",", -, / — 와 이름 형식의 월(JAN-DEC), 요일(SUN-SAT)도 지원해요. 한 글자 입력할 때마다 결과가 갱신되어 빠르게 시험해 볼 수 있어요.

예시

자주 쓰는 업무 시간 작업 예시:

0 9 * * MON-FRI

해석:

오전 09:00, 월요일부터 금요일

초를 포함한 6필드 Quartz 표현식의 예:

0 30 2 ? * MON

해석 (매주 월요일 02:30:00).

cron 포맷

┌───────── 분 (0 - 59)
│ ┌─────── 시 (0 - 23)
│ │ ┌───── 일 (1 - 31)
│ │ │ ┌─── 월 (1 - 12, 또는 JAN-DEC)
│ │ │ │ ┌─ 요일 (0 - 6, 또는 SUN-SAT; 0과 7 모두 일요일)
│ │ │ │ │
* * * * *

cron "0 0 * * *"가 내 로컬 시각이 아니라 UTC 자정에 실행되는 이유는?

실제 cron 버그의 대부분은 다음 몇 가지 함정에서 비롯됩니다:

  • 타임존 드리프트. 0 0 * * *는 스케줄러의 타임존 기준으로 자정에 실행됩니다. Kubernetes CronJob이나 GitHub Actions에서는 기본이 UTC예요 — spec.timeZone을 설정하거나 시각을 UTC로 직접 변환하세요.
  • 5필드 vs 6필드 혼용. 0 0 9 * * MON-FRI(6필드)를 5필드 스케줄러에 붙여 넣으면 앞의 0을 분, 그다음 0을 시로 읽어 버려서 09:00이 아니라 자정에 실행됩니다.
  • 일(day-of-month)과 요일(day-of-week)을 같이 쓰는 경우. 0 0 15 * MON은 매달 15일과 매 월요일에 실행됩니다 — 15일이면서 월요일인 날에만 실행되는 게 아니에요. Vixie-cron의 OR 의미 때문입니다.
  • step은 배포 시각 기준으로 다시 시작하지 않아요. */10 * * * *는 시계 기준 :00, :10, :20, :30, :40, :50에 실행됩니다 — 마지막 배포로부터 10분 뒤가 아니에요.
  • 표준 cron에서 ?를 쓰는 경우. ? 자리 표시자는 Quartz 확장이에요. Unix cron은 이를 거부하니 대신 *를 쓰세요.
  • 요일 0 vs 7. 고전 cron에서는 둘 다 일요일이지만 일부 파서(옛 BSD)는 0만 받습니다. 이식성이 중요하다면 SUN을 쓰세요.

연산자

  • * — 모든 값
  • , — 값 목록 (예: MON,WED,FRI)
  • - — 범위 (예: 1-5)
  • / — step 값 (예: */15 = 15마다)
자주 묻는 질문

5필드 cron과 6필드 cron은 어떻게 다른가요?

표준 POSIX cron은 분, 시, 일, 월, 요일 5필드예요. 6필드 형식은 앞에 초 필드를 더한 것으로 Quartz, Spring @Scheduled, 여러 Node cron 라이브러리에서 사용합니다. 예를 들어 6필드 "0 0 9 * * MON-FRI"는 평일 9:00:00에, 5필드 "0 9 * * MON-FRI"는 평일 9:00에 실행돼요.

L, W, # 같은 Quartz 확장을 지원하나요?

이 해설기는 일반 Unix / Vixie cron 방언에 선택적으로 앞쪽 초 필드를 붙인 형식을 지원해요. Quartz 전용 토큰(마지막을 뜻하는 L, 평일을 뜻하는 W, n번째 요일의 #, 자리 표시자 ?)은 표준 cron에 속하지 않아서 파싱이 보장되지 않습니다. 이들 토큰에 의존한다면 해당 스케줄러의 공식 문서로 표현식을 검증하세요.

0 0 * * *가 왜 생각과 다른 시각에 실행되죠?

cron 표현식 자체에는 타임존이 없어요. 스케줄러를 돌리는 머신이나 컨테이너의 타임존 기준으로 자정에 실행됩니다. Kubernetes CronJob, GitHub Actions, AWS EventBridge는 기본이 UTC예요. 로컬 자정에 실행하고 싶다면 스케줄러의 타임존을 명시적으로 지정하세요(CronJob의 spec.timeZone, TZ 환경 변수, cron.yaml의 timezone 키 등).

일(day-of-month)과 요일(day-of-week)을 같이 지정할 수 있나요?

표준 Vixie cron에서는 일과 요일이 모두 제한되어 있으면 둘 중 하나만 맞아도 실행됩니다 — AND가 아니라 OR예요. 그래서 "0 0 15 * MON"은 매달 15일에도, 매 월요일에도 실행돼요. Quartz는 반대로 둘 중 하나는 반드시 "?"여야 하는 식으로 모호성을 제거합니다.

step 값은 어떻게 동작하나요?

step은 range/step 문법을 써요. "*/15 * * * *"는 :00부터 시작해 15분마다 실행돼요. 분 필드의 "10-50/20"은 :10, :30, :50에 실행됩니다. step은 "지금부터 N분마다"라는 의미가 아니에요 — 경계는 항상 범위의 시작에 맞춰지므로, 현재 시각에 따라 step이 미끄러지는 일은 없어요.

여기서 테스트한 cron 표현식을 저장하나요?

아니요. 입력하신 표현식의 어떤 기록도 남기지 않습니다. 붙여 넣거나 실험한 내용은 페이지를 닫거나 새로고침하면 모두 사라져요 — 로그도, 어떤 스케줄로 작업하는지에 대한 분석도 없습니다. 안심이 필요하시면 브라우저 개발자 도구에서 직접 확인하셔도 돼요.