본문 바로가기
개발/기타

Cron 표현식 완벽 가이드

by xwing 2025. 5. 26.

Cron 표현식 완벽 가이드: 작업 스케줄링의 핵심 이해하기

서버 관리나 자동화 작업을 다루다 보면 반드시 마주치게 되는 것이 바로 Cron 표현식입니다. 복잡해 보이는 이 문자열들이 실제로는 매우 체계적이고 강력한 스케줄링 도구라는 것을 알게 되면, 자동화의 새로운 가능성이 열립니다.

Cron 표현식이란?

Cron 표현식은 Unix 계열 시스템에서 작업을 주기적으로 실행하기 위해 사용하는 시간 설정 형식입니다. 현재는 Linux, macOS뿐만 아니라 Spring Framework, Kubernetes, GitHub Actions 등 다양한 플랫폼에서 널리 사용되고 있습니다.

기본 구조 이해하기

표준 Cron 표현식 (5개 필드)

* * * * *
│ │ │ │ │
│ │ │ │ └─── 요일 (0-6, 일요일=0)
│ │ │ └───── 월 (1-12)
│ │ └─────── 일 (1-31)
│ └───────── 시 (0-23)
└─────────── 분 (0-59)

확장 Cron 표현식 (6개 필드)

일부 시스템에서는 초 단위까지 지원합니다:

* * * * * *
│ │ │ │ │ │
│ │ │ │ │ └─── 요일 (0-6)
│ │ │ │ └───── 월 (1-12)
│ │ │ └─────── 일 (1-31)
│ │ └───────── 시 (0-23)
│ └─────────── 분 (0-59)
└───────────── 초 (0-59)

특수 문자와 의미

기본 특수문자

별표 (*)

  • 의미: 모든 값
  • 예시: * * * * * → 매 분마다 실행

콤마 (,)

  • 의미: 여러 값 지정
  • 예시: 0 9,17 * * * → 오전 9시, 오후 5시에 실행

하이픈 (-)

  • 의미: 범위 지정
  • 예시: 0 9-17 * * * → 오전 9시부터 오후 5시까지 매시간 실행

슬래시 (/)

  • 의미: 간격 지정
  • 예시: */15 * * * * → 15분마다 실행

물음표 (?)

  • 의미: 특정 값 없음 (일/요일 필드에서만 사용)
  • 사용 이유: 일과 요일을 동시에 지정할 수 없기 때문

해시 (#)

  • 의미: n번째 요일 (예: 2#1 = 첫 번째 월요일)

L

  • 의미: 마지막 (Last)
  • 예시: 0 0 L * * → 매월 마지막 날

W

  • 의미: 가장 가까운 평일 (Weekday)

실무에서 자주 사용하는 예제

일반적인 스케줄링 패턴

매일 자정 실행

0 0 * * *

매주 월요일 오전 9시 실행

0 9 * * 1

매월 1일 자정 실행

0 0 1 * *

매년 1월 1일 자정 실행

0 0 1 1 *

평일 오전 9시부터 오후 6시까지 매시간 실행

0 9-18 * * 1-5

30분마다 실행

*/30 * * * *
또는
0,30 * * * *

복잡한 스케줄링 예제

매주 월, 수, 금 오후 2시 30분 실행

30 14 * * 1,3,5

매월 첫 번째와 세 번째 월요일 오전 10시 실행

0 10 * * 1#1,1#3

매월 마지막 날 밤 11시 59분 실행

59 23 L * *

분기별 첫날 오전 6시 실행 (1, 4, 7, 10월)

0 6 1 1,4,7,10 *

평일 중 15일에 가장 가까운 날 실행

0 9 15W * *

매주 토요일과 일요일 제외 매 3시간마다 실행

0 */3 * * 1-5

플랫폼별 차이점

Linux Crontab

  • 5개 필드 사용
  • 사용자별 crontab 설정 가능
  • 시스템 전체 crontab도 지원

Spring Framework

@Scheduled(cron = "0 0 9 * * MON-FRI")
public void weekdayMorningTask() {
    // 평일 오전 9시 실행
}

Kubernetes CronJob

apiVersion: batch/v1
kind: CronJob
metadata:
  name: backup-job
spec:
  schedule: "0 2 * * *"  # 매일 오전 2시
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: backup
            image: backup-image

AWS CloudWatch Events

{
  "ScheduleExpression": "cron(0 9 ? * MON-FRI *)"
}

실수하기 쉬운 부분들

일(Day)과 요일(Day of Week) 동시 사용

잘못된 예:

0 9 15 * 1  # 15일이면서 동시에 월요일?

올바른 예:

0 9 15 * ?  # 매월 15일
0 9 ? * 1   # 매주 월요일

월 표기 실수

  • 월은 1-12 (1월=1, 12월=12)
  • 요일은 0-6 (일요일=0, 토요일=6) 또는 1-7 시스템도 있음

범위와 간격 혼동

0-30 * * * *  # 0분부터 30분까지 매분 (31번 실행)
*/30 * * * *  # 30분마다 (2번 실행)

디버깅과 테스트 팁

온라인 도구 활용

로그 확인

# Linux에서 cron 로그 확인
tail -f /var/log/cron
grep CRON /var/log/syslog

단계적 테스트

복잡한 표현식은 단순한 것부터 시작해서 점진적으로 복잡하게 만들어 테스트하는 것이 안전합니다.

모범 사례

성능 고려사항

  • 동시에 많은 작업이 실행되지 않도록 시간을 분산
  • 시스템 리소스가 여유로운 시간대 활용
  • 백업이나 배치 작업은 새벽 시간대 활용

모니터링과 알림

  • 중요한 작업의 경우 실행 결과를 모니터링
  • 실패 시 알림 시스템 구축
  • 로그 보관 및 분석 체계 구축

문서화

# 매일 오전 2시 데이터베이스 백업
0 2 * * * /scripts/db_backup.sh

# 매주 일요일 오전 3시 로그 정리
0 3 * * 0 /scripts/cleanup_logs.sh

# 매월 첫째 날 오전 4시 리포트 생성
0 4 1 * * /scripts/monthly_report.sh

결론

Cron 표현식을 마스터하면 시스템 자동화의 핵심 도구를 손에 쥐게 됩니다. 처음에는 복잡해 보일 수 있지만, 기본 패턴을 이해하고 실제 사례를 통해 연습하면 자연스럽게 익힐 수 있습니다.

무엇보다 중요한 것은 안전하게 테스트하고, 적절히 모니터링하며, 명확히 문서화하는 것입니다. 이러한 기본기를 바탕으로 효율적인 자동화 시스템을 구축해보세요.


더 복잡한 스케줄링 요구사항이 있다면 각 플랫폼의 공식 문서를 참고하거나, Quartz Scheduler 같은 전문 라이브러리 활용을 고려해보세요.