> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Snowflake

> Snowflake에서 OneSignal로 커스텀 이벤트를 동기화하여 사용자 행동에 기반한 자동화된 Journey 및 개인화된 메시징 캠페인을 트리거합니다.

export const PLATFORM_0 = "Snowflake"

export const DATA_TYPE_0 = "event data"

export const COLUMN_HEADER_0 = "Snowflake Column"

export const PROPERTIES_DESCRIPTION_0 = "Event metadata as VARIANT/JSON"

<Note>
  OneSignal의 레거시 통합으로 Snowflake를 사용하는 경우 [Snowflake 레거시 통합](./snowflake-legacy) 가이드를 참조하세요. 마이그레이션 단계는 [레거시에서 마이그레이션](#migrating-from-legacy)을 참조하세요.
</Note>

***

## 개요

OneSignal + Snowflake 통합은 두 가지 강력한 데이터 파이프라인을 지원합니다:

* **아웃바운드**: OneSignal에서 Snowflake로 메시징 이벤트 데이터(푸시, 이메일, SMS, 인앱)를 자동으로 전송하여 분석 및 보고합니다.
* **인바운드**: Snowflake 데이터셋에서 커스텀 사용자 이벤트를 OneSignal로 동기화하여 자동화된 Journey와 개인화된 메시징을 트리거합니다.

이러한 통합을 통해 사용자 참여 데이터를 완벽하게 제어할 수 있으며, 고급 분석 및 실시간 행동 기반 메시징을 지원합니다.

***

## 아웃바운드 설정

<Note>
  현재 조기 액세스 단계입니다.
  액세스를 요청하려면 다음 정보와 함께 `support@onesignal.com`으로 연락하세요:

  * 회사 이름
  * OneSignal 조직 ID
  * 활성화하려는 앱 ID
</Note>

메시징 성능 및 참여 이벤트(예: 전송, 열람, 클릭)를 Snowflake로 전송하여:

* 커스텀 대시보드 및 보고서 구축
* 채널 전반의 전달 및 참여 추세 추적
* OneSignal 데이터를 다른 비즈니스 데이터와 결합하여 분석

**요구사항**

* OneSignal **Professional 플랜** (무료 앱에서는 사용 불가)
* [Snowflake 계정](https://docs.snowflake.com/en/user-guide/getting-started-tutorial)
* Snowflake의 SECURITYADMIN 또는 ACCOUNTADMIN 역할 (설정용)

### 1. Snowflake 계정 세부 정보 수집

통합을 구성하기 전에 Snowflake 계정에서 다음 정보를 수집합니다:

* **Snowflake 호스트**: `<account_identifier>.snowflakecomputing.com` 형식의 계정 URL
* **데이터베이스 이름**: OneSignal이 이벤트 데이터를 작성할 데이터베이스
* **스키마 이름**: OneSignal 테이블용 데이터베이스 내 스키마 (OneSignal에 의해 자동 생성됨)
* **웨어하우스 이름**: 데이터 로딩 작업에 사용할 웨어하우스

<Frame caption="Snowflake 계정 식별자 위치">
  <img src="https://mintcdn.com/onesignal/4HyuQPBpu-4xjmQC/images/docs/cf472c3-Screen_Shot_2023-06-27_at_4.08.19_PM.png?fit=max&auto=format&n=4HyuQPBpu-4xjmQC&q=85&s=ad89f70c336cfa9fc66849021cdab551" width="1554" height="620" data-path="images/docs/cf472c3-Screen_Shot_2023-06-27_at_4.08.19_PM.png" />
</Frame>

### 2. Snowflake에서 설정 스크립트 실행

Snowflake 웨어하우스에서 다음 SQL 스크립트를 실행하여 OneSignal에 필요한 역할, 사용자, 웨어하우스 및 데이터베이스를 생성합니다:

```sql theme={null}
begin;

   -- create variables for user / role / warehouse / database (needs to be uppercase for objects)
   set role_name = 'ONESIGNAL_ROLE';
   set user_name = 'ONESIGNAL_USER';
   set warehouse_name = 'ONESIGNAL_WAREHOUSE';
   set database_name = 'ONESIGNAL';

   -- change role to securityadmin for user / role steps
   use role securityadmin;

   -- create role for onesignal
   create role if not exists identifier($role_name);
   grant role identifier($role_name) to role SYSADMIN;

   -- create a user for onesignal
   create user if not exists identifier($user_name)
   default_role = $role_name
   default_warehouse = $warehouse_name;

   grant role identifier($role_name) to user identifier($user_name);

   -- set binary_input_format to BASE64
   ALTER USER identifier($user_name) SET BINARY_INPUT_FORMAT = 'BASE64';

   -- set timestamp_input_format to AUTO for the user
   ALTER USER identifier($user_name) SET TIMESTAMP_INPUT_FORMAT = 'AUTO';

   -- change role to sysadmin for warehouse / database steps
   use role sysadmin;

   -- create a warehouse for onesignal
   create warehouse if not exists identifier($warehouse_name)
   warehouse_size = xsmall
   warehouse_type = standard
   auto_suspend = 60
   auto_resume = true
   initially_suspended = true;

   -- create database for onesignal
   create database if not exists identifier($database_name);

   -- grant onesignal role access to warehouse
   grant USAGE
   on warehouse identifier($warehouse_name)
   to role identifier($role_name);

   -- grant onesignal access to database
   grant CREATE SCHEMA, MONITOR, USAGE
   on database identifier($database_name)
   to role identifier($role_name);

 commit;
```

<Note>
  스크립트 상단의 변수 값을 사용자의 명명 규칙에 맞게 사용자 정의할 수 있습니다. 기존 웨어하우스 또는 데이터베이스를 사용하는 경우 그에 따라 스크립트를 수정하세요.
</Note>

### 3. 인증용 키 페어 생성

OneSignal은 Snowflake 계정에 안전하게 액세스하기 위해 키 페어 인증이 필요합니다. 다음 단계에 따라 키를 생성하고 구성합니다:

<Steps>
  <Step title="개인 키 생성">
    다음 명령 중 하나를 실행하여 개인 키를 생성합니다:

    **암호화되지 않은 개인 키** (더 간단하지만 보안성이 낮음):

    ```bash theme={null}
    openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
    ```

    **암호화된 개인 키** (프로덕션 권장):

    ```bash theme={null}
    openssl genrsa 2048 | openssl pkcs8 -topk8 -v2 aes256 -inform PEM -out rsa_key.p8
    ```

    암호화된 키를 사용하는 경우 암호 구문을 생성하라는 메시지가 표시됩니다. 이 암호 구문을 안전하게 저장하세요. OneSignal을 구성할 때 필요합니다.
  </Step>

  <Step title="공개 키 생성">
    개인 키에서 공개 키를 생성합니다:

    ```bash theme={null}
    openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
    ```
  </Step>

  <Step title="Snowflake 사용자에게 공개 키 할당">
    공개 키 파일의 내용을 복사한 다음(헤더 및 바닥글 줄 제외) Snowflake에서 이 SQL 명령을 실행합니다:

    ```sql theme={null}
    ALTER USER ONESIGNAL_USER SET RSA_PUBLIC_KEY='<YOUR_PUBLIC_KEY_CONTENT>';
    ```

    `<YOUR_PUBLIC_KEY_CONTENT>`를 키 내용으로 바꿉니다(`-----BEGIN PUBLIC KEY-----` 및 `-----END PUBLIC KEY-----` 줄 제외).
  </Step>
</Steps>

<Warning>
  개인 키 파일을 안전하게 저장하세요. 다음 단계에서 OneSignal에 제공해야 합니다. 개인 키를 공개적으로 공유하거나 버전 제어에 커밋하지 마세요.
</Warning>

### 4. OneSignal 연결

<Steps>
  <Step title="통합 활성화">
    OneSignal에서 **Data > Integrations > Snowflake**로 이동합니다.
  </Step>

  <Step title="세부 정보 입력">
    * 호스트: `<your_account>.snowflakecomputing.com`
    * 포트: 선택사항, 기본값은 `443`
    * 데이터베이스: 예: `ONESIGNAL`
    * 역할: 선택사항, 생략하면 사용자의 기본 역할 사용
    * 사용자: 예: `ONESIGNAL_USER`
    * 개인 키: 개인 키 파일(`rsa_key.p8`)의 내용을 붙여넣습니다
    * 개인 키 암호 구문: 선택사항, 개인 키가 암호화된 경우에만
    * 데이터 처리 위치: 데이터를 Snowflake로 보내기 전에 처리되는 위치
  </Step>

  <Step title="통합 구성">
    * **동기화 빈도:** 15분마다
    * **스키마/테이블 이름:** `onesignal_events_<app-id>` 및 `message_events`로 사전 설정됨 (편집 가능)
    * **이벤트 유형:** 동기화할 이벤트 선택—전체 또는 필요한 것만 선택
  </Step>

  <Step title="이벤트 선택">
    Snowflake 웨어하우스에서 받을 이벤트를 선택합니다.
  </Step>

  <Step title="설정 완료">
    **Save**를 클릭하고 성공 확인을 기다립니다
  </Step>
</Steps>

<Note>
  초기 데이터 동기화가 Snowflake에 나타나는 데 15\~30분이 걸릴 수 있습니다.

  기다리는 동안 푸시, 이메일, 인앱 또는 SMS를 통해 메시지를 전송하여 선택한 이벤트를 트리거합니다.
</Note>

### 5. Snowflake에서 데이터 보기

초기 동기화가 완료되면 OneSignal 이벤트 데이터를 쿼리합니다:

```sql theme={null}
-- View recent message events
SELECT *
FROM <your-database>.<your-schema>.message_events
ORDER BY _CREATED DESC
LIMIT 100;
```

<Info>
  스키마 누락, 권한 오류 또는 잘못된 형식의 이벤트와 같은 문제가 발생하면 `support@onesignal.com`으로 문의하세요.
</Info>

## 메시지 이벤트 및 속성

### 메시지 이벤트 종류

**속성:** `event_kind`
**유형:** `String`

메시지 및 이벤트의 종류(예: `message.push.received`, `message.push.sent`).

|   메시지 이벤트 (OneSignal)  |           `event_kind`           | 설명                                                                |
| :--------------------: | :------------------------------: | ----------------------------------------------------------------- |
|        Push Sent       |        `message.push.sent`       | 푸시 알림이 성공적으로 전송되었습니다.                                             |
|      Push Received     |      `message.push.received`     | 전달된 푸시([전달 확인](/docs/ko/confirmed-delivery) 참조).                  |
|      Push Clicked      |      `message.push.clicked`      | 사용자가 푸시를 클릭했습니다.                                                  |
|       Push Failed      |       `message.push.failed`      | 전달 실패. 메시지 보고서를 참조하세요.                                            |
|    Push Unsubscribed   |    `message.push.unsubscribed`   | 사용자가 푸시 구독을 취소했습니다.                                               |
|    In-App Impression   |     `message.iam.impression`     | 인앱 메시지가 표시되었습니다.                                                  |
|     In-App Clicked     |       `message.iam.clicked`      | 인앱 메시지를 클릭했습니다.                                                   |
|   In-App Page Viewed   |   `message.iam.page_displayed`   | 인앱 페이지가 표시되었습니다.                                                  |
|       Email Sent       |       `message.email.sent`       | 이메일이 전달되었습니다.                                                     |
|     Email Received     |     `message.email.received`     | 수신자의 메일 서버가 이메일을 수락했습니다.                                          |
|      Email Opened      |      `message.email.opened`      | 이메일이 열렸습니다. [이메일 보고서](/docs/ko/email-message-reports)를 참조하세요.     |
|   Email Link Clicked   |      `message.email.clicked`     | 이메일의 링크를 클릭했습니다.                                                  |
|   Email Unsubscribed   |   `message.email.unsubscribed`   | 수신자가 구독을 취소했습니다.                                                  |
| Email Reported As Spam | `message.email.reported_as_spam` | 스팸으로 표시되었습니다. [이메일 전달 가능성](/docs/ko/email-deliverability)을 참조하세요. |
|      Email Bounced     |      `message.email.bounced`     | 영구적인 전달 실패로 인한 반송.                                                |
|      Email Failed      |      `message.email.failed`      | 전달이 실패했습니다.                                                       |
|    Email Suppressed    |    `message.email.suppressed`    | 억제 목록으로 인해 억제되었습니다.                                               |
|        SMS Sent        |        `message.sms.sent`        | SMS가 전송되었습니다.                                                     |
|      SMS Delivered     |      `message.sms.delivered`     | SMS가 성공적으로 전달되었습니다.                                               |
|       SMS Failed       |       `message.sms.failed`       | SMS 전달이 실패했습니다.                                                   |
|     SMS Undelivered    |     `message.sms.undelivered`    | SMS가 거부되었거나 도달할 수 없습니다.                                           |

### 이벤트 데이터 스키마

사용자가 생성한 각 메시지 이벤트에 대해 다음 메타데이터가 레코드에 첨부됩니다.

|                       열 이름                      |     유형    | 설명                                      |
| :---------------------------------------------: | :-------: | --------------------------------------- |
|                    `event_id`                   |    UUID   | 이벤트의 고유 식별자                             |
|                `event_timestamp`                | Timestamp | 이벤트 발생 시간                               |
|                   `event_kind`                  |   String  | [이벤트 종류](#메시지-이벤트-종류)                   |
|            `subscription_device_type`           |   String  | 장치 유형(예: iOS, Android, Web, Email, SMS) |
|                    `language`                   |   String  | 구독 언어 코드                                |
|                    `version`                    |   String  | 통합 버전                                   |
|                   `device_os`                   |   String  | 장치 운영 체제 버전                             |
|                  `device_type`                  |   Number  | 숫자 장치 유형                                |
|                     `token`                     |   String  | 푸시 토큰, 전화번호 또는 이메일                      |
|                `subscription_id`                |    UUID   | 구독 ID                                   |
|                   `subscribed`                  |  Boolean  | 구독 상태                                   |
|                  `onesignal_id`                 |    UUID   | OneSignal 사용자 ID                        |
|                  `last_active`                  |   String  | 마지막 활성 타임스탬프                            |
|                      `sdk`                      |   String  | OneSignal SDK 버전                        |
|                  `external_id`                  |   String  | 통합 사용자 ID와 일치해야 하는 외부 사용자 ID            |
|                     `app_id`                    |    UUID   | OneSignal의 앱 ID                         |
|                  `template_id`                  |    UUID   | 템플릿 ID(해당하는 경우)                         |
|                   `message_id`                  |    UUID   | 메시지 배치/요청 ID                            |
|                  `message_name`                 |   String  | 메시지 이름                                  |
|                 `message_title`                 |   String  | 메시지 제목(영어만)                             |
|                `message_contents`               |   String  | 잘린 메시지 본문(영어만)                          |
|                 `failure_reason`                |   String  | 실패 이유(푸시 실패 및 이메일 실패 이벤트용)              |
| `_created`, `_id`, `_index`, `_fivetran_synced` |  *내부 사용*  | Fivetran 동기화 메타데이터                      |

### 참고 사항

* 저장/활성화 후 동기화는 완료하는 데 추가로 15-30분이 소요될 수 있습니다.
* 비활성화하면 비활성화 후 최종 동기화가 한 번 더 발생할 수 있습니다.
* 효율적인 데이터 동기화를 보장하기 위해 시스템은 스테이징 데이터 세트를 자동으로 생성하고 관리합니다. 이러한 데이터 세트는 `fivetran_{두 개의 무작위 단어}_staging`과 같은 패턴으로 이름이 지정되며, 기본 스키마에 통합되기 전에 처리 중에 데이터를 임시로 저장합니다. 이러한 스테이징 데이터 세트는 간소화된 워크플로를 유지하는 데 필수적이며 자동으로 다시 생성되므로 삭제하면 안 됩니다.

***

## 레거시에서 마이그레이션

현재 [레거시 Snowflake 통합](./snowflake-legacy)을 사용하고 있다면, 이 섹션에서 주요 차이점과 쿼리를 마이그레이션하는 방법을 다룹니다.

### 주요 차이점

| 기능          | 레거시                  | 신규                       |
| ----------- | -------------------- | ------------------------ |
| **동기화 빈도**  | 24시간                 | 15분마다                    |
| **데이터 소유권** | 공유 데이터에 대한 읽기 전용 액세스 | 사용자의 Snowflake 계정에 직접 기록 |
| **데이터 보존**  | 30일                  | 사용자가 보존 기간 제어            |
| **이벤트 선택**  | 모든 이벤트               | 특정 이벤트 유형 선택 가능          |

### 스키마 변경사항

새 통합에서는 필요에 따라 컬럼을 생성합니다. 특정 필드에 대한 데이터를 포함하는 이벤트가 없으면 해당 컬럼은 테이블에 존재하지 않습니다. 해당 필드에 대한 데이터가 나타나면 컬럼이 자동으로 생성됩니다.

#### 컬럼 이름 변경

| 레거시 컬럼                       | 신규 컬럼              |
| ---------------------------- | ------------------ |
| `EVENT_IMPRESSION_TIMESTAMP` | `EVENT_TIMESTAMP`  |
| `SUBSCRIPTION_LANGUAGE`      | `LANGUAGE`         |
| `MESSAGE_BODY`               | `MESSAGE_CONTENTS` |

### 타입 추론

새 통합에서는 자동 타입 추론을 사용합니다. 컬럼의 모든 값이 숫자인 경우(예: 모든 `EXTERNAL_ID` 값이 숫자) 컬럼이 `NUMBER`로 타입이 지정될 수 있습니다. 나중에 숫자가 아닌 값이 나타나면 컬럼 타입이 `VARCHAR`로 승격됩니다.

필요한 경우 명시적 캐스팅을 사용하세요:

```sql theme={null}
WHERE EXTERNAL_ID = '12345'::VARCHAR
```

### 쿼리 마이그레이션

기존 쿼리를 마이그레이션하려면:

1. 레거시 데이터베이스에 대한 참조를 새 Snowflake 데이터베이스를 가리키도록 업데이트
2. 위에 나열된 컬럼 이름 변경 사항 반영
3. 필요한 경우 명시적 타입 캐스팅 추가

선택적으로, 새 컬럼 이름을 레거시 이름으로 별칭을 지정하는 호환성 뷰를 생성할 수 있습니다:

```sql theme={null}
CREATE VIEW your_schema.message_events_compat AS
SELECT
  *,
  EVENT_TIMESTAMP AS EVENT_IMPRESSION_TIMESTAMP,
  LANGUAGE AS SUBSCRIPTION_LANGUAGE,
  MESSAGE_CONTENTS AS MESSAGE_BODY
FROM ONESIGNAL_DB.ONESIGNAL_EVENTS_XXXXX.MESSAGE_EVENTS;
```

<Note>
  `ONESIGNAL_DB.ONESIGNAL_EVENTS_XXXXX.MESSAGE_EVENTS`를 실제 데이터베이스, 스키마 및 테이블 이름으로 바꿔주세요.
</Note>

레거시 데이터 공유를 연결 해제하려면 [snowflake-data-sharing@onesignal.com](mailto:snowflake-data-sharing@onesignal.com)으로 연락하세요.

***

## 인바운드 설정

Snowflake에서 OneSignal로 행동 이벤트 데이터를 전송하여:

* 사용자 활동을 기반으로 Journey 트리거
* 행동 데이터를 기반으로 메시징 개인화

**요구사항**

* Access to [Event Streams](/docs/en/event-streams) for outbound message events (Plan limitations and overages apply)
* Access to [Custom Events](/docs/en/custom-events) for inbound event syncing (Plan limitations and overages apply)
* [Updated Account Plan](https://onesignal.com/pricing) (not available on free apps)

- 웨어하우스 액세스 권한이 있는 **Snowflake 계정**
- Snowflake 테이블 또는 뷰에 저장된 **이벤트 데이터**
- OneSignal에서 Snowflake 인스턴스로의 **네트워크 연결**
- 적절한 권한이 있는 **사용자 자격 증명**

<Steps>
  <Step title="OneSignal 전용 역할 생성">
    Snowflake 모범 사례에 따라 역할 계층 구조를 생성합니다:

    ```sql theme={null}
    -- Create a role for the census user
    CREATE ROLE CENSUS_ROLE;

    -- Ensure the sysadmin role inherits any privileges the census role is granted
    GRANT ROLE CENSUS_ROLE TO ROLE SYSADMIN;
    ```
  </Step>

  <Step title="전용 웨어하우스 생성">
    OneSignal 작업을 위한 비용 최적화 웨어하우스를 생성합니다:

    ```sql theme={null}
    -- Create a warehouse for the census role, optimizing for cost over performance
    CREATE WAREHOUSE CENSUS_WAREHOUSE WITH
        WAREHOUSE_SIZE = XSMALL
        AUTO_SUSPEND = 60
        AUTO_RESUME = TRUE
        INITIALLY_SUSPENDED = FALSE;

    GRANT USAGE ON WAREHOUSE CENSUS_WAREHOUSE TO ROLE CENSUS_ROLE;
    GRANT OPERATE ON WAREHOUSE CENSUS_WAREHOUSE TO ROLE CENSUS_ROLE;
    GRANT MONITOR ON WAREHOUSE CENSUS_WAREHOUSE TO ROLE CENSUS_ROLE;
    ```
  </Step>

  <Step title="사용자 생성 및 권한 부여">
    OneSignal 사용자를 생성하고 이벤트 데이터에 대한 액세스 권한을 부여합니다:

    ```sql theme={null}
    -- Create the census user
    CREATE USER CENSUS WITH
        DEFAULT_ROLE = CENSUS_ROLE
        DEFAULT_WAREHOUSE = CENSUS_WAREHOUSE
        PASSWORD = '<strong-unique-password>';

    GRANT ROLE CENSUS_ROLE TO USER CENSUS;

    -- Grant access to your event data (replace with your actual database/schema)
    GRANT USAGE ON DATABASE "<your-database>" TO ROLE CENSUS_ROLE;
    GRANT USAGE ON SCHEMA "<your-database>"."<your-schema>" TO ROLE CENSUS_ROLE;
    GRANT SELECT ON ALL TABLES IN SCHEMA "<your-database>"."<your-schema>" TO ROLE CENSUS_ROLE;
    GRANT SELECT ON FUTURE TABLES IN SCHEMA "<your-database>"."<your-schema>" TO ROLE CENSUS_ROLE;
    GRANT SELECT ON ALL VIEWS IN SCHEMA "<your-database>"."<your-schema>" TO ROLE CENSUS_ROLE;
    GRANT SELECT ON FUTURE VIEWS IN SCHEMA "<your-database>"."<your-schema>" TO ROLE CENSUS_ROLE;
    ```
  </Step>

  <Step title="부기 데이터베이스 생성 (고급 동기화 엔진)">
    OneSignal의 동기화 상태 관리를 위한 전용 데이터베이스를 생성합니다:

    ```sql theme={null}
    -- Create a private bookkeeping database
    CREATE DATABASE "CENSUS";
    GRANT ALL PRIVILEGES ON DATABASE "CENSUS" TO ROLE CENSUS_ROLE;

    CREATE SCHEMA "CENSUS"."CENSUS";
    GRANT ALL PRIVILEGES ON SCHEMA "CENSUS"."CENSUS" TO ROLE CENSUS_ROLE;
    GRANT CREATE STAGE ON SCHEMA "CENSUS"."CENSUS" TO ROLE CENSUS_ROLE;
    ```

    <Warning>
      기본 동기화 엔진 또는 읽기 전용 모드를 사용하는 경우 이 단계를 건너뜁니다.
    </Warning>
  </Step>

  <Step title="인증 구성">
    보안 강화를 위해 키 페어 인증(권장)을 설정합니다:

    1. [Snowflake 문서](https://docs.snowflake.com/en/user-guide/key-pair-auth)에 따라 공개/개인 키 페어를 생성합니다
    2. Snowflake 사용자에 공개 키를 구성합니다
    3. OneSignal의 연결 설정에서 개인 키를 사용합니다

    또는 암호 인증을 사용할 수 있습니다(더 이상 사용되지 않음 - 2025년 11월에 차단됨).
  </Step>

  <Step title="OneSignal에 연결">
    OneSignal에서 **Data > Integrations**으로 이동하여 **Add Integration**을 클릭합니다.

    **Snowflake**를 선택하고 다음 연결 세부 정보를 제공합니다:

    * **계정 이름:** Snowflake 계정 식별자 (예: `abc123.us-east-1`)
    * **웨어하우스:** `CENSUS_WAREHOUSE`
    * **사용자:** `CENSUS`
    * **데이터베이스:** 이벤트 데이터 데이터베이스 이름
    * **스키마:** 이벤트 데이터 스키마 이름
    * **인증:** 키 페어 (개인 키 및 선택적 암호 구문 제공)
  </Step>
</Steps>

***

### 이벤트 데이터 매핑

{PLATFORM_0} {DATA_TYPE_0}를 OneSignal의 사용자 지정 이벤트 형식에 매핑합니다:

| OneSignal 필드  | {COLUMN_HEADER_0} | 설명                         | 필수  |
| ------------- | ----------------- | -------------------------- | --- |
| `name`        | `event_name`      | 이벤트 식별자                    | Yes |
| `external_id` | `user_id`         | 사용자 식별자                    | Yes |
| `timestamp`   | `event_timestamp` | 이벤트가 발생한 시간                | No  |
| `properties`  | `event_data`      | {PROPERTIES_DESCRIPTION_0} | No  |

#### 이벤트 테이블 스키마 예시

```sql theme={null}
-- Example Snowflake event table
CREATE TABLE analytics.user_events (
    event_id STRING,
    event_name STRING NOT NULL,
    user_id STRING NOT NULL,
    event_timestamp TIMESTAMP_TZ DEFAULT CURRENT_TIMESTAMP(),
    event_properties VARIANT,
    session_id STRING,
    device_type STRING
);
```

#### SQL 쿼리 모드

이벤트 데이터를 변환하기 위한 커스텀 SQL 쿼리를 작성합니다:

```sql theme={null}
-- Example: Recent high-value events
SELECT
    event_name,
    user_id,
    event_timestamp,
    event_properties
FROM analytics.user_events
WHERE event_timestamp >= DATEADD(day, -7, CURRENT_TIMESTAMP())
    AND event_properties:value::NUMBER > 100
ORDER BY event_timestamp DESC;
```

### 고급 구성

#### 웨어하우스 비용 관리

* 비용 최적화를 위해 X-Small 웨어하우스 크기 사용
* 자동 일시 중지(60초) 및 자동 재개 구성
* 사용량이 적은 시간대에 동기화 예약
* 다른 배치 처리 시스템과 웨어하우스 공유 고려

#### 실시간 동기화 지원

실시간 이벤트 처리를 위해 이벤트 테이블에서 변경 추적을 활성화합니다:

```sql theme={null}
ALTER TABLE "analytics"."user_events" SET CHANGE_TRACKING = TRUE;
```

#### 네트워크 보안

Snowflake의 허용된 IP 네트워크 정책을 사용하는 경우 OneSignal의 IP 주소를 허용 목록에 추가합니다. 현재 IP 범위는 OneSignal 지원팀에 문의하세요.

***

## 제한사항

* 복잡한 분석 쿼리는 웨어하우스 성능 및 비용에 영향을 미칠 수 있습니다
* 사용자/암호 인증은 2025년 11월에 더 이상 사용되지 않습니다
* CENSUS 데이터베이스는 OneSignal 작업 전용으로 예약되어 있습니다

***

## FAQ

### 어떤 인증 방법을 사용해야 하나요?

**키 페어 인증**(권장)을 사용하세요. 사용자/암호 인증은 2025년 11월부터 Snowflake에서 차단됩니다.

### 기존 웨어하우스를 사용할 수 있나요?

예, 비용을 최적화하기 위해 dbt 또는 Fivetran과 같은 다른 배치 처리 시스템과 웨어하우스를 공유할 수 있습니다. 웨어하우스가 이벤트 처리 요구 사항에 충분한 용량을 갖추고 있는지 확인하세요.

### 비용을 최적화하려면 어떻게 해야 하나요?

* X-Small 웨어하우스 크기 사용
* 공격적인 자동 일시 중지(60초) 구성
* 사용량이 적은 시간대에 동기화 예약
* 연속 동기화 대신 시간별/일별 동기화 사용

***
