간접 선택

간접 선택 (Indirect selection)

간접 선택은 모델이나 다른 리소스를 선택했을 때 어떤 테스트를 실행할지 결정해 줘요. DAG에서 선택한 리소스와 관계를 맺고 있는 테스트(상·하류 모델의 테스트, 여러 모델을 참조하는 테스트 등)에 적용돼요.

출처: 문서

본문

간접 선택은 모델이나 다른 리소스를 선택했을 때 어떤 테스트를 실행할지 결정해 줘요. DAG 안에서 선택한 리소스와 관계를 통해 연결된 테스트, 예를 들어 상위 또는 하위 모델의 테스트, 여러 모델을 참조하는 테스트 등에 적용돼요.

이 동작을 구성하려면 dbt testdbt build에서 --indirect-selection 플래그를 사용해요. CLI 플래그 또는 환경 변수로 설정할 수 있어요. dbt v1에서는 YAML 셀렉터 또는 dbt_project.yml의 flags: 블록에서도 사용자 구성을 설정해서 프로젝트 레벨 플래그를 만들 수 있어요.

간접 선택은 기본적으로 동작해요

--indirect-selection 플래그를 명시하지 않아도 dbt test --select "stg_model_a+" 같은 명령을 실행하면 dbt는 간접 선택을 사용해요. 기본 모드는 eager이며, 선택한 모델을 참조하는 모든 테스트를 실행해요. 예를 들어 dbt test --select model_b는 model_b에 정의된 테스트뿐 아니라, model_b를 참조한다면 업스트림 모델에 정의된 테스트도 실행해요.

모든 플래그가 설정되었을 때 우선순위 순서는 다음과 같아요. 자세한 내용은 About global configs를 참고하세요:

  1. CLI 구성
  2. 환경 변수
  3. 사용자 구성

플래그는 empty, buildable, cautious, eager(기본값) 중 하나로 설정할 수 있어요. 자세한 옵션은 Test selection examples 문서의 Indirect selection을 참고하세요.

간접 선택 모드는 선택한 모델과 DAG 안의 관계를 기준으로 어떤 테스트가 실행될지 제어해요. 이 모드들은 선택한 모델을 직접 또는 상·하류 관계를 통해 참조하는 테스트를 dbt가 어떻게 처리할지 결정해요.

다음 모드를 사용할 수 있어요(eager가 기본값). 테스트 제외는 항상 탐욕적이에요: 부모 중 ANY 하나라도 명시적으로 제외되면 테스트도 함께 제외돼요.

DAG의 하위 집합 빌드하기

buildablecautious 모드는 DAG의 일부만 빌드할 때 유용해요. eager 모드에서 빌드되지 않은 리소스 때문에 테스트가 실패하는 것을 피하고 싶다면요. 이는 deferral로도 달성할 수 있어요.

Eager 모드 (기본값)

가장 포괄적이며, 모든 의존성이 충족되지 않더라도 부모 노드 중 하나라도 선택되면 테스트를 실행해요. 선택한 노드를 참조하는 테스트는 다른 선택되지 않은 노드도 참조하더라도 모두 포함돼요.

예를 들어 dbt test --select model_b를 실행하면 eager 모드는 다음을 실행해요:

  • model_b에 직접 붙은 테스트
  • model_b를 참조하는 업스트림 모델(예: model_a)의 테스트
  • model_b를 참조하는 다운스트림 모델의 테스트

dbt는 선택한 모델에 의존하는 모델을 빌드해요. 이 모드에서는 빌드되지 않은 리소스에 의존하는 테스트가 오류를 발생시켜요.

Buildable 모드

Buildable 모드는 cautious와 eager 사이의 중간 지점으로, 선택한 노드(또는 그 조상)를 참조하는 테스트만 실행해요. 각 참조가 선택한 노드(또는 그 조상) 안에 있는 테스트를 포함하기 때문에 cautious보다 약간 더 포괄적이에요. 이 모드는 테스트가 모델과 그 모델의 직접 조상에 의존할 때, 예를 들어 집계 결과가 입력과 같은 총계인지 확인할 때 유용해요.

Cautious 모드

Cautious는 가장 배타적인 모드로, 선택한 모델의 모든 필수 의존성이 충족될 때만 테스트를 실행하고 모델을 빌드해요. 선택한 노드만 독점적으로 참조하는 테스트로 제한해요. 테스트가 의존하는 노드가 모두 선택된 경우에만 실행되므로, 부모 노드 중 하나라도 선택되지 않아(따라서 빌드되지 않아) 테스트가 실행되지 않는 것을 방지해요.

Empty 모드

Empty 모드는 테스트를 실행하지 않고 선택한 노드만 빌드하도록 제한하며 모든 간접 의존성을 무시해요. 선택한 노드에 직접 붙은 테스트든 아니든 어떤 테스트도 실행하지 않아요. empty 모드는 대화형 컴파일에서 자동으로 사용돼요.

다음은 세 개의 모델, 세 개의 테스트, 그리고 dbt build를 예로 들어 --indirect-selection과 각 플래그의 영향을 시각화한 자료예요:

플래그 동작
dbt build
Eager (기본값) 가장 포괄적
Buildable 중간 지점
Cautious 가장 배타적
Empty 테스트 없음

예를 들어 CLI 구성을 사용해 선택한 노드만 참조하는 테스트를 실행할 수 있어요:

Usage

dbt test --indirect-selection cautious

환경 변수를 사용해 선택한 노드만 참조하는 테스트를 실행할 수도 있어요:

Env var (dbt v1.11 이상)

$ export DBT_ENGINE_INDIRECT_SELECTION=cautious
dbt run

dbt_project.yml 프로젝트 레벨 플래그를 사용해서도 가능해요:

dbt_project.yml

flags:
  indirect_selection: cautious

더 알아보기 (Learn more)