state:modified를 위한 소스 정의

state:modified를 위한 소스 정의 (Source definitions for state:modified)

state_modified_compare_more_unrendered_values 플래그는 state:modified 비교를 렌더링된 값 대신 렌더링되지 않은(unrendered) 값으로 수행하도록 바꿔요. dbt v1.12부터 기본값이 true예요. 이 플래그는 v2에서 제거됐고 새 동작이 항상 활성화돼요.

출처: 문서

본문

이 플래그는 v2에서 제거됐어요. 새 동작이 항상 활성화돼요. 업그레이드한다면 dbt_project.yml에서 이 플래그를 제거해요.

state_modified_compare_more_unrendered_values dbt v1 Latest dbt v1
Introduced 2024.10 1.9.0
Matured (default → true) 2026.09 1.12.0
Removed v2.0

상태 디렉토리를 dbt v1.9 이상 또는 dbt v1 Latest 릴리즈 트랙으로 빌드해야 하고, dbt_project.yml에서 state_modified_compare_more_unrendered_valuestrue로 설정해야 해요.

상태 디렉토리가 더 오래된 dbt 버전으로 빌드됐거나 state_modified_compare_more_unrendered_values 동작 변경 플래그가 설정되지 않았거나 false로 설정됐다면, state:modified로 상태 비교 중 오탐(false positive)을 피하려면 상태 디렉토리를 다시 빌드해야 해요.

dbt v1.12부터 state_modified_compare_more_unrendered_values는 기본값이 true로, 특히 구성이 target 환경(prod vs. dev)에 따라 다를 때 state:modified 검사 중 오탐을 줄여요.

이 플래그는 state:modified 비교를 렌더링된 값 대신 렌더링되지 않은 값을 사용하도록 바꿔요 — 모델 파싱 중 unrendered_config를, 소스 파싱 중 unrendered_databaseunrendered_schema 구성을 유지하는 방식이에요.

이 플래그는 적용되려면 상태 디렉토리(매니페스트)를 다시 빌드해야 해요.

영향

이 플래그는 대부분의 CI, Slim CI, dbt build --defer 워크플로우가 의존하는 state:modified 선택 집합을 조용히 바꿔요. 두 가지로 나타나요:

  • 플래그를 true로 설정한 후 첫 실행에서 거짓 "modified". 기준 매니페스트가 플래그 설정 전(렌더링된 값 저장)에 캡처됐고 현재 파싱이 설정 변경 후(리터럴 텍스트 저장)에 실행된다면, YAML 구성에 Jinja가 포함된 모든 노드는 실제 변경이 없어도 state:modified로 나타나요. 이렇게 하면 업그레이드 후 첫 CI 실행에서 전체 리빌드가 발생해요.
  • 앞으로의 새 양성. 두 매니페스트 모두 플래그 활성화로 캡처된 후에는, state:modified가 두 동등한 Jinja 표현식이 같은 값으로 렌더링되는 경우(예: "{{ env_var('MAT', 'view') }}"에서 view로 전환)를 잡아내요.

예상되는 것

이 플래그가 활성화된 상태에서 첫 CI 또는 Slim CI 실행 시, YAML 구성에서 Jinja(env_var, var, 조건부 materialization)를 쓰는 모든 노드는 실제 변경이 없어도 state:modified로 나타날 수 있어요. 그 이유는 기준 매니페스트가 렌더링된 값만 저장한 반면 새 파싱은 리터럴 Jinja 텍스트를 저장하기 때문이에요 — 비교의 두 쪽이 실제 변경이 아니라 직렬화에서 차이 나는 거예요.

프로덕션 작업이 v1 Latest 릴리즈 트랙에서 한 번 실행되어 새 기준 매니페스트를 생성하면, state:modified 비교의 양쪽이 같은 형식을 사용하게 되고 추가 diff는 사라져요.

코드 변경은 필요 없어요. 비용은 영향을 받는 노드에 대한 리빌드 사이클 한 번뿐이에요.

이 새 동작은 레거시 동작을 고쳐요. 이전에는 비교가 Jinja 표현식의 실제 변경을 조용히 놓쳤어요 (예: "{{ env_var('MAT', 'view') }}"에서 view로 전환하면 동일하게 렌더링되어 결코 잡히지 않았음). 이 플래그를 활성화하면 앞으로 state:modified가 더 정확해져요.

옵트아웃하려면 dbt_project.yml에서 플래그를 false로 설정해요:

dbt_project.yml

flags:
  state_modified_compare_more_unrendered_values: false

옵트아웃은 프로덕션 배포 동결 중이거나, 프로젝트의 YAML 구성에 Jinja가 많고 일회성 리빌드가 CI 컴퓨팅 예산을 초과할 때 권장돼요. 그 외에는 이 플래그를 활성화하는 걸 권장해요.

더 알아보기 (Learn more)