본문 바로가기
Converter

Cron 표현식 해설기

cron 을 한국어로 풀고, 다음 실행 시각을 확인

분 시 일 월 요일 — 5개 필드를 공백으로 구분합니다

평일(월~금), 9시부터 18시까지 15분마다

*/150, 15, 30, 45
9-189, 10, 11, 12, 13, 14, 15, 16 … (10개)
*전체
*전체
요일1-51, 2, 3, 4, 5

다음 실행 시각

KST (UTC+9)

계산 중…

⚠️ 위 시각은 KST 기준입니다. 실제 cron 은 서버의 타임존에서 돕니다 — 서버가 UTC 로 설정돼 있으면(클라우드 기본값인 경우가 많습니다) 9시간 어긋납니다. 배포 전에 서버 TZ를 꼭 확인하세요.

다섯 칸, 왼쪽부터 분·시·일·월·요일

cron 표현식은 공백으로 나뉜 다섯 개의 칸입니다. 각 칸의 위치가 곧 의미라, 값만 봐서는 알 수 없고 몇 번째 칸인지를 봐야 합니다.

┌───────────── 분   (0-59)
│ ┌─────────── 시   (0-23)
│ │ ┌───────── 일   (1-31)
│ │ │ ┌─────── 월   (1-12)
│ │ │ │ ┌───── 요일 (0-7, 0·7=일요일)
│ │ │ │ │
30 9 * * 1     → 매주 월요일 9시 30분

각 칸에는 네 가지 문법을 넣을 수 있고, 이걸 조합합니다.

  • *— 모든 값 (“매”)
  • 5 — 특정 값 하나
  • 1-5 — 범위 (1부터 5까지)
  • */15 — 간격 (0부터 15마다). 1-30/5처럼 범위와 함께 쓰기도 합니다.
  • 1,3,5 — 목록 (쉼표로 나열)

위 변환기는 어느 칸에 무엇을 넣었는지 분해해서 보여 주고, 전체를 한국어 문장으로 풀어 줍니다. 그런데 문법 표만으로는 절대 안 보이는 함정이 두 개 있습니다. cron 사고의 대부분이 이 둘에서 납니다.

함정 1: 일과 요일을 둘 다 쓰면 “또는”이 된다

직관적으로는 0 0 1 * 1을 “매월 1일이면서월요일”로 읽게 됩니다. 그런데 표준 cron(Vixie cron)의 실제 동작은 정반대에 가깝습니다.일과 요일이 둘 다 지정되면, 둘 중 하나만 맞아도 실행됩니다.

0 0 1 * 1   의도: "매월 1일이면서 월요일"?
            실제: "매월 1일" 또는 "매주 월요일"

→ 1일이 무슨 요일이든 실행되고,
  월요일이면 며칠이든 실행된다.

왜 이렇게 설계됐을까요. 초기 cron 설계자는 “매월 15일에도 돌리고, 매주 금요일에도 돌리고 싶다”는 요구를 자연스럽게 담으려 했습니다. 두 필드를 AND 로 묶으면 그런 “둘 다”를 표현할 방법이 없어집니다. 그래서 일과 요일 중 하나라도*가 아니면, 지정된 쪽들을 OR 로 합치는 규칙이 됐습니다. 한쪽만 지정하면(다른 쪽이 *) OR 이 아니라 그냥 그 필드만 봅니다 — 그래서 0 9 * * 1은 문제없이 “매주 월요일”입니다.

결과적으로 “매월 첫째 월요일”처럼 진짜 AND 가 필요한 스케줄은 표준 cron 으로 표현할 수 없습니다. 요일만 1로 지정하고, 실행되는 스크립트 맨 앞에서 “오늘이 7일 이하인가”를 한 번 더 확인하는 식으로 풉니다. 위 변환기는 일과 요일이 둘 다 지정되면 이 OR 규칙을 경고로 띄우고, 다음 실행 시각으로 실제 동작을 눈으로 확인하게 해 줍니다.

함정 2: 타임존 — “테스트는 됐는데 9시간 늦게 돈다”

이게 배포 후 가장 흔히 터지는 문제입니다. cron 은 그 작업이 도는 서버의 타임존을 따릅니다. 그리고 클라우드 서버는 기본이 UTC인 경우가 아주 많습니다. 로컬(KST)에서 0 9 * * *로 “아침 9시”를 의도했는데, 서버가 UTC 라면 그 9시는 UTC 09:00 = KST 18:00, 즉 저녁 6시에 돕니다.

0 9 * * *   서버 TZ = Asia/Seoul → KST 09:00 (의도대로)
0 9 * * *   서버 TZ = UTC        → KST 18:00 (9시간 늦음!)

위 변환기의 다음 실행 시각은 이 사이트의 기준인 KST 로 계산합니다. 그러니 서버가 UTC 라면 표시된 시각에서 9시간을 빼서 생각하거나, 애초에 서버의 TZ 환경변수나 크론탭의 CRON_TZ를 명시적으로 맞춰 두어야 합니다. “로컬에선 맞게 도는데 운영에서만 시간이 틀리다”면 십중팔구 이 차이입니다.

