DCM Projects 파일 및 템플릿¶
DCM project 에는 매니페스트 파일과 하나 이상의 SQL 오브젝트 정의 파일이 필요합니다. 이러한 파일은 일반적으로 Git 리포지토리 또는 로컬 작업 공간에 저장되고 관리됩니다.
매니페스트 파일
포함할 오브젝트 정의 파일을 지정합니다.
:ref:`템플릿 변수 <label-dcm_projects_files_configurations>`를 사용하여 다양한 환경에 대한 구성을 정의합니다.
오브젝트 정의 파일
DCM project 에서 함께 관리하려는 Snowflake 오브젝트 그룹을 정의합니다.
DCM project 파일을 생성하는 상위 수준 워크플로는 다음과 같습니다.
정의 파일을 저장할 DCM project 폴더 생성¶
새 DCM project 를 생성하려면 매니페스트 파일(manifest.yml) 및 SQL 오브젝트 정의 파일을 저장할 폴더를 생성합니다.
DCM_PROJECT 템플릿과 snow init 명령은 프로젝트 디렉터리에 예제 정의 파일을 생성합니다. 이러한 파일을 열고 편집하여 DCM project 를 정의합니다.
DCM Projects 는 표준화된 폴더 구조를 따릅니다.
DCM Projects 오브젝트 정의 파일은
sources/definitions/아래에 배치해야 합니다.선택적 전역 매크로 파일은
sources/macros/아래에 배치할 수 있습니다.이러한 프로젝트 디렉터리 내의 파일 이름 및 중첩은 유연하게 구성할 수 있습니다.
DCM 명령에 사용하려는 추가 스크립트 또는 프로젝트 파일이 있는 경우 명령을
sources아래에 추가할 수 있습니다(예: dbt 프로젝트 파일).DCM Projects 명령에서 사용하지 않고 로컬에서 업로드되지 않아야 하는 다른 사용자 지정 스크립트를 프로젝트 폴더 내에 저장하려는 경우
sources폴더 외부의 폴더에 추가합니다.CLI 명령은
sources폴더 내에서만 파일을 업로드합니다.
DCM project 폴더 구조의 예제는 다음과 같습니다.
매니페스트 파일 만들기¶
각 DCM project 에는 manifest.yml 파일이 필요합니다. 이를 통해 프로젝트의 필수 구성 세부 정보를 보유하고 프로젝트 폴더를 DCM project 로 식별할 수 있습니다.
매니페스트 파일을 사용하여 다른 대상 환경에 배포할 때 사용할 DCM project 오브젝트 및 역할을 제어하고 템플릿 값 세트를 관리합니다.
매니페스트 파일은 다음 속성이 포함된 YAML 파일입니다.
속성 |
필수 |
설명 |
|---|---|---|
|
필수 |
매니페스트 스키마의 버전입니다. 현재 버전은 2입니다. |
|
필수 |
프로젝트의 유형입니다. |
|
선택 사항 |
둘 이상의 대상이 있는 경우 기본 대상을 지정합니다. |
|
필수 |
|
|
선택 사항 |
|
프로젝트 대상¶
매니페스트 파일의 각 대상에는 다음 속성이 포함됩니다.
속성 |
설명 |
|---|---|
|
이 대상의 Snowflake 계정 식별자입니다. 계정의 리전 및 로케이터 찾기 섹션을 참조하십시오. |
|
DCM project 오브젝트의 정규화된 이름(예: 이는 SHOW DCM PROJECTS SQL 명령을 사용하여 찾을 수 있습니다. |
|
이 프로젝트 오브젝트에 대한 OWNERSHIP 권한이 있는 역할입니다. 이는 SHOW DCM PROJECTS 또는 DESCRIBE DCM PROJECT SQL 명령을 사용하여 찾을 수 있습니다. |
|
이 대상에 사용할 |
프로젝트 정의 및 프로젝트 오브젝트 간의 매핑¶
DCM Projects 정의 파일은 특정 DCM project 오브젝트 파일에 엄격하게 연결되어 있지 않습니다. 동일한 정의 세트를 사용하여 다른 Snowflake 계정에서 또는 다른 구성 프로필을 참조하여 여러 프로젝트에 배포할 수 있습니다. 예를 들어, 다음 그림과 같이 리포지토리 분기의 동일한 정의 파일을 DEV 및 PROD 계정 모두에 배포할 수 있습니다.
마찬가지로, 다른 경로의 정의 파일을 참조하여 DCM Projects 오브젝트를 실행할 수 있습니다. 예를 들어, CI 또는 CD 자동화는 기본 분기에서 정의를 배포할 수 있으며, 동일한 프로젝트에 대해 로컬 정의 파일에서 PLAN을 수동으로 실행하여 해당 최신 배포와 어떻게 다른지 확인할 수 있습니다. 이러한 접근 방식은 다른 분기 또는 로컬 경로에서의 임시 수동 배포에도 사용할 수 있습니다.
프로젝트 템플릿 구성¶
다음은 매니페스트 파일에 있는 템플릿 구성의 상위 수준 구조입니다. defaults 또는 configurations 중 하나만 설정하거나 둘 다 설정할 수 있습니다.
속성 |
설명 |
|---|---|
|
반복을 피하기 위해 모든 구성에 적용되는 키-값 페어의 공유 변수 값입니다. |
|
프로젝트에 사용할 템플릿 구성입니다. 개별 구성은 구성별 값으로 기본값을 재정의할 수 있습니다. 변수 확인 방법에 대한 자세한 내용은 :ref:`구성 <label-dcm_projects_configurations>`을 참조하세요. |
|
템플릿 구성의 이름입니다. 구성 이름은 대소문자를 구분하지 않습니다. |
|
변수의 이름입니다. 변수 이름은 `Python 변수 명명 규칙 <https://www.w3schools.com/python/python_variables_names.asp>`_을 따라야 합니다. 프로젝트 정의의 모든 변수는 기본값, 선택한 구성 또는 런타임 시점에 선언해야 합니다. |
|
변수의 값입니다. 값은 문자열, 숫자, 부울, 목록 또는 사전일 수 있습니다. 사전은 매니페스트에서 정의할 수 있지만 런타임 시 덮어쓸 수 없습니다. |
예제: manifest.yml¶
다음은 템플릿 변수 및 기본값을 포함하는 세 가지 구성, DEV, STAGE, PROD가 포함된 DCM project 매니페스트 파일(manifest.yml)의 예제입니다.
오브젝트 정의 파일 생성¶
DCM project 정의 파일은 Snowflake 오브젝트를 관리하기 위한 유효한 SQL 문으로 확인되는 템플릿입니다. 각 DCM project 에는 하나 이상의 정의 파일이 필요합니다.
여러 파일과 폴더에 걸쳐 오브젝트 정의와 권한 부여를 구성할 수 있습니다. Snowflake는 오브젝트 유형별로 그룹화하는 대신 프로젝트의 비즈니스 논리를 나타내는 구조(예: 브론즈, 실버, 골드)를 선택할 것을 권장합니다.
정의 파일에는 DEFINE, GRANT 또는 ATTACH 문만 포함할 수 있습니다. 기타 SQL 명령은 지원되지 않습니다.
DCM Projects 를 빠르게 시작하려면 기존 DDLs(지원되는 오브젝트 유형의 경우)에 DEFINE 키워드를 사용하여 기존 SQL 배포 스크립트를 변환하면 됩니다.
DEFINE 문은 CREATE OR ALTER <오브젝트> 명령과 같이 작동하지만, 다음과 같은 주요 차이점이 있습니다.
DEFINE 문의 순서와 위치는 중요하지 않습니다. Snowflake는 프로젝트 실행 중에 모든 정의 파일에서 모든 문을 수집하고 정렬합니다.
DEFINE 문을 제거하는 경우 Snowflake는 다음에 프로젝트를 배포할 때 해당 오브젝트를 삭제합니다.
Snowflake 오브젝트의 하위 세트만 지원됩니다. 자세한 내용은 DCM Projects 에서 지원되는 오브젝트 유형 섹션을 참조하십시오.
모든 오브젝트는
database.schema.object_name형식의 정규화된 이름으로 정의해야 합니다.
정의 파일에는 다양한 Jinja2 템플릿 옵션이 포함될 수 있으며 고급 템플릿 기능을 지원하여 다음을 수행할 수 있습니다.
템플릿 변수를 사용하여 런타임 시 파일 내용을 사용자 지정합니다.
루프 및 조건과 같은 논리에 Jinja2 구문을 사용합니다.
정의 파일을 재사용하고 다양한 시나리오에 적용할 수 있습니다.
오브젝트 정의 템플릿¶
DCM Projects 는 SQL 문을 템플릿화하기 위해 Jinja2 프레임워크를 지원합니다. 구성 프로필, EXECUTE DCM PROJECT 명령 또는 Jinja 내에서 Jinja2 구문을 사용하여 변수를 선언하고 값을 할당할 수 있습니다. 값 목록, 사례 문, 재사용 가능한 함수 등을 통해 루프를 구성할 수도 있습니다. 자세한 내용은 `Jinja2 설명서 <https://jinja.palletsprojects.com/en/stable/>`_를 참조하세요.
지원되는 Jinja2 기능은 다음과 같습니다.
문자열 대체
목록
사전 및 중첩 사전
조건(IF 문)
루핑
전역 및 파일 내 매크로
sources/macros폴더에 정의된 매크로는 모든 정의 파일에서 사용할 수 있습니다.파일에 정의된 매크로는 파일 내에서 사용할 수 있습니다.
지원되지 않는 Jinja2 기능은 다음과 같습니다.
참고
_snow 식별자는 향후 사용을 위해 예약되어 있으며 변수 또는 매크로 이름으로 사용할 수 없습니다.
중요
민감한 정보 또는 자격 증명이 포함된 오브젝트 정의에는 DCM Projects 템플릿 변수를 사용하지 마세요. 렌더링된 SQL 정의는 환경 변수에 의해 삽입된 값을 수정하지 않습니다.
마찬가지로, Snowflake 서비스를 사용할 때 개인 데이터, 민감한 데이터, 수출 통제 대상 데이터 또는 기타 규제 데이터를 메타데이터(예: 파일 이름, 구성 및 변수 이름)로 입력하지 마세요. 자세한 내용은 `Snowflake의 메타데이터 필드 <https://docs.snowflake.com/en/sql-reference/metadata>`_를 참조하세요.
다음은 Jinja2 템플릿을 사용하는 DCM project 정의 파일의 예제입니다.
다음은 두 가지 구성(DEV 및 PROD)을 정의하는 DCM project 매니페스트 파일(manifest.yml)의 예제입니다.
이 웨어하우스 정의를 DEV 구성(대상의 ``templating_config``를 통해 자동으로 또는 런타임 시 선택됨)으로 렌더링하면 다음과 같이 처리됩니다.
매크로¶
매크로 파일은 macros 파일 및 해당 하위 폴더에 있는 모든 SQL 파일입니다. 매크로만 포함할 수 있습니다.
매크로 파일이 있는 DCM project 디렉터리 구조의 예제는 다음과 같습니다.
일반 프로그래밍 언어의 함수와 유사하게, 매크로는 자주 사용하는 코드 조각을 재사용 가능한 함수로 구성하여 반복을 방지하고 중복배제(DRY) 원칙을 따르는 데 도움이 됩니다. DCM Projects 의 매크로는 다음 예외를 제외하고 `Jinja2 매크로 <https://jinja.palletsprojects.com/en/stable/templates/#macros>`_와 같은 방식으로 작동합니다.
macros폴더 내 매크로 파일 전용 위치.매크로 파일에 정의된 매크로는 다른 소스 파일에 자동으로 표시됩니다. import Jinja 태그는 허용되지 않습니다.
동일한 이름의 매크로 중복 정의는 감지되어 거부됩니다.
전역 매크로 자동 가져오기¶
정의 파일 렌더링 프로세스 중에 소스 파일에서 잠재적인 매크로 호출이 있는지 검사합니다. 호출된 매크로가 매크로 파일에 정의되어 있으면 암시적 `from […] import 태그 <https://jinja.palletsprojects.com/en/stable/templates/#import>`_가 자동으로 추가되므로 명시적으로 가져올 필요가 없습니다.
`Jinja2 매크로 <https://jinja.palletsprojects.com/en/stable/templates/#macros>`_와 유사하게, 밑줄을 접두사로 추가하여 로컬 매크로를 정의할 수 있습니다. 로컬 매크로는 선언된 파일에서만 사용할 수 있으며, 다른 파일에는 표시되지 않습니다.
템플릿 설명¶
SQL 명령에서 코드 앞에 ``–``을 추가하여 줄을 주석 처리할 수 있습니다. Jinja는 SQL 코드 내에서 계속 변수를 처리하지만 SQL 주석은 그대로 유지합니다.
예를 들어, 다음 Jinja 코드는 다음과 같습니다.
다음과 같이 렌더링됩니다.
주석 처리된 명령은 SQL에서 실행되지 않습니다. 템플릿 주석을 사용하면 SQL 코드에 영향을 주지 않고 Jinja 템플릿을 디버깅할 수 있습니다.
렌더링 중에 Jinja 코드를 무시하려면 다음 예제와 같이 여는 대괄호와 닫는 대괄호 안에 ``#``을 추가합니다.
구성¶
오브젝트 정의에서 템플릿을 사용하는 경우 다음과 같은 옵션이 있습니다.
런타임 시 변수에 값을 할당합니다.
manifest.yml`의 ``templating: configurations:``에서 다양한 구성 프로필을 정의합니다. 각 대상은 ``templating_config``를 통해 구성을 참조할 수 있습니다. 자세한 내용은 :ref:`label-dcm_projects_files_configurations섹션을 참조하십시오.구성 프로필이 정의되어 있고 대상이 ``templating_config``를 통해 참조하는 경우 해당 대상을 사용할 때 구성이 자동으로 적용됩니다. 예는 DCM project 계획 을 참조하십시오.
DCM Projects 에서 구성 프로필의 기본 사용 사례는 다양한 환경을 대상으로 하는 것입니다. 구성 프로필을 사용하면 다음을 수행할 수 있습니다.
여러 환경에 동일한 코드를 배포합니다.
비프로덕션 환경에서 축소된 규모로 프로덕션 코드를 테스트합니다.
동일한 계정에서 여러 개의 격리된 환경을 유지 관리합니다.
대상 프로필에서 모든 템플릿 구성을 참조할 필요는 없습니다. 사용하지 않는 구성을 유지하여 대상의 템플릿 구성을 다른 구성으로 전환할 수 있습니다.
``templating: defaults:``에서 공유 기본값을 정의하여 구성 전체에서 공통 변수가 반복되지 않도록 합니다. 자세한 내용은 프로젝트 템플릿 구성 섹션을 참조하십시오.
CLI의
--variable플래그를 사용하여 런타임 시 특정 변수를 일회성 값으로 덮어씁니다.
변수는 전역 기본값 < 구성 변수 < 런타임 실행 변수의 3단계 계층 구조로 확인됩니다.
사전¶
DCM Projects 템플릿은 사전을 변수 값으로 지원하므로 복잡한 다중 테넌트 또는 다중 리소스 배포를 위한 정형 구성이 가능합니다.
관련 구성 세부 정보를 사전으로 그룹화하면 다음과 같은 이점을 얻을 수 있습니다.
세분화된 제어: 모든 변형에 대해 고유한 논리를 작성하지 않고도 웨어하우스 크기, 보존 정책, 권한 부여와 같은 특정 설정을 개별 리소스에 적용할 수 있습니다.
더 깔끔한 코드 베이스: 하드 코딩된 반복적인 스크립트를 구성에 따라 조정되는 동적 루프로 바꿉니다.
확장성: 배포 파이프라인을 리팩터링하는 대신 구성에 항목을 추가하여 새 팀이나 리소스를 온보딩합니다.
참고
사전은 매니페스트에서 정의할 수 있지만 --variable 플래그 또는 SQL USING CONFIGURATION (...) 재정의로 런타임 시 덮어쓸 수 없습니다. 런타임 시에는 스칼라 값과 목록만 덮어쓸 수 있습니다.
사전의 사용 사례 예제: 다중 테넌트 환경 프로비저닝¶
마케팅, 재무 및 HR 등 각각 규정 준수 및 컴퓨팅 요구 사항이 다른 여러 부서에서 공유하는 플랫폼을 고려합니다. 사전을 사용하면 각 팀의 요구 사항을 캡처하는 단일 구성을 정의할 수 있습니다.
매니페스트 예제:
정의 예제:
사용자 SQL 템플릿은 이 사전을 반복합니다. 스키마를 자동으로 생성하고, 올바른 보존 정책을 할당하며, 요청한 팀에 대해서만 추가 리소스를 조건부로 생성합니다.
