리눅스 Crontab부터 Spring/Quartz까지 완벽하게 정복하는 CRON 문법 가이드
CRON은 유닉스/리눅스 계열 운영체제 및 엔터프라이즈 백엔드 시스템에서 주기적인 배치 작업, 데이터베이스 백업, 이메일 발송, API 폴링 등을 자동화하기 위해 널리 사용되는 시간 기반 작업 스케줄러 표준입니다.
CRON 표현식은 각 필드가 공백으로 구분된 문자열로 구성되며, 초/분/시/일/월/요일 단위의 실행 주기를 극도로 간결하게 표현할 수 있는 강력한 문법 구조를 갖추고 있습니다.
본 도구는 5필드 표준 리눅스 Crontab과 6필드 Quartz/Spring 스케줄러를 완벽하게 지원하여, 복잡한 반복 주기를 시각적으로 구성하고 휴먼 에러를 방지할 수 있도록 돕습니다.
5필드 & 6필드 완벽 지원
리눅스 Crontab 5필드와 초 단위 제어가 필요한 Spring Boot / Quartz 6필드를 자유롭게 전환할 수 있습니다.
자연어 해석 & 다음 실행 일시 계산
작성된 표현식이 실제 언제 실행되는지 사람이 읽기 쉬운 문장과 직관적인 타임라인으로 검증합니다.
다양한 실무 템플릿 원클릭 적용
매 5분, 매일 자정, 평일 업무 시간 등 실무에서 가장 자주 사용되는 패턴을 즉시 로드할 수 있습니다.
1. CRON 표현식 필드 구성 및 규격 비교 (Linux vs Quartz)
리눅스 표준 Crontab은 분(Minute)부터 시작하는 5개 필드를 사용하며, Spring 프레임워크나 Quartz 스케줄러는 초(Second) 단위 제어가 가능한 6개 또는 7개(연도 포함) 필드를 지원합니다.
각 필드의 허용 범위와 배치 순서는 아래 표와 같습니다.
| 필드 순서 | 필드명 | 허용 범위 (Range) | 허용 특수 문자 | 지원 표준 |
|---|---|---|---|---|
| 1번째 (선택) | 초 (Seconds) | 0 - 59 | * , - / | Quartz / Spring (6필드) |
| 1 또는 2번째 | 분 (Minutes) | 0 - 59 | * , - / | 모든 표준 공통 |
| 2 또는 3번째 | 시 (Hours) | 0 - 23 | * , - / | 모든 표준 공통 |
| 3 또는 4번째 | 일 (Day of Month) | 1 - 31 | * , - / ? L W | 모든 표준 공통 |
| 4 또는 5번째 | 월 (Month) | 1 - 12 (JAN - DEC) | * , - / | 모든 표준 공통 |
| 5 또는 6번째 | 요일 (Day of Week) | 0 - 7 (SUN - SAT) | * , - / ? L # | 0과 7은 일요일 |
2. CRON 핵심 특수 문자 문법 및 사용 예제
CRON 문법의 유연성은 특수 문자의 조합에서 나옵니다. 대표적인 특수 문자의 동작 방식은 다음과 같습니다.
• 애스터리스크 (`*`): 해당 필드의 모든 유효 값을 의미합니다. 예를 들어 시(Hour) 필드에 `*`가 들어가면 매 시간마다 실행됩니다.
• 콤마 (`,`): 여러 개의 특정 값을 열거할 때 사용합니다. 예를 들어 `1,15,30`은 1분, 15분, 30분에 각각 실행됩니다.
• 하이픈 (`-`): 연속된 값의 범위를 지정합니다. `9-18`은 오전 9시부터 오후 6시까지 매 시간마다 실행됩니다.
• 슬래시 (`/`): 시작 값과 증가 간격(Step)을 정의합니다. `*/5`는 0분부터 시작하여 5분마다 실행(`0, 5, 10, 15...`)됨을 뜻합니다.
• 물음표 (`?`): 일(Day of Month)과 요일(Day of Week) 중 한쪽에만 조건을 걸고 다른 쪽은 무시할 때 Quartz에서 사용합니다.
3. 주요 프로그래밍 언어 및 프레임워크별 CRON 스케줄러 구현 예제
Node.js, Python, Java(Spring Boot), Go 언어에서 CRON 표현식을 기반으로 자동화 작업을 등록하는 실무 코드 예제입니다.
| 1 | const cron = require('node-cron'); |
| 2 | |
| 3 | // 매 5분마다 실행 (0분, 5분, 10분 ...) |
| 4 | cron.schedule('*/5 * * * *', () => { |
| 5 | console.log('5분마다 배치 작업 실행: ' + new Date().toISOString()); |
| 6 | }); |
| 7 | |
| 8 | // 매주 월요일 오전 9시 정각에 주간 리포트 발송 |
| 9 | cron.schedule('0 9 * * 1', () => { |
| 10 | console.log('주간 리포트 이메일 발송 완료'); |
| 11 | }); |
| 1 | from apscheduler.schedulers.blocking import BlockingScheduler |
| 2 | from apscheduler.triggers.cron import CronTrigger |
| 3 | |
| 4 | scheduler = BlockingScheduler() |
| 5 | |
| 6 | # 매일 자정 00:00 데이터베이스 백업 |
| 7 | @scheduler.scheduled_job(CronTrigger.from_crontab('0 0 * * *')) |
| 8 | def daily_backup(): |
| 9 | print("일일 데이터베이스 백업 수행") |
| 10 | |
| 11 | # 평일(월~금) 오전 9시 알림 발송 |
| 12 | @scheduler.scheduled_job(CronTrigger.from_crontab('0 9 * * 1-5')) |
| 13 | def weekday_alert(): |
| 14 | print("업무 시작 알림 발송") |
| 15 | |
| 16 | scheduler.start() |
| 1 | import org.springframework.scheduling.annotation.Scheduled; |
| 2 | import org.springframework.stereotype.Component; |
| 3 | |
| 4 | @Component |
| 5 | public class ScheduledTasks { |
| 6 | |
| 7 | // Spring은 6필드 (초 분 시 일 월 요일) 형식을 사용합니다. |
| 8 | // 매시 정각 0초에 실행 |
| 9 | @Scheduled(cron = "0 0 * * * *") |
| 10 | public void hourlyCleanup() { |
| 11 | System.out.println("매 시간 캐시 정리 작업 수행"); |
| 12 | } |
| 13 | |
| 14 | // 매월 1일 오전 4시 30분 0초에 실행 |
| 15 | @Scheduled(cron = "0 30 4 1 * *") |
| 16 | public void monthlySettlement() { |
| 17 | System.out.println("월간 정산 배치 처리 완료"); |
| 18 | } |
| 19 | } |
| 1 | # 현재 사용자의 crontab 편집 |
| 2 | crontab -e |
| 3 | |
| 4 | # [예제 1] 10분마다 파이썬 스크립트 실행 및 로그 저장 |
| 5 | */10 * * * * /usr/bin/python3 /opt/scripts/collector.py >> /var/log/collector.log 2>&1 |
| 6 | |
| 7 | # [예제 2] 매주 일요일 새벽 3시 시스템 로그 백업 |
| 8 | 0 3 * * 0 /opt/scripts/backup.sh |
| 9 | |
| 10 | # crontab 등록 내용 조회 |
| 11 | crontab -l |
자주 묻는 질문 (FAQ)
Q.리눅스 Crontab 5필드와 Spring/Quartz 6필드의 가장 큰 차이점은 무엇인가요?
리눅스 표준 Crontab은 [분 시 일 월 요일]의 5개 필드로 구성되어 최소 단위가 1분입니다. 반면 Spring Boot와 Quartz는 맨 앞에 [초] 필드가 추가된 [초 분 시 일 월 요일] 6개 필드를 사용하여 초 단위의 정밀한 스케줄링을 지원합니다.
Q.물음표(?) 기호는 언제 사용해야 하나요?
Quartz 및 Spring 스케줄러에서 일(Day of Month)과 요일(Day of Week) 필드 간의 충돌을 방지하기 위해 사용됩니다. 예를 들어 "매월 15일"에 실행하려면 일 필드에 15를 넣고 요일 필드에는 ?를 넣어 요일 조건에 구애받지 않도록 지정합니다.
Q.요일 필드에서 0과 7은 각각 어떤 요일을 뜻하나요?
대부분의 유닉스/리눅스 Crontab 시스템에서 0과 7은 모두 일요일(Sunday)을 가리킵니다. 1은 월요일, 2는 화요일, ..., 6은 토요일입니다.
Q.서버 시간(UTC)과 사용자의 로컬 시간이 다를 때 어떻게 계산되나요?
본 웹 도구의 [실행 예정 일시]는 접속하신 사용자 브라우저의 로컬 타임존(예: KST Asia/Seoul)을 기준으로 계산됩니다. 실제 운영 서버에 Crontab을 등록할 때는 서버의 시스템 타임존(예: UTC) 설정을 반드시 확인하시기 바랍니다.
Q.작성한 CRON 표현식을 검증하기 위해 외부 서버로 데이터가 전송되나요?
Toolbase의 모든 유틸리티와 마찬가지로, CRON 파싱 및 실행 시간 계산은 100% 사용자의 웹 브라우저 로컬 JavaScript 메모리에서 실행되므로 데이터 전송이 일절 발생하지 않습니다.