이전 글까지 Docker로 환경을 고정하고 Kubernetes로 컨테이너를 운영하는 법을 봤다. 이제 마지막 층, “여러 작업을 언제·어떤 순서로 돌릴지” 를 다룬다. 그 출발점이 되는 개념이 DAG(방향성 비순환 그래프) 다. DAG는 Airflow만의 것이 아니라 작업 흐름을 표현하는 보편적인 도구라, 먼저 개념을 따로 짚고 다음 글에서 Airflow로 들어간다.

작업에는 순서와 의존성이 있다

데이터·ML 파이프라인을 떠올려 보자. 전형적인 흐름은 이렇다.

  1. 데이터를 수집한다(extract).
  2. 데이터를 전처리한다(transform).
  3. 모델을 학습한다(train).
  4. 모델을 평가한다(evaluate).
  5. 결과를 리포트로 보낸다(report).

여기에는 의존성(dependency) 이 있다. 전처리는 수집이 끝나야 시작할 수 있고, 학습은 전처리가 끝나야 한다. 즉 작업들 사이에는 “A가 끝나야 B를 할 수 있다” 는 선후 관계가 존재한다.

게다가 모든 작업이 일렬로 늘어서는 것도 아니다. 예를 들어 전처리가 끝나면 모델 학습데이터 통계 리포트동시에(병렬로) 진행할 수 있다. 작업의 흐름은 단순한 직선이 아니라 갈라지고 합쳐지는 그래프 모양이다. 이 구조를 정확히 표현하는 수학적 도구가 바로 DAG다.

DAG: 방향성 비순환 그래프

DAG(Directed Acyclic Graph, 방향성 비순환 그래프) 는 이름의 세 부분이 그대로 정의다.

  • Graph(그래프): 작업을 노드(node), 작업 간 의존 관계를 엣지(edge, 화살표) 로 표현한다.
  • Directed(방향성): 각 엣지에는 방향이 있다. A → B는 “A 다음에 B”라는 뜻으로, 순서가 정해져 있다.
  • Acyclic(비순환): 화살표를 따라가다 다시 출발점으로 돌아오는 순환(cycle)이 없다. 즉 A → B → C → A 같은 고리가 생기면 안 된다.
            ┌──▶ train ──┐
            │            ▼
extract ─▶ transform   evaluate ─▶ report
            │            ▲
            └──▶ stats ──┘

위 그림에서 extract → transform은 순서(방향)를, transform 뒤에서 trainstats가 갈라지는 것은 병렬을, 둘이 끝나야 evaluate로 합쳐지는 것은 합류를 나타낸다.

왜 “비순환”이 중요한가

순환이 없어야 한다는 조건은 단순한 제약이 아니라 실행 가능성의 핵심이다. 만약 A → B → A 같은 순환이 있다면, “A를 하려면 B가 끝나야 하는데, B를 하려면 다시 A가 끝나야 한다”는 모순에 빠진다. 어느 것도 시작할 수 없다.

반대로 순환이 없으면, 항상 “의존하는 선행 작업이 없는 노드”부터 시작해 차례로 실행할 수 있다. 이렇게 DAG의 노드들을 의존성을 어기지 않는 순서로 일렬 나열하는 것을 위상 정렬(topological sort) 이라 한다. 워크플로 스케줄러가 “다음에 무엇을 실행해도 되는가”를 판단하는 근거가 바로 이것이다. 어떤 작업은 그것이 의존하는 모든 선행 작업이 끝났을 때 비로소 실행 가능해진다.

DAG가 워크플로에 주는 것

작업 흐름을 DAG로 표현하면 여러 이점이 따라온다.

  • 명확한 실행 순서: 무엇이 무엇보다 먼저인지, 무엇이 동시에 가능한지가 그래프에 그대로 드러난다.
  • 병렬화: 서로 의존하지 않는 작업(위의 trainstats)은 동시에 실행해 전체 시간을 줄일 수 있다.
  • 부분 재실행: 중간의 train만 실패했다면, extract·transform을 다시 할 필요 없이 실패한 지점과 그 이후만 다시 돌리면 된다. 의존성 그래프가 있으니 “어디부터 다시 해야 하는지”를 정확히 알 수 있다.
  • 시각화·이해: 복잡한 파이프라인도 그래프로 보면 한눈에 구조가 파악된다.

이런 이유로 DAG는 워크플로를 다루는 여러 도구에서 공통적으로 쓰인다. 다음 글에서 다룰 Airflow가 대표적이고, 그 밖에 Spark의 실행 계획, 빌드 도구(예: Make), 데이터 변환 도구(dbt) 등도 내부적으로 작업을 DAG로 표현한다. “작업들의 의존 관계를 방향성 비순환 그래프로 적고, 그 순서대로 실행한다” 는 발상은 그만큼 보편적이다.

요약

  • 파이프라인의 작업들에는 의존성(A가 끝나야 B)이 있고, 흐름은 직선이 아니라 갈라지고 합쳐지는 그래프 모양이다.
  • DAG는 작업을 노드, 의존 관계를 방향 있는 엣지로 표현한 그래프이며, 순환이 없다(acyclic).
  • 순환이 없기에 위상 정렬로 실행 순서를 정할 수 있다 — 선행 작업이 모두 끝난 노드부터 차례로 실행한다.
  • DAG 표현은 명확한 순서·병렬화·부분 재실행·시각화를 가능하게 하며, Airflow를 비롯한 여러 워크플로 도구의 공통 기반이다.
  • 다음 글에서는 이 DAG를 실제로 정의하고 스케줄링하는 도구 Airflow의 구조를 본다.