크론 표현식과 시간 간격으로 DAG 스케줄 잡기

크론 표현식과 시간 간격으로 DAG 스케줄 잡기

DAG이 언제 실행될지는 schedule 인자 하나로 정해져요. 이 인자에 크론 표현식, datetime.timedelta 객체, 또는 Airflow가 미리 준비한 크론 프리셋 중 하나를 넘기면 되는데요, 셋 다 결국은 같은 길로 들어가요. 스케줄을 어떻게 적느냐에 따라 DAG이 몇 시에, 며칠에 한 번씩 돌지가 갈리니까, 본격적으로 워크플로를 짜기 전에 이 표현 방식들을 정리해 두면 편해요.

출처: Airflow 공식 문서 — Cron & Time Intervals

본문

먼저 schedule에 값을 넣는 세 가지 방법부터 볼게요. 크론 표현식("0 0 * * *")으로 매일 자정처럼 정밀하게 지정하거나, 프리셋("@daily")으로 자주 쓰는 주기를 한 단어로 줄이거나, timedelta로 일정한 간격을 정할 수 있어요.

from airflow.sdk import DAG

import datetime

dag = DAG("regular_interval_cron_example", schedule="0 0 * * *", ...)

dag = DAG("regular_interval_cron_preset_example", schedule="@daily", ...)

dag = DAG("regular_interval_timedelta_example", schedule=datetime.timedelta(days=1), ...)

크론 프리셋 (Cron Presets)

매번 크론 표현식을 외우기보다, 자주 쓰는 주기는 Airflow가 프리셋으로 마련해 두었어요. 아래 표에 정리된 것들이 전부예요.

프리셋 의미 크론 표현식
None 스케줄 없음, 외부 트리거 전용
@once 정확히 한 번만 실행
@continuous 이전 실행이 끝나는 즉시 다시 실행
@hourly 매시 정각에 한 번 0 * * * *
@daily 매일 자정(24:00)에 한 번 0 0 * * *
@weekly 매주 일요일 자정에 한 번 0 0 * * 0
@monthly 매월 1일 자정에 한 번 0 0 1 * *
@quarterly 분기 첫날 자정에 한 번 0 0 1 */3 *
@yearly 매년 1월 1일 자정에 한 번 0 0 1 1 *

프리셋은 시간 간격이나 사용자 정의 timetable이 필요한 복잡한 요구 사항에는 못 미칠 수 있어요. 그럴 땐 직접 커스텀 timetable을 만들어서 쓰면 되는데, Airflow는 크론 문자열을 croniter 라이브러리로 파싱해서 확장 문법까지 지원해요. 예를 들어 매월 첫 월요일 자정에 돌리려면 0 0 * * MON#1처럼 쓸 수 있죠. 크론을 시험해 보려면 Crontab Guru 같은 온라인 에디터를 활용하는 것도 좋아요.

스케줄이 잡히면 DAG은 스케줄마다 인스턴스화되고, 데이터베이스 백엔드에는 그에 대응하는 DAG Run 항목이 하나씩 생겨요.

더 알아보기