한 가지 다행인 점은 한국은 서머타임(DST)이 없다는 것입니다. KST 는 1988년 이후로 고정 UTC+9라, 봄·가을에 시계가 한 시간 튀는 지역에서 나는 “새벽 2:30 작업이 건너뛰거나 두 번 실행되는” 문제가 없습니다. 이 “KST 는 DST 없는 고정 오프셋”이라는 성질은 타임스탬프 변환기가 시각을 계산하는 방식과도 같은 뿌리입니다 — 타임존 라이브러리 없이 9시간만 더하면 되는 이유입니다.

자주 나오는 표현 몇 가지

*/15 9-18 * * 1-5   평일 9~18시, 15분마다
0 0 * * *           매일 자정
0 9 * * 1           매주 월요일 9시
30 2 1 * *          매월 1일 새벽 2시 30분
0 0 * * 0           매주 일요일 자정
0 */6 * * *         6시간마다 (0·6·12·18시)

*/15를 엉뚱한 칸에 넣는 실수도 흔합니다. “15분마다”를 하려면 분 칸에 넣어야 하는데 시 칸에 넣으면 “15시간마다”가 되고, 게다가 분 칸이 0이 아니면 매시 여러 번 도는 식으로 어긋납니다. 헷갈릴 때는 위 변환기에 붙여넣고 “다음 실행 시각”이 예상과 맞는지 보면 바로 드러납니다.

정리

cron 은 분·시·일·월·요일 다섯 칸이고, 각 칸에 *·숫자·범위 (1-5)·간격(*/n)·목록(1,3,5)을 넣습니다. 문법은 단순하지만 두 가지가 문법 밖에서 사람을 잡습니다 — 일과 요일을 둘 다 쓰면 OR이 되고(AND 가 아니다), 실행 시각은 서버 타임존을 따른다(클라우드 기본은 보통 UTC). 이 도구는 표현식을 한국어로 풀어 주고 다음 실행 시각을 KST 로 보여 주되, 그 시각이 서버에서는 다를 수 있다는 점을 함께 밝힙니다. 애매하면 문장 설명 대신 실제 실행 시각으로 확인하는 게 가장 확실합니다.

자주 묻는 질문

cron 필드 순서가 어떻게 되나요?
표준 cron은 다섯 필드를 공백으로 구분하고, 왼쪽부터 분·시·일·월·요일 순입니다. 예를 들어 '30 9 * * 1'은 분=30, 시=9, 일=매일, 월=매월, 요일=월요일이라 '매주 월요일 9시 30분'입니다. 순서를 외우기 어렵다면 위 변환기가 각 필드를 분해해 무엇이 무엇인지 보여 줍니다.
별표-슬래시-5(매 필드의 /5)는 무슨 뜻인가요?
'몇 개마다'를 뜻하는 간격(step)입니다. 분 필드에 쓰면 0, 5, 10, …처럼 5분마다입니다. 자주 하는 실수는 이걸 엉뚱한 필드에 넣는 것입니다 — '5분마다'를 하려다 시 필드에 넣으면 '5시간마다'가 되고, 분 필드가 비어 매시 정각이 아니라 엉뚱하게 돕니다. 어느 필드에 넣었는지 항상 확인하세요.
일과 요일을 둘 다 지정하면 어떻게 되나요?
표준 cron에서는 둘 중 하나만 맞아도 실행됩니다(AND가 아니라 OR). 예를 들어 '0 0 1 * 1'은 '1일이면서 월요일'이 아니라 '매월 1일 또는 매주 월요일'입니다. 이 동작이 cron에서 가장 자주 사람을 놀라게 합니다. '매월 첫째 월요일'처럼 AND가 필요하면 표준 cron으로는 표현할 수 없고, 스크립트 안에서 날짜를 한 번 더 확인해야 합니다.
요일에서 0과 7이 둘 다 일요일인가요?
네. 요일 필드는 0~6이 일요일~토요일인데, 역사적 이유로 7도 일요일로 받아들입니다. 그래서 일요일은 0으로 쓰든 7로 쓰든 같습니다. 다만 월요일이 1이라는 점 때문에 '주중'을 1-5로 적는 게 자연스럽고, 일요일을 범위 끝에 넣고 싶을 때만 7이 편리합니다.
설정한 시각과 다르게 실행되는데 왜 그런가요?
거의 항상 타임존 문제입니다. cron은 그 작업이 도는 서버의 타임존을 따릅니다. 클라우드 서버는 기본이 UTC인 경우가 많아서, '0 9 * * *'로 오전 9시에 돌게 했는데 KST 기준으로는 오후 6시에 도는 식으로 9시간 어긋납니다. 위 변환기의 다음 실행 시각은 KST 기준이니, 서버가 UTC라면 9시간을 빼서 생각하거나 서버의 TZ 설정을 먼저 확인해야 합니다.
초 단위 스케줄은 안 되나요?
표준 cron(5필드)은 분이 가장 작은 단위라 초 단위는 표현할 수 없습니다. 6필드로 초를 앞에 붙이는 형식은 Quartz나 일부 스케줄러(예: 일부 언어 라이브러리)의 확장이지 표준이 아닙니다. 이 도구는 표준 5필드만 해석하고, 6필드나 L·W·#·? 같은 Quartz 확장 문자를 만나면 추측하지 않고 지원하지 않는다고 알립니다.