> ## 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.

# Greenplum

> Greenplum에서 OneSignal로 사용자 지정 이벤트를 동기화하여 사용자 행동을 기반으로 자동화된 저니와 개인화된 메시징 캠페인을 트리거하세요.

export const PLATFORM_0 = "Greenplum"

export const DATA_TYPE_0 = "table columns"

export const COLUMN_HEADER_0 = "Greenplum Column"

export const PROPERTIES_DESCRIPTION_0 = "이벤트 메타데이터가 포함된 JSON/JSONB 객체"

## 개요

OneSignal + Greenplum 통합은 Greenplum 데이터베이스에서 OneSignal로 사용자 지정 이벤트를 동기화하여 사용자 행동을 기반으로 자동화된 메시징 캠페인과 저니를 트리거할 수 있게 합니다.

Greenplum은 PostgreSQL을 기반으로 구축된 대규모 병렬 처리(MPP) 데이터베이스로, 대규모 분석 워크로드를 위해 설계되었습니다.

***

## 요구 사항

* 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)

### Greenplum

* 네트워크 액세스가 가능한 **Greenplum 인스턴스**
* 적절한 권한이 있는 **데이터베이스 사용자**
* 구조화된 행동 데이터가 포함된 **이벤트 테이블**

***

## 동기화 엔진 및 권한

OneSignal은 Greenplum의 테이블과 뷰에서 데이터를 읽고 이를 동기화하여 자동화된 메시징 캠페인을 트리거합니다. 데이터베이스의 부하를 제한하기 위해 OneSignal은 마지막 동기화 이후 수정된 데이터만 동기화할 수 있도록 하는 상태 추적 테이블을 유지합니다(증분 동기화). Greenplum 연결을 구성할 때 상태 추적이 처리되는 방식을 결정하는 동기화 엔진을 선택합니다.

**Basic Sync Engine**은 OneSignal 소유 인프라에 상태 추적 테이블을 유지하며 읽기 액세스만 필요하므로 구성이 더 간단합니다.

**Advanced Sync Engine**은 자체 Greenplum 인스턴스 내의 전용 스키마에 상태 추적 테이블을 유지하여 향상된 성능을 제공합니다.

## 설정

<Steps>
  <Step title="Census 사용자 생성">
    OneSignal이 사용할 전용 데이터베이스 사용자를 생성합니다:

    ```sql theme={null}
    -- Create CENSUS user and set password
    CREATE USER CENSUS WITH PASSWORD '<strong unique password>';
    ```
  </Step>

  <Step title="동기화 엔진 선택 및 권한 구성">
    **Basic Sync Engine의 경우 (읽기 전용 액세스):**

    이벤트 데이터 스키마에 대한 읽기 액세스를 부여합니다. `<your schema>`를 스키마 이름으로 바꿉니다:

    ```sql theme={null}
    -- Let the census user read all existing tables in this schema
    GRANT SELECT ON ALL TABLES IN SCHEMA "<your schema>" TO CENSUS;

    -- Let the census user read any new tables added to this schema
    ALTER DEFAULT PRIVILEGES IN SCHEMA "<your schema>" GRANT SELECT ON TABLES TO CENSUS;

    -- Let the census user execute any existing functions in this schema
    GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA "<your schema>" TO CENSUS;

    -- Let the census user execute any new functions added to this schema
    ALTER DEFAULT PRIVILEGES IN SCHEMA "<your schema>" GRANT EXECUTE ON FUNCTIONS TO CENSUS;
    ```

    **Advanced Sync Engine의 경우 (향상된 성능):**

    먼저 위의 Basic Sync Engine 단계를 완료한 다음 추가합니다:

    ```sql theme={null}
    -- Create a private bookkeeping schema where Census can store sync state
    CREATE SCHEMA CENSUS;

    -- Give the census user full access to the bookkeeping schema
    GRANT ALL ON SCHEMA CENSUS TO CENSUS;

    -- Ensure the census user has access to any existing objects in the bookkeeping schema
    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA CENSUS TO CENSUS;

    -- Let the census user see your data schema
    GRANT USAGE ON SCHEMA "<your schema>" TO CENSUS;
    ```
  </Step>

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

    **Greenplum**을 선택하고 다음을 제공합니다:

    * **Host:** Greenplum 마스터 호스트
    * **Port:** 5432 (또는 사용자 지정 포트)
    * **Database:** 데이터베이스 이름
    * **Username:** `CENSUS`
    * **Password:** 1단계의 비밀번호
    * **Sync Engine:** 2단계에 따라 Basic 또는 Advanced 선택
  </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 Greenplum event table
CREATE TABLE analytics.user_events (
    event_id BIGSERIAL,
    event_name VARCHAR(100) NOT NULL,
    user_id VARCHAR(255) NOT NULL,
    event_timestamp TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    event_properties JSONB,
    session_id VARCHAR(255),
    device_type VARCHAR(50)
);
```

***

## 처리 모드

### 테이블 모드

Greenplum 데이터베이스에서 직접 전체 테이블 또는 뷰를 동기화합니다. OneSignal은 자동으로 열을 이벤트 필드에 매핑합니다.

### SQL 쿼리 모드

이벤트 데이터를 변환하기 위해 PostgreSQL 호환 사용자 지정 쿼리를 작성합니다:

```sql theme={null}
-- Example: Recent high-value events
SELECT
    event_name,
    user_id,
    event_timestamp,
    event_properties
FROM analytics.user_events
WHERE event_timestamp >= NOW() - INTERVAL '7 days'
    AND (event_properties->>'value')::NUMERIC > 100
ORDER BY event_timestamp DESC;
```

### MPP 쿼리 최적화

이벤트 쿼리가 분산 실행에 최적화되도록 하여 Greenplum의 병렬 처리를 활용합니다. 더 나은 성능을 위해 적절한 분산 키를 사용하고 세그먼트 간 데이터 이동을 피합니다.

***

## 고급 네트워크 구성

OneSignal은 지역 제약, IP 주소 허용 목록 또는 SSH 터널링을 포함한 고급 네트워킹 제어를 사용하는 Greenplum 인스턴스에 성공적으로 연결할 수 있습니다.

모든 연결에 TLS v1.2 이상을 사용하도록 Greenplum 인스턴스를 구성하는 것이 좋습니다.

## 제한 사항

* 대규모 분석 쿼리가 클러스터 성능에 영향을 줄 수 있습니다
* JSON/JSONB 작업은 분산을 위해 최적화되어야 합니다
* 성능을 위해 세그먼트 간 조인을 최소화해야 합니다

***

## FAQ

### 어떤 동기화 엔진을 선택해야 하나요?

더 간단한 설정과 읽기 전용 액세스를 선호한다면 **Basic Sync Engine**을 사용하세요. 향상된 성능이 필요하고 OneSignal이 Greenplum 인스턴스에 테이블을 생성하도록 허용할 수 있다면 **Advanced Sync Engine**을 선택하세요.

### Greenplum의 MPP 아키텍처에 대해 쿼리를 어떻게 최적화하나요?

쿼리가 분산 키를 효과적으로 활용하고, 세그먼트 간 불필요한 데이터 이동을 피하며, 분석을 위해 Greenplum의 열 형식 스토리지를 활용하는지 확인합니다.

### 이벤트 데이터에 Greenplum의 외부 테이블을 사용할 수 있나요?

예, OneSignal은 외부 시스템에 저장된 Parquet 또는 CSV와 같은 형식의 데이터를 참조하는 외부 테이블에서 읽을 수 있습니다.

***
