← 학습 카테고리

Learn

Airflow

151개 모듈 · 현재 53번째

Airflow 모듈 53/151 airflow-learn-53

DAG Result - 결과값을 API로 바로 받기 (실험적 기능, 3.3+)

Apache Airflow Official Documentation (in-repo snapshot) — Apache Software Foundation authoring-and-scheduling/dag-result.rst - DAG Result (전체, versionadded 3.3, 실험적 기능)

이 모듈을 다 읽으면

  • 결과 태스크(result task)를 지정하는 두 가지 방법을 설명할 수 있다
  • /dagRuns/{run_id}/wait API가 결과를 어떻게 반환하는지 설명할 수 있다
  • result 쿼리 파라미터로 기본 동작을 어떻게 재정의하는지 설명할 수 있다

Airflow 3.3부터(실험적 기능) DAG에 결과 태스크(result task)를 지정하면, 해당 태스크의 반환값을 폴링이나 별도 연동 코드 없이 /dags/{dag_id}/dagRuns/{dag_run_id}/wait API로 바로 받을 수 있어, API 엔드포인트나 챗 에이전트, 추론 서비스에 DAG를 임베드하기 쉬워진다.

결과 태스크 지정하는 두 가지 방법

첫 번째 방법은 `@task` 데코레이터 위에 `@result` 데코레이터를 겹쳐 적용하는 것이다. `@result`가 붙은 태스크는 `expand()`나 `expand_kwargs()`로 매핑된 태스크로 확장할 수도 있다.

두 번째 방법은 `@dag` 함수 본문에서 어떤 태스크의 XComArg를 그대로 return하는 것이다. 이 경우 별도의 `@result` 데코레이터 없이도 그 태스크가 자동으로 결과 태스크로 지정된다.

다만 인정되는 반환값은 오직 `@task` 함수 호출의 직접 결과인 순수 XComArg뿐이다. 리터럴 정수나 문자열 같은 일반 파이썬 값을 return해도 Airflow는 이를 조용히 무시하며, 결과 태스크로 지정되지 않는다. 또한 결과로 지정할 수 있는 것은 함수가 실제로 return한 plain `return_value` XCom뿐이며, 다른 키로 push된 XCom이나 `multiple_outputs=True`로 생성된 XCom은 결과 대상에서 제외된다.

핵심 포인트

  • `@result` 데코레이터는 반드시 `@task` 데코레이터 위에 적용해야 하며, expand()/expand_kwargs()로 매핑된 태스크에도 사용할 수 있다
  • `@dag` 함수 본문에서 태스크의 XComArg를 그대로 return하면 별도 데코레이터 없이 그 태스크가 결과 태스크로 지정된다
  • 오직 `@task` 함수 호출 결과인 순수 XComArg만 인정되며, 리터럴 값을 return해도 조용히 무시된다
  • multiple_outputs=True로 생성된 XCom이나 다른 키로 push된 XCom은 결과로 지정할 수 없다 (오직 plain return_value XCom만 가능)

/wait API로 결과 조회하기

`GET /api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/wait` 엔드포인트를 호출하면 DAG 런이 끝날 때까지 블로킹하며 한 번의 요청으로 결과까지 수집할 수 있다. 응답은 NDJSON(줄바꿈으로 구분된 JSON) 스트림이며, 각 줄이 현재 DAG 런 상태를 보고하고 마지막 줄에는 `results` 키로 결과 태스크의 반환값이 태스크 ID를 키로 하여 담긴다.

결과 태스크가 동적으로 매핑된 경우, `results`에 담기는 값은 태스크 ID와 맵 인덱스 순으로 정렬된 리스트가 된다.

핵심 포인트

  • `/wait` 엔드포인트는 DAG 런이 끝날 때까지 블로킹하며 NDJSON(줄바꿈 구분 JSON)으로 상태를 스트리밍한다
  • 마지막 줄에 `results` 키로 결과 태스크의 XCom 값이 태스크 ID를 키로 하여 담긴다
  • 결과 태스크가 동적으로 매핑된 경우 `results`의 값은 맵 인덱스 순으로 정렬된 리스트가 된다

result 쿼리 파라미터로 기본 동작 재정의하기

`result` 쿼리 파라미터를 쓰면 저자가 선언한 결과 태스크와 무관하게 어떤 태스크의 XCom을 수집할지 호출자가 직접 고를 수 있다.

`result` 파라미터를 생략하면 저자가 `@result`나 return으로 지정한 결과 태스크의 XCom을 반환한다. `result=<task_id>`처럼 하나 이상의 태스크 ID를 지정하면, `@result` 마킹 여부와 무관하게 그 태스크들의 XCom을 가져온다. `result=`(빈 문자열)로 지정하면 XCom 수집 자체를 완전히 생략한다.

핵심 포인트

  • `result` 파라미터를 생략하면 저자가 지정한 결과 태스크의 XCom을 반환한다
  • `result=<task_id>`로 지정하면 `@result` 마킹과 무관하게 해당 태스크의 XCom을 가져올 수 있다
  • `result=` (빈 문자열)로 지정하면 XCom 수집을 완전히 생략한다