기본 컨슈머 실행 데이터 분석¶
이 항목에서는 API를 사용하는 기본 컨슈머 실행 분석 사용 사례를 보여줍니다. 이 사용 사례는 공급자가 데이터를 사용하여 클린룸을 프로그래밍 방식으로 만들고 공유하는 방법과 컨슈머가 공급자의 데이터에 대해 분석을 실행하는 방법을 보여줍니다. 공급자는 해당 데이터에 대해 실행할 수 있는 SQL 쿼리를 정의합니다. 공급자는 공급자의 데이터만 쿼리하거나 컨슈머의 데이터만 쿼리하거나 공급자 및 컨슈머 데이터를 조인하는 쿼리를 정의할 수 있습니다.
기본 클린룸을 생성하고 공급자와 컨슈머 간에 공유하고 실행하는 단계를 보여주는 :ref:`전체 코드 예제<label-dcr_basic_clean_room_example>`를 다운로드할 수 있습니다.
공급자 단계¶
다음 목록은 클린룸을 만들고 게시하고 컨슈머와 공유하는 주요 단계를 보여줍니다. 각 단계의 세부 정보는 목록 다음에 나옵니다.
적합한 역할 및 웨어하우스를 사용하도록 환경을 설정합니다.
새 클린룸을 만듭니다.
데이터를 클린룸에 연결합니다.
공급자 데이터의 열을 조인할 수 있는 열을 지정하는 조인 정책을 설정합니다.
템플릿을 클린룸으로 가져옵니다.
공급자 데이터의 어떤 열을 어떤 템플릿에 프로젝션할 수 있는지를 지정하는 열 정책을 설정합니다.
이 클린룸에서 컨슈머 역할을 할 수 있는 계정을 추가합니다.
컨슈머가 클린룸을 설치할 때 로드되는 기본 버전을 설정합니다.
클린룸을 게시하면 초대된 모든 컨슈머가 클린룸을 설치하고 실행할 수 있습니다.
환경 설정¶
API를 사용하려면 SAMOOHA_APP_ROLE에 권한이 있는 웨어하우스를 사용해야 합니다. ``app_wh``는 API에 대한 액세스 권한이 있는 웨어하우스 중 하나입니다. 요구 사항에 적합한 웨어하우스를 선택합니다. (선택하는 경우 :ref:`자체 웨어하우스를 사용<label-cleanrooms_admin_add_warehouse>`할 수도 있습니다.)
API에 액세스하려면 samooha_app_role
역할이 필요합니다.
USE WAREHOUSE app_wh;
USE ROLE samooha_app_role;
클린룸 만들기¶
다음 단계는 새로운 클린룸을 만드는 것입니다. 이 작업은 클린룸이 내부용인지 외부용인지를 지정하는 단일 API 호출로 수행됩니다. 내부 클린룸은 같은 조직 내의 컨슈머만 액세스할 수 있습니다. 외부 클린룸은 조직 외부의 컨슈머가 사용할 수 있습니다. 두 유형 모두에서 컨슈머가 클린룸에 액세스하려면 초대를 받아야 합니다.
외부 클린룸은 특정 작업이 수행될 때 추가 보안 검사를 트리거합니다. 이 경우 ``provider.view_cleanroom_scan_status``를 호출하여 보안 검사가 완료된 시점을 확인하고, 다음 작업을 계속할 수 있습니다.
다음 예에서는 내부 클린룸을 만듭니다.
CALL samooha_by_snowflake_local_db.provider.cleanroom_init($cleanroom_name, 'INTERNAL');
데이터를 클린룸에 연결¶
공급자와 컨슈머 모두 테이블, 뷰 및 :ref:`지원되는 기타 데이터 오브젝트<label-dcr_supported_linkable_objects>`를 클린룸으로 *연결*(가져오기)할 수 있습니다. 데이터를 연결하면 API는 지정된 원본 오브젝트를 기준으로 클린룸 내부에 뷰를 만듭니다. 그러나 모든 클린룸 프로시저에서는 연결된 오브젝트를 내부 뷰 이름이 아닌 원본 이름으로 참조해야 합니다.
클린룸에 연결된 데이터는 클린룸 공동 작업자가 직접 액세스할 수 없으며, 클린룸 내의 템플릿을 사용해야만 액세스할 수 있습니다.
오브젝트를 클린룸에 연결하려면 먼저 해당 오브젝트를 *등록*해야 합니다. 오브젝트를 등록하면 SAMOOHA_APP_ROLE에 오브젝트에 대한 적절한 액세스 권한이 부여됩니다. 오브젝트를 직접 등록하거나 포함하는 오브젝트(예: 데이터베이스 또는 스키마)를 등록하여 하위 오브젝트에 액세스할 수 있습니다. UI또는 API에서 오브젝트를 등록할 수 있으며, 등록은 클린룸 수준이 아닌 계정 수준에서 이루어집니다. UI에서 등록을 더 쉽게 수행하고 관리할 수 있습니다. 오브젝트를 등록하면 계정의 모든 클린룸에서 해당 오브젝트에 연결할 수 있습니다. 등록에 대해 자세히 알아보세요.
다음 예제는 샘플 데이터베이스 SAMOOHA_SAMPLE_DATABASE의 CUSTOMERS 테이블에 연결합니다. 이 데이터베이스는 계정에 클린룸 환경을 설치할 때 자동으로 등록되므로 등록할 필요가 없습니다. 클린룸에서 언제든지 오브젝트를 연결하거나 연결 해제할 수 있으며, 결과는 모든 공동 작업자에게 빠르게 전파됩니다.
CALL samooha_by_snowflake_local_db.provider.link_datasets(
$cleanroom_name,
['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS']);
조인 정책 설정¶
컨슈머가 데이터를 조인할 수 있는 템플릿을 클린룸에 추가하는 경우 데이터에 대해 :ref:`클린룸 조인 정책<label-dcr_join_policies>`을 설정해야 합니다. 클린룸 조인 정책은 공동 작업자가 실행하는 쿼리에서 조인 :emph:`가능`한 열을 지정합니다. 데이터에 조인 정책을 설정하지 않으면 기본적으로 모든 열을 조인할 수 있습니다. 조인 정책으로 보호되는 열은 프로젝션할 수 없습니다. 자체 조인 정책은 자체 쿼리를 제한하지 않습니다.
클린룸은 연결된 데이터에 설정할 수 있는 :doc:`몇 가지 데이터 정책</user-guide/cleanrooms/policies>`을 지원합니다. 이러한 정책은 해당하는 Snowflake 정책과 유사하지만 동일하지는 않으며, 원본 데이터가 아닌 내부 뷰에만 적용됩니다. 원본 데이터에 설정된 모든 Snowflake 정책은 데이터에 연결할 때 만들어지는 뷰에 전파됩니다. 클린룸 정책은 원본 데이터가 아닌 연결된 데이터에만 설정됩니다.
중요
이 템플릿은 :ref:`정책을 적용하기 위해 JinjaSQL 필터를 포함<label-dcr_template_policies>`하는 역할을 합니다. 템플릿에 이러한 정책 검사 필터가 포함되어 있지 않으면 정책이 적용되지 않습니다. 작성하는 템플릿에 대해 항상 정책 검사를 수행하고, 실행하는 모든 템플릿을 검사하여 클린룸 정책을 적용하는지 확인합니다.
연결하는 데이터에 대해서만 정책을 설정할 수 있으며 다른 당사자의 데이터에 대해서는 정책을 설정할 수 없습니다.
다음 예에서는 연결된 테이블의 두 열을 조인할 수 있도록 허용하는 조인 정책을 설정하는 방법을 보여줍니다.
CALL samooha_by_snowflake_local_db.provider.set_join_policy(
$cleanroom_name,
['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:HASHED_EMAIL',
'SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:HASHED_PHONE']);
클린룸에 템플릿 추가¶
클린룸 템플릿은 거의 항상 SQL 쿼리로 평가되는 유효한 JinjaSQL 템플릿입니다. *분석*이라고도 하는 템플릿은 호출자를 통해 인자를 전달할 수 있으며, 클린룸에 연결된 모든 데이터에 액세스할 수 있습니다. 공급자와 컨슈머 모두 클린룸에 템플릿을 추가하고 실행할 수 있습니다.
Snowflake는 몇 가지 표준 템플릿을 제공하지만, 대부분은 UI에서만 사용할 수 있습니다. 따라서 컨슈머(또는 사용자 본인)가 API에서 실행할 수 있는 자체 사용자 지정 템플릿을 작성할 것입니다.
기본적으로 컨슈머만 템플릿을 실행할 수 있습니다. 공급자가 템플릿을 실행하려고 하는 경우 컨슈머에게 권한을 요청해야 합니다. 마찬가지로, 컨슈머가 템플릿을 업로드하려고 하는 경우 공급자에게 허가를 요청해야 합니다.
사용자 지정 템플릿을 만드는 방법에 대한 자세한 내용은 클린룸에 사용자 지정 템플릿 추가 및 사용자 지정 클린룸 템플릿 참조 섹션을 참조하세요.
다음 예제에서는 Snowflake에서 제공하는 템플릿을 클린룸에 추가하는 방법을 보여줍니다.
CALL samooha_by_snowflake_local_db.provider.add_templates(
$cleanroom_name,
['prod_overlap_analysis']);
열 정책 설정¶
클린룸 열 정책은 공동 작업자가 실행하는 쿼리에 프로젝션할 수 있는 테이블의 열을 지정합니다. 열 정책은 열과 템플릿 모두에 연결되므로, 서로 다른 열을 프로젝션 가능하도록 정의하려면 서로 다른 템플릿을 사용하면 됩니다. 해당 템플릿에 대한 열 정책을 설정하려면 먼저 템플릿이 클린룸에 있어야 합니다.
모든 정책과 마찬가지로 열 정책은 *덮어쓰기 전용*입니다. 즉, 열 정책을 설정하면 해당 계정에서 설정한 기존 열 정책을 완전히 덮어씁니다. 공급자와 컨슈머 모두 자신의 데이터에 열 정책을 설정할 수 있습니다. 데이터에 대한 열 정책을 지정하지 않으면 모든 열이 프로젝션될 수 있습니다. 열 정책에 대해 자세히 알아보세요.
다음 예제에서는 이전에 연결된 클린룸 샘플 데이터베이스에서 4개의 열을 프로젝션하도록 하는 방법을 보여줍니다.
CALL samooha_by_snowflake_local_db.provider.set_column_policy($cleanroom_name, [
'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:STATUS',
'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:AGE_BAND',
'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:DAYS_ACTIVE',
'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:REGION_CODE']);
기본 버전 설정¶
클린룸은 버전이 지정된 네이티브 애플리케이션입니다. 클린룸에 코드를 추가하는 등의 특정 작업은 애플리케이션의 새 패치 버전을 생성합니다. 컨슈머는 자신의 계정에 클린룸을 설치해야 합니다. 컨슈머가 설치하는 버전은 사용자가 지정하는 기본 버전 번호를 기준으로 합니다. 나중에 클린룸의 새 버전을 게시하고 기본 버전 번호를 증분하면 컨슈머가 설치한 모든 버전이 자동으로 업데이트되며, 새 설치 시 기본적으로 새 버전이 적용됩니다. 클린룸 버전 관리에 대해 자세히 알아보세요.
다음 예제에서는 코드를 업로드하지 않은 경우 클린룸의 기본 버전을 클린룸의 초기 버전인 V1.0.0으로 설정하는 방법을 보여줍니다.
CALL samooha_by_snowflake_local_db.provider.set_default_release_directive(
$cleanroom_name,
'V1_0', -- Version number: Never changes.
'0' -- Patch number: Can change.
);
클린룸 게시¶
다음 예제와 같이 클린룸을 게시하거나 다시 게시합니다. 이 프로시저를 처음 호출하면 사용자가 클린룸을 공유한 모든 컨슈머가 클린룸을 보고 설치할 수 있습니다. 기본 버전을 업데이트하거나 클린룸 UI를 변경할 때와 같이 중요한 변경을 할 때마다 이 프로시저를 호출해야 합니다.
CALL samooha_By_snowflake_local_db.provider.create_or_update_cleanroom_listing(
$cleanroom_name);
이제 컨슈머는 다음에 설명된 대로 클린룸을 설치하고, 데이터를 연결하고, 정책을 설정하고, 템플릿을 실행할 수 있습니다.
팁
테스트 클린룸이 더 이상 필요하지 않으면 공급자 및 컨슈머 계정에서 클린룸을 삭제해야 합니다(provider.drop_cleanroom
및 consumer.uninstall_cleanroom
). 계정당 클린룸 및 공동 작업자 수는 제한되어 있습니다. 계정에 사용하지 않은 클린룸이 많이 남아 있으면 할당량에 도달할 수 있습니다.
컨슈머 단계¶
공급자가 클린룸을 게시한 후 공동 작업자로 추가된 모든 컨슈머는 UI 또는 API를 사용하여 클린룸을 보고 설치할 수 있습니다. 이 섹션에서는 컨슈머가 API를 사용하여 클린룸을 설치하고 분석을 실행하는 방법을 보여줍니다.
다음은 컨슈머가 수행하는 단계에 대한 간략한 개요입니다.
환경을 설정합니다.
클린룸을 설치합니다.
조인 및 열 정책을 설정합니다.
분석을 실행합니다.
환경 설정¶
공급자와 마찬가지로 컨슈머는 SAMOOHA_APP_ROLE에서 액세스할 수 있는 웨어하우스
실행 역할로는 클린룸을 설치할 수 없으므로 다음 예제와 같이 SAMOOHA_APP_ROLE을 사용해야 합니다.
USE WAREHOUSE app_wh;
USE ROLE samooha_app_role;
클린룸 설치¶
다음 코드 조각은 설치된 클린룸 중 설치하도록 요청받은 클린룸을 모두 나열하는 방법을 보여줍니다.
-- See all clean rooms, installed and not.
CALL samooha_by_snowflake_local_db.consumer.view_cleanrooms();
-- See only clean rooms that aren't installed.
CALL samooha_by_snowflake_local_db.consumer.view_cleanrooms() ->>
SELECT * FROM $1
WHERE IS_ALREADY_INSTALLED = false;
다음 예제와 같이 공급자가 사용자에게 공유한 클린룸을 설치합니다. 클린룸을 설치할 때 공급자의 계정 로케이터를 지정해야 합니다.
CALL samooha_by_snowflake_local_db.consumer.install_cleanroom(
$cleanroom_name,
'<PROVIDER_ACCOUNT_LOCATOR>');
팁
클린룸에는 이름과 ID가 모두 있습니다. API를 사용하여 만든 클린룸의 경우 API 프로시저에 클린룸 이름이 필요할 때마다 클린룸 이름을 사용합니다. UI에서 만든 클린룸의 경우 API프로시저에 클린룸 이름이 필요할 때마다 이름이 아닌 클린룸 ID를 사용합니다.
클린룸 UI는 API를 사용하여 만든 클린룸에 Supported with Developer APIs 레이블을 지정합니다.
데이터 추가 및 정책 설정¶
클린룸 템플릿이 컨슈머가 쿼리에 자신의 데이터를 포함하도록 허용하는 경우 컨슈머는 공급자가 수행하는 방식과 유사한 방식으로 데이터를 등록하고 데이터를 연결하며 정책을 설정합니다. 다음 예제와 같이 해당 프로시저의 consumer
버전을 사용해야 합니다.
-- You must use a role with MANAGE GRANTS privilege on an object to register it.
USE ROLE ACCOUNTADMIN;
CALL samooha_by_snowflake_local_db.consumer.register_db('MY_DATABASE');
-- Link some tables.
CALL samooha_by_snowflake_local_db.consumer.link_datasets(
$cleanroom_name,
['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS', 'MY_DATABASE.PUBLIC.EXPOSURES']);
공급자의 조인 정책은 어떤 공급자 열에 조인할 수 있는지를 보여줍니다. 이 예제에서는 조인할 수 있는 공급자 열을 확인하는 방법을 보여줍니다.
CALL samooha_by_snowflake_local_db.consumer.view_provider_join_policy($cleanroom_name);
참고
공급자 조인 정책이 없다는 것은 공급자가 데이터의 모든 열에 조인을 허용하거나, 공급자가 해당 데이터에 조인을 허용하지 않는다는 의미입니다. 데이터에 조인 정책이 구현되어 있지 않은 경우 공급자에게 문의하여 의도를 파악하세요.
공급자가 클린룸에서 템플릿을 실행하려면 컨슈머의 승인이 필요합니다. 결과적으로, 대부분의 컨슈머는 연결하는 테이블에 대해 정책을 설정하지 않아도 됩니다.
그럼에도 불구하고 공급자가 나중에 템플릿을 실행하도록 요청할 때 적절한 정책을 추가하는 것을 잊어버릴 수 있으므로 미리 정책을 추가하는 것이 좋습니다. 데이터에 조인 또는 열 속성을 설정하지 않으면 모든 열을 조인하고 프로젝션할 수 있습니다.
분석 실행¶
템플릿을 실행하기 전에 일반적으로 템플릿을 검사하여 어떤 작업을 수행하고 어떤 변수를 수락하는지 확인한 다음, 클린룸에서 사용할 수 있는 공급자 테이블을 검사합니다.
템플릿 검사¶
클린룸에서 템플릿을 나열하고 각각의 코드를 검사할 수 있습니다(공급자가 명시적으로 코드를 난독 처리한 경우 제외). 이렇게 하면 쿼리를 더 잘 이해하는 데 도움이 될 수 있습니다. 클린룸에 템플릿을 구문 분석하고, 코드를 실행할 때 전달할 수 있는 변수를 표시하도록 요청할 수도 있습니다.
템플릿의 설계에 따라 쿼리에 사용할 테이블 목록을 전달할 수 있습니다. 클린룸에 연결된 모든 테이블은 템플릿으로 전달될 수 있습니다.
많은 템플릿은 런타임 시 지정할 수 있는 변수도 지원합니다. 예를 들어, 특정 값과 일치시키거나 표시할 열을 지정하는 데 사용할 수 있습니다. 이상적으로는 공급자가 템플릿이 수행하는 작업과 템플릿이 수락하는 인자에 대한 정보를 제공해야 합니다. 그러나 일반적으로 코드를 확인하기 위해 템플릿도 검사할 수도 있습니다. 다음 코드 조각은 공동 작업자가 클린룸에 추가한 템플릿을 나열하고 특정 템플릿에 대해 지원되는 인자를 가져옵니다.
-- View the templates available in this clean room.
-- Also shows the template code for each template.
CALL samooha_by_snowflake_local_db.consumer.view_added_templates($cleanroom_name);
-- Show which variables can be passed in when running the specified template.
CALL samooha_by_snowflake_local_db.consumer.get_arguments_from_template(
$cleanroom_name,
$template_name
);
팁
템플릿에서 사용되는 my_table
배열 변수가 있으면 이 변수에 템플릿을 실행할 때 전달하는 컨슈머 테이블 이름의 목록이 포함되어 있습니다. source_table
배열 변수가 있으면 이 변수에 템플릿을 실행할 때 전달하는 공급자 테이블 이름의 목록이 포함되어 있습니다.
사용 가능한 데이터 확인¶
다음 예제와 같이 사용자 자신과 공급자가 클린룸에 연결한 데이터 세트를 나열할 수 있습니다.
-- See which datasets you have linked into the clean room.
CALL samooha_by_snowflake_local_db.consumer.view_consumer_datasets($cleanroom_name);
-- See which datasets the provider has linked into the clean room.
CALL samooha_by_snowflake_local_db.consumer.view_provider_datasets($cleanroom_name);
테이블 이름을 전달할 때 이러한 프로시저의 결과에서 뷰 이름이 아닌 테이블 이름을 사용합니다.
템플릿 실행¶
이전 두 단계에서는 보유한 데이터와 전달할 수 있는 변수에 대해 알아보았습니다. 이제 분석을 실행할 준비가 되었습니다.
쿼리 및 데이터 크기에 따라 웨어하우스 크기를 :ref:`좀 더 적절한 크기<label-cleanrooms_installation_details_warehouses>`로 변경할 수 있습니다.
다음 예제에서는 사용자가 컨슈머 및 공급자 테이블, 그리고 그룹화 열로 사용되는 dimensions
및 쿼리의 WHERE 절에서 사용되는 ``where_clause``의 두 변수를 사용하는 템플릿을 호출하는 방법을 보여줍니다.
템플릿은 단일 공급자 테이블에 대해 쿼리를 실행하므로, 요청에서 컨슈머 테이블이 생략됩니다.
다음 예제에는 어떻게 dimensions
값이 접두사가 p`인 열 이름으로 지정되어 있는지 나와 있습니다. `p`는 전달된 공급자 테이블에서 이 열을 가져왔음을 나타냅니다. 열 이름을 명확히 구분하기 위해 일반적으로 `p
또는 `c`를 추가하여 열을 가져온 테이블, 공급자 또는 컨슈머를 표시해야 합니다. 그러나 이 요구 사항은 템플릿마다 크게 다릅니다. 템플릿 공급자에게 문의하거나 템플릿 코드를 검사하여 이러한 접두사가 언제 필요한지 파악해야 합니다.
CALL samooha_by_snowflake_local_db.consumer.run_analysis(
$cleanroom_name,
$template_name,
[], -- This template doesn't accept consumer tables.
['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS'], -- Provider tables.
object_construct( -- Template-specific arguments.
'dimensions', ['p.STATUS'], -- Template takes a variable named 'dimensions'.
'where_clause', 'p.REGION_CODE=$$REGION_10$$' -- Template allows you to pass in a WHERE clause.
-- $$ is used to wrap string literals
)
);
코드 예시¶
다음 코드 파일은 클린룸 분석을 생성, 공유 및 실행하는 방법을 보여줍니다.
다음 예제를 다운로드한 후 Snowflake 계정에 워크시트 파일로 업로드합니다. 공급자와 컨슈머에 대해 각각 클린룸 API가 설치된 별도의 계정이 필요합니다.