← 학습 카테고리

Learn

Airflow

151개 모듈 · 현재 147번째

Airflow 모듈 147/151 airflow-learn-147

프로덕션 Dag 설계 원칙 — 멱등성, Atomic Task, 코드 구조

45 Airflow Interview Questions for Data Engineers (2026) — DataCamp/블로그 (2026) Section 3, 5 (pp.7, 10-11) — Idempotency, Atomic Execution, Gold Standard 구조

이 모듈을 다 읽으면

  • 멱등성(idempotency)이 재시도 안전성의 전제 조건인 이유를 설명할 수 있다
  • Atomic Task 원칙이 무엇이고 왜 부분 실패 상황에서 중요한지 설명할 수 있다
  • 비즈니스 로직과 Dag 정의를 분리하는 프로젝트 구조의 이점을 설명할 수 있다

재시도(retry)는 Airflow의 핵심 신뢰성 메커니즘이지만, 태스크가 멱등적이지 않고 원자적이지 않으면 재시도 자체가 새로운 버그의 원인이 된다. 이 모듈은 블로그의 '프로덕션 준비(Production-Ready)' 체크리스트 중, 이미 다른 모듈에서 다루지 않은 설계 원칙(멱등성, Atomic Task, 코드 구조 분리)에 집중한다. 재시도 파라미터 자체나 SLA/타임아웃 설정은 이미 다른 모듈(Retry Policy, Task/Task Instance)에서 다뤘다.

멱등성: 같은 입력, 같은 결과, 부작용 없음

멱등적인 파이프라인이란, 같은 입력 데이터로 같은 Dag Run을 여러 번 실행해도 중복 레코드 같은 부작용 없이 항상 같은 결과를 만들어내는 파이프라인을 말한다. 이것이 중요한 이유는 Airflow의 신뢰성 모델 전체가 '실패하면 재시도한다'는 전제 위에 서 있기 때문이다 — 만약 태스크가 멱등적이지 않다면(예: 매번 실행할 때마다 INSERT로 레코드를 추가하는 방식이라면), 재시도가 일어날 때마다 데이터가 중복된다.

실무에서 멱등성을 확보하는 대표적인 방법은 INSERT 대신 MERGE/UPSERT를 쓰거나, 적재 전 해당 파티션을 통째로 삭제하고 다시 쓰는(overwrite) 방식을 쓰는 것이다. 어떤 방법을 쓰든 핵심은 '몇 번을 실행해도 최종 상태가 같다'는 성질을 코드 수준에서 보장하는 것이다.

핵심 포인트

  • 멱등성은 같은 Dag Run을 여러 번 실행해도 부작용(중복 등) 없이 항상 같은 결과가 나오는 성질이며, Airflow의 재시도 기반 신뢰성 모델 전체가 이 전제 위에 서 있다
  • 실무에서는 단순 INSERT 대신 MERGE/UPSERT나 파티션 단위 overwrite로 멱등성을 구현한다

Atomic Task: 부분 실패가 '반쪽짜리 데이터'를 남기지 않게

Atomic Execution 원칙은 하나의 태스크가 오직 한 가지 일만 하도록 설계하라는 원칙이다. 태스크가 중간에 실패했을 때, 그 태스크가 처음부터 다시 시작할 수 있어야 하며 웨어하우스에 '반쯤 처리된' 데이터를 남겨서는 안 된다. 예를 들어 '추출+정제+적재'를 한 태스크에 몰아넣으면, 적재 단계에서 실패했을 때 이미 정제까지 끝난 중간 산출물을 어디서부터 재실행해야 하는지 모호해진다. 태스크를 추출/정제/적재로 쪼개면 각 단계가 독립적으로 재시도 가능한 단위가 된다.

이 원칙은 앞서 설명한 멱등성과 짝을 이룬다 — 태스크가 원자적이면서 동시에 멱등적이어야, 어느 시점에 실패해도 안전하게 재시도할 수 있다.

핵심 포인트

  • Atomic Task 원칙은 태스크 하나가 한 가지 일만 하도록 설계해, 실패 시 처음부터 재시작해도 '반쪽짜리' 데이터가 남지 않게 하는 것이다
  • 추출/정제/적재처럼 책임을 태스크 단위로 분리하면 각 단계가 독립적으로 재시도 가능해진다

비즈니스 로직과 Dag 정의의 분리

블로그가 'Gold Standard'라 표현한 프로젝트 구조 원칙은, 복잡한 Python 로직을 Dag 파일 안에 직접 쓰지 않고 `plugins/`나 `include/` 같은 별도 폴더에 두고 Dag 파일에서는 그 함수·클래스를 호출만 하라는 것이다. 이렇게 분리하면 두 가지 이점이 생긴다. 첫째, Dag 파일이 짧고 읽기 쉬워져 파싱 성능에도 유리하다(무거운 로직이 top-level에서 실행되지 않도록 구조적으로 강제하기 쉬워진다). 둘째, 비즈니스 로직을 일반 Python 모듈로 분리하면 Airflow 없이도 `pytest`로 단위 테스트를 돌릴 수 있어 테스트 작성이 훨씬 쉬워진다.

핵심 포인트

  • 복잡한 로직은 `plugins/`나 `include/` 폴더의 일반 Python 모듈로 분리하고, Dag 파일에서는 이를 호출만 하는 구조가 권장된다
  • 이 분리는 Dag 파싱 성능에도 유리하고, Airflow 없이 pytest로 로직을 단위 테스트하기 쉽게 만든다