dispatch

dispatch

dispatch() 함수는 서로 다른 어댑터(database)별로 별도 구현된 매크로를 호출할 수 있게 해주는 메커니즘이에요. 이를 통해 크로스 데이터베이스(cross-database) 매크로를 만들 수 있어요. 패키지에 매크로의 기본(default) 구현이 정의되어 있고, 각 어댑터(예: Snowflake, Spark)에 특화된 구현이 있으면 dispatch()가 현재 target.type에 맞는 구현을 골라 호출해요.

출처: 문서

본문

dispatch()는 보통 패키지 네임스페이스 형태로 호출돼요. 예를 들어 dbt_utils 패키지의 매크로를 dispatch하려면:

{{ dbt_utils.dispatch('dateadd', 'dbt_utils')(datepart='day', interval=1, from_date='2020-01-01') }}

여기서 첫 번째 인자는 호출할 매크로 이름, 두 번째 인자(macro_search_order의 일부)는 매크로를 찾을 패키지 순서예요.

매크로 검색 순서 (macro_search_order)

dispatchmacro_search_order 인자로 검색할 패키지 순서를 지정해요. 기본값은 ['default_namespace']이며, 보통 ['dbt_utils', 'my_project']처럼 지정해서 특정 패키지의 구현을 먼저 쓰게 해요.

매크로는 default__<macro_name> 형태의 기본 구현과, 어댑터별로 <adapter>__<macro_name>(예: spark__dateadd) 형태의 구현을 가질 수 있어요. dispatch는 현재 어댑터에 해당하는 구현이 있으면 그걸 쓰고, 없으면 default__ 구현을 사용해요.

예시

내 패키지에서 dbt_utils.dateadd를 재정의하려면, 같은 이름(dateadd)으로 패키지 네임스페이스를 만들고 {{ dbt_utils.dispatch('dateadd', 'dbt_utils')(...) }} 형태로 호출하면서 검색 순서에 내 패키지를 넣어주면 돼요.

더 알아보기 (Learn more)