Public Interface가 아닌 것 - DB 구조/Web UI, 그리고 태스크 코드의 DB 직접 접근 금지
Apache Airflow Official Documentation (in-repo snapshot) — Apache Software Foundation public-airflow-interface.rst - "What is not part of the Public Interface" 섹션 (약 533-597행)
이 모듈을 다 읽으면
- 이 문서에 명시되지 않은 것은 모두 비공개로 간주해야 한다는 원칙과, 그 예시(DB 구조, Web UI, 미언급 Python 클래스)를 설명할 수 있다
- 태스크 코드가 Dag 상태/태스크 이력/Dag Run을 조회할 때 메타데이터 DB 대신 사용해야 하는 세 가지 대안을 설명할 수 있다
- Task Context의 get_dr_count, get_dagrun_state, get_task_states 메서드가 어떤 정보를 제공하는지 설명할 수 있다
이 문서에서 명시적으로 언급하지 않은 모든 것은 Public Interface가 아니다. 다른 애플리케이션이라면 하위 호환을 기대할 만한 데이터베이스 구조나 Web UI HTML조차 Airflow에서는 언제든 바뀔 수 있는 내부 구현 세부사항이다. 특히 Dag 작성자가 작성한 코드는 메타데이터 DB에 직접 접근해 Dag 상태·태스크 이력·Dag Run을 조회할 수 없으며, 워커는 오직 Execution API를 통해서만 통신한다 - 대신 Task Context, REST API, Python Client를 사용해야 한다.
명시되지 않은 것은 모두 비공개 - DB 구조와 Web UI
이 문서에서 언급되지 않은 모든 것은 non-Public Interface로 간주해야 한다.
다른 애플리케이션에서는 이런 구성 요소들이 하위 호환성을 유지할 것으로 신뢰될 수 있지만, Airflow에서는 이들이 Public Interface의 일부가 아니며 언제든 바뀔 수 있다.
:doc:`데이터베이스 구조 <database-erd-ref>`는 내부 구현 세부사항으로 간주되며, 그 구조가 하위 호환 방식으로 유지될 것이라고 가정하면 안 된다.
:doc:`Web UI <ui>`는 계속 진화하고 있으며 HTML 요소에 대한 하위 호환성 보장이 없다.
이 문서에 명시적으로 언급된 것을 제외한 Python 클래스들은 내부 구현 세부사항으로 간주되며, 하위 호환 방식으로 유지될 것이라고 가정하면 안 된다.
핵심 포인트
- 이 문서에 언급되지 않은 것은 모두 non-Public Interface다
- 데이터베이스 구조(ERD)는 내부 구현 세부사항이며 하위 호환이 보장되지 않는다
- Web UI는 계속 진화하며 HTML 요소의 하위 호환성이 보장되지 않는다
- 이 문서에 명시되지 않은 Python 클래스는 모두 내부 구현 세부사항으로 취급해야 한다
태스크 코드의 메타데이터 DB 직접 접근 금지와 대안
**Dag 작성자가 작성한 코드에서의 메타데이터 데이터베이스 직접 접근은 더 이상 허용되지 않는다.** Dag 작성자가 작성한 코드는 Dag 상태, 태스크 이력, Dag Run을 조회하기 위해 메타데이터 데이터베이스에 직접 접근할 수 없다 - 워커는 오직 Execution API를 통해서만 통신한다. 대신 다음 대안 중 하나를 사용해야 한다.
**Task Context**: :func:`~airflow.sdk.get_current_context`를 사용해 태스크 인스턴스 정보에 접근하고, :meth:`~airflow.sdk.types.RuntimeTaskInstanceProtocol.get_dr_count`, :meth:`~airflow.sdk.types.RuntimeTaskInstanceProtocol.get_dagrun_state`, :meth:`~airflow.sdk.types.RuntimeTaskInstanceProtocol.get_task_states` 같은 메서드를 사용한다.
**REST API**: Airflow 메타데이터에 프로그래밍적으로 접근하려면 :doc:`Stable REST API <stable-rest-api-ref>`를 사용한다.
**Python Client**: Python 기반 상호작용에는 `Python Client <https://github.com/apache/airflow-client-python>`_ 를 사용한다.
이 변화는 아키텍처적 분리를 개선하고 원격 실행(remote execution) 능력을 가능하게 한다.
예시 코드에서는 ``@task(task_id="check_dagrun_state")``로 정의된 태스크 안에서 ``context = get_current_context()``로 컨텍스트를 얻고, ``ti = context["ti"]``, ``dag_run = context["dag_run"]``을 꺼낸 뒤, 직접 DB 접근 대신 Task Context 메서드를 사용한다: ``dr_count = ti.get_dr_count(dag_id="example_dag")``로 해당 Dag의 Dag Run 개수를 얻고, ``dagrun_state = ti.get_dagrun_state(dag_id="example_dag", run_id=dag_run.run_id)``로 특정 Run의 상태를 얻는다.
핵심 포인트
- Dag 작성자 코드는 메타데이터 DB에 직접 접근해 Dag 상태/태스크 이력/Dag Run을 조회할 수 없다 - 워커는 Execution API로만 통신한다
- 대안은 Task Context(get_current_context + get_dr_count/get_dagrun_state/get_task_states), Stable REST API, Python Client 세 가지다
- get_dr_count는 Dag Run 개수를, get_dagrun_state는 특정 run_id의 상태를, get_task_states는 태스크 상태 정보를 반환한다
- 이 변화의 목적은 아키텍처적 분리 개선과 원격 실행(remote execution) 지원이다