# High-speed delivery 설정

## 개요

Pushwoosh에서 타겟 세그먼트는 **세그먼트(Segments)**를 사용하여 정의됩니다.

표준 푸시 캠페인의 경우, [`/createMessage`](/ko/developer/api-reference/messages-api/#createmessage) 요청이 전송된 **후에** 세그먼트가 컴파일됩니다. 즉, 세그먼트가 복잡한 경우 메시지가 발송되기 전에 약간의 지연이 발생할 수 있습니다.

High-speed delivery를 사용하면 세그먼트가 10분마다 사전 컴파일됩니다. 이를 통해 세그먼트를 최신 상태로 유지하고 즉시 사용할 수 있도록 준비하므로, 세그먼트 컴파일을 기다리지 않고 메시지를 즉시 전송할 수 있습니다.

High-speed delivery는 타이밍이 중요할 때 특히 유용합니다. 예를 들어, UEFA나 FIBA와 같은 스포츠 조직은 1초가 중요한 실시간 업데이트를 전송하는 데 이를 사용할 수 있습니다.

이 가이드에서는 스포츠 앱을 예로 들어 High-speed delivery를 설정하는 방법을 설명합니다. 다가오는 경기와 라이브 이벤트에 대해 사용자에게 알리기 위한 타겟 세그먼트를 생성하는 방법을 배우게 됩니다.

## High-speed delivery를 사용하는 이유

스포츠 조직에서 High-speed delivery를 사용하기 위한 전제 조건은 다음과 같습니다:

* 모든 경기가 사전에 일정이 잡혀 있어, 언제 각 세그먼트를 생성해야 할지 알고 있으며 타겟 세그먼트를 사전 컴파일할 수 있어야 합니다.
* 모든 경기는 고유 ID와 연결되어야 합니다. 예를 들어, 챔피언스 리그 결승전의 경기 ID는 0123입니다.
* 모든 팀은 고유 ID와 연결되어야 합니다. 예를 들어, 유벤투스 ID는 111, 레알 마드리드 ID는 222 등입니다.
* 사용자에게 알리고 싶은 라이브 이벤트 세트(골, 라인업, 킥오프 등)가 있어야 합니다.

## 설정

<Aside type="caution" icon="setting" title="개발자 지원 필요">
**** 
High-speed delivery를 설정하려면 개발자의 지원이 필요합니다. 적절한 구현을 위해 이 가이드를 개발자와 공유하세요.
</Aside>

High-speed delivery를 위한 모든 세그먼트는 사전에 생성되어야 하며, 예시 사용 사례에서는 경기 시작 전에 생성하는 것이 이상적입니다. Pushwoosh는 세그먼트 조건을 앱의 사용자 기반에 적용하고 **10분마다 세그먼트를 사전 컴파일합니다** (이 간격은 조정 가능).

푸시 콘텐츠와 세그먼트 이름이 포함된 [`/createMessage`](/ko/developer/api-reference/messages-api/#createmessage) API 요청을 보내면, Pushwoosh는 이미 사전 컴파일된 수신자 목록을 가지고 있어 푸시 알림을 즉시 전송할 수 있습니다.
<Aside type="caution" title="중요">
****
세그먼트 컴파일은 리소스를 많이 소모하며, 그 속도는 다음 요인에 따라 달라집니다:
- 세그먼트 조건의 복잡성 (사용된 태그 수, 태그 값의 높은 카디널리티);
- 동시에 사전 컴파일되는 고유 세그먼트의 수;
- 앱에 구독된 사용자 수.

따라서, **활성 사전 컴파일 세그먼트 수를 최소화하고 컴퓨팅 리소스를 절약하기 위해, 게임에 대한 모든 세그먼트는 게임 시작 전에 API를 통해 생성하고 종료 후 삭제해야 합니다.**

</Aside>

### 태그 생성

먼저 적용할 태그 세트를 생성하고 사용자 디바이스에 태그 값을 설정합니다.  
**킥오프(kickoff), 골(goal), 레드카드(red card)** 등과 같은 라이브 경기 이벤트에 해당하는 LIST 유형의 [태그를 생성](/ko/product/audience-data-and-segmentation/user-data-tags/tags/)하세요.

예:  
**MATCH-KICKOFF, MATCH-GOAL, MATCH-RED\_CARD**
![태그 생성](/push-notifications-high-speed-delivery-2.webp)

팀에 대한 라이브 경기 이벤트를 설명하는 동일한 태그 세트를 생성하세요.  
예:  
**TEAM-KICKOFF, TEAM-GOAL, TEAM-RED\_CARD**

<Aside type="tip">
API를 통해 태그를 생성하려면 [`/addTag`](/ko/developer/api-reference/tags/#addtag)를 호출하세요. 
</Aside> 
 
이러한 태그를 구독함으로써 앱 사용자는 수신할 알림을 선택할 수 있습니다:

- 특정 경기에 대한 알림 (예: 유벤투스 - 레알 마드리드 경기);  
- 좋아하는 팀의 경기에 대한 알림 (예: 유벤투스 경기만);  
- 경기 중 발생하는 이벤트에 대한 알림 (예: 유벤투스 - 레알 마드리드 경기 중 골만);  
- 좋아하는 팀의 특정 이벤트에 대한 알림 (예: 유벤투스 경기의 골 및 라인업).

### 태그 설정

이제 [`setTags`](/ko/developer/api-reference/device-api/#settags) API 요청을 통해 이전에 지정한 태그 값을 채우고, 사용자를 특정 카테고리의 푸시 알림에 구독시킬 수 있습니다.

예:
사용자가 챔피언스 리그 결승전 킥오프 및 골 업데이트를 수신하도록 구독할 때, 경기 ID가 포함된 [`/setTags`](/ko/developer/api-reference/device-api/#settags)를 호출합니다:

```javascript
{
  "request": {
    "application": "app_code",
    "hwid": "device_hardware_id",
    "tags": {
      "MATCH_KICKOFF": "0123", // match ID
      "MATCH_GOAL": "0123"     // match ID
    }
  }
}
```

사용자는 챔피언스 리그 결승전 킥오프 및 득점 골에 대한 알림을 받게 됩니다.
사용자가 레알 마드리드 경기의 골 및 레드카드 업데이트를 수신하도록 구독할 때, 다음과 같이 [`/setTags`](/ko/developer/api-reference/device-api/#settags)를 호출합니다:

```javascript 
{
  "request": {
    "application": "app_code",
    "hwid": "device_hardware_id",
    "tags": {
      "TEAM_KICKOFF": "222", // team ID
      "TEAM_GOAL": "222"     // team ID
    }
  }
}

```
이 사용자는 레알 마드리드가 경기를 할 때마다 킥오프 및 골에 대한 알림을 받게 됩니다.

### 세그먼트 생성

이제 태그와 그 값(경기 ID 및 팀 ID)을 기반으로 경기 이벤트에 대한 세그먼트를 생성할 수 있습니다. 세그먼트는 경기 시작 30분 전에 [`/createFilter`](/ko/developer/api-reference/segmentation-filters-api/#createfilter) API 요청을 통해 생성해야 합니다.

위의 예시에서 챔피언스 리그 결승전의 득점 골에 대해 사용자에게 알리려면, 다음 파라미터로 [`/createFilter`](/ko/developer/api-reference/segmentation-filters-api/#createfilter)를 호출하세요:  
**Segment name**: 0123_GOAL  
**Segment conditions**: `#TEAM-GOAL(111, 222) OR #MATCH-GOAL(0123)`

```javascript
{
  "request": {
    "auth": "auth_token",
    "name": "0123_GOAL",
    "conditions": [
      ["TEAM-GOAL", "IN", ["111", "222"]],
      ["MATCH-GOAL", "IN", ["0123"]]
    ],
    "operator": "OR", // optional. Operator values: 'AND', 'OR'
    "application" : "AAAAA-00000"
  }
}
```
이 요청은 챔피언스 리그 결승전(경기 ID=0123)의 골 업데이트를 구독한 사용자 또는 유벤투스나 레알 마드리드(팀 ID=111, 222)를 팔로우하는 사용자 세그먼트를 컴파일합니다.

Pushwoosh 컨트롤 패널에서 High-Speed Delivery를 설정하려면, 해당 태그 값으로 [새 세그먼트를 생성](/ko/product/audience-data-and-segmentation/segmentation/create-segments)하고 푸시를 보낼 앱에 연결하세요. 앱별 세그먼트는 타겟 세그먼트를 항상 최신 상태로 유지하기 위해 10분마다 사전 컴파일됩니다.

![새 세그먼트 생성](/push-notifications-high-speed-delivery-1.webp)

경기 이벤트(골 득점, 경기 킥오프, 레드카드 등)가 발생하면, 푸시 알림 콘텐츠와 세그먼트 이름이 포함된 [`/createMessage`](/ko/developer/api-reference/messages-api/#createmessage)를 호출하세요:

```json 
{
  "request": {
    "application": "AAAAA_00000",
    "auth": "auth_token",
    "notifications": [
      {
        "content": "12’ Juventus goal! Juventus 1 – 0 Real Madrid",
        "filter": "0123_GOAL",
        "send_date": "now"
      }
    ]
  }
}
```
[`/createMessage`](/ko/developer/api-reference/messages-api/#createmessage) 호출을 수신하면, 세그먼트 기준과 일치하는 사전 컴파일된 디바이스 목록을 이미 가지고 있으므로 즉시 APNs 및 FCM 게이트웨이로 알림을 전송합니다.
<Aside type="caution" title="중요">
*****
High-Speed Delivery 세그먼트는 **daysago** 연산자 사용을 지원하지 않습니다. 이 연산자를 사용하여 세그먼트를 생성하려고 하면 오류 메시지가 표시됩니다.

이 제한은 High-Speed Delivery 세그먼트가 제대로 작동하기 위해 사용자 디바이스의 앱에서 발생한 변경 사항(푸시 알림 구독 또는 특정 태그 값 설정 등)에 의존하기 때문에 존재합니다. **daysago** 연산자는 이러한 변경 사항을 포함하지 않으므로 세그먼트가 의도한 대로 작동하지 않습니다.
또한, High-Speed Delivery 세그먼트는 예약된 메시지(scheduled messages)와 함께 사용할 수 없습니다.
</Aside>

## 세그먼트 삭제

경기가 끝나면 더 이상 관련이 없는 세그먼트의 재컴파일에 컴퓨팅 리소스가 낭비되지 않도록 해당 세그먼트를 모두 삭제해야 합니다. 특히 다음에 예정된 경기의 세그먼트를 위해 리소스를 확보해야 합니다. [`/deleteFilter`](/ko/developer/api-reference/segmentation-filters-api/#deletefilter) API 요청을 통해 세그먼트를 삭제하세요. 예를 들면 다음과 같습니다:

```json
{
  "request": {
    "auth": "auth_token",
    "name": "0123_GOAL"
  }
}

```
수동 세그먼트 삭제를 피하려면 [`/createFilter`](/ko/developer/api-reference/segmentation-filters-api/#createfilter) 요청을 통해 세그먼트 만료 날짜를 설정하여 지정된 날짜에 세그먼트가 자동으로 삭제되도록 하세요:

```javascript
{
  "request": {
    "auth": "auth_token",
    "name": "0123_GOAL",
    "conditions": [
      ["TEAM-GOAL", "IN", ["111", "222"]],
      ["MATCH-GOAL", "IN", ["0123"]]
    ],
    "operator": "OR",  // optional. Values: 'AND', 'OR'
    "application": "AAAAA-00000",
    "expiration_date": "YYYY-MM-DD"  // optional. Segment (Filter) expiry
  }
}
```