# 태그

태그는 Pushwoosh가 제공하는 가장 유용한 도구 중 하나로, 다양한 정교한 기능을 사용할 수 있게 해줍니다. 태그를 사용하면 잠재고객을 세분화하고 속성에 따라 특정 사용자에게 타겟 푸시 알림을 보낼 수 있습니다.

태그는 특정 사용자 또는 기기와 관련된 임의의 데이터를 포함할 수 있습니다. 이 데이터에는 사용자 이름, ID, 도시, 좋아하는 축구팀, 선호하는 뉴스 카테고리 또는 사용자에 대한 기타 관련 정보가 포함될 수 있습니다.

## 사용할 태그 결정하기

먼저 비즈니스 요구 사항을 파악하고 잠재고객을 어떻게 세분화할지 결정하는 것부터 시작하세요. 연령, 위치, 인앱 구매 내역 또는 사용자를 타겟팅하기 위한 기타 관련 기준과 같은 요소를 고려하세요.
<Aside type="tip">
마케팅 목표 및 잠재고객 세분화 전략에 가장 적합한 태그를 결정하는 데 도움이 되도록 이 과정에 마케팅팀이 참여해야 할 수도 있습니다.
</Aside>

## 태그 값

태그 값은 푸시 캠페인을 더 스마트하게 만드는 데 도움이 될 수 있습니다. 각 태그는 _거의 무한한 수의 값_을 저장할 수 있습니다. 기본적으로 이는 하나의 태그만으로도 데이터베이스에 있는 각 최종 사용자에 대한 특정 유형의 정보를 기록하기에 충분하다는 것을 의미합니다.

각 계정에는 몇 개의 태그만 사용할 수 있지만, 각 태그에 거의 무한한 공간이 있다는 점을 고려하면 단 몇 개의 태그만으로도 사용자에 대한 방대한 양의 정보를 수집하고 매우 복잡한 타겟팅 패턴을 설정할 수 있습니다.

## 태그 유형

*   **Integer** — 정수 데이터에 사용됩니다 (게임 내 현금 획득량, 달성 레벨, 나이).
*   **String** — 문자열 값에 사용됩니다 (사용자 이름, 이메일, 식별자).
*   **List** — String 유형과 동일하지만, 각 사용자는 동시에 여러 값을 설정할 수 있습니다 (음악 선호도, 뉴스 카테고리, 요리 선호도).
*   **Boolean** — 참/거짓 유형의 태그입니다.
*   **Date** — 달력 날짜에 사용됩니다. 기본적으로 이것은 Unix Epoch 타임스탬프를 저장하는 정수 유형 태그입니다 (그레고리력 날짜에서/로 자동 변환됨).
*   **Price** — "\*.XX" 형식으로 지정된 통화에 따라 값을 설정할 수 있습니다 [자세히 알아보기](https://en.wikipedia.org/wiki/ISO_4217).
*   **Version** — 버전 관리에 사용됩니다. 허용되는 형식의 예는 w.x.y.z (Major.Minor.Patch.Build)입니다. 각 버전 부분의 최대값은 9999이므로 최대 버전 번호는 9999.9999.9999.9999보다 클 수 없습니다.

### 태그 연산자

각 태그 유형에는 적용 가능한 특정 **연산자** 집합이 있습니다. 태그 연산자는 세분화 목적으로 태그와 그 값 사이의 관계를 정의합니다.

*   Integer 태그 연산자: `is`, `is not`, `are`, `not in`, `not set`, `any`
*   String 태그 연산자: `is`, `is not`, `are`, `not in`, `not set`, `any`
*   List 태그 연산자: `in`, `not in`, `not set`, `any`
*   Boolean 태그 연산자: `is` (true/false), `not set`, `any`
*   Date 태그 연산자: `exactly on`, `on or after`, `on or before`, `between`, `not set`, `any`
*   Price 태그 연산자: `is`, `is not`, `greater or equals`, `less or equals`, `between`, `in`, `not in`, `not set`, `any`
*   Version 태그 연산자: `is`, `is not`, `greater or equals`, `less or equals`, `between`, `in`, `not in`, `not set`, `any`

<Aside type="note">
"Not set" 및 "any" 연산자는 모든 유형의 태그에 사용할 수 있습니다.
</Aside>

## 태그 범위: 일반 대 사용자별

태그를 생성할 때 값이 저장되는 방식을 선택합니다:

-   **일반** (기본값, `user_specific: false`): 태그 값은 기기(HWID)별로 저장됩니다. 동일한 사용자의 각 기기는 독립적으로 다른 값을 가질 수 있습니다.
-   **사용자별** (`user_specific: true`): 태그 값은 사용자(UserID)별로 저장됩니다. UserID를 통해 설정하면 해당 값은 사용자의 모든 기기에 한 번에 적용됩니다. 구독 등급, 로열티 포인트, 선호 언어와 같이 특정 기기가 아닌 개인에게 속한 속성에 유용합니다.

### 예시

한 사용자가 앱의 iOS 및 Android 버전을 모두 설치했습니다. UserID를 통해 `subscription_tier` 태그를 `"premium"`으로 설정하면 두 기기에 즉시 적용됩니다. 일반 태그를 사용하면 기기별로 별도로 설정해야 합니다.

```javascript title="예시: UserID를 통해 사용자별 태그 설정하기"
{
   "request":{
      "application": "XXXXX-XXXXX",
      "userId": "the id of a specific user",
      "tags": {
           "subscription_tier": "premium",
           "loyalty_points": 350
      }
   }
}
```

## 기본 태그

이러한 태그는 Pushwoosh에서 기본적으로 제공되므로 수동으로 설정할 필요가 없습니다(실제로 설정해서는 안 됩니다). 대부분은 애플리케이션에서 설정되어 [`registerDevice`](/ko/developer/api-reference/device-api/) 및 기타 API 호출을 통해 저희 서버로 전송되며, 일부는 서버 자체에서 설정됩니다.

| 이름 | 유형 | 설정 위치 | 설명 |
| ------------------------- | ------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Application Version | Version | SDK | 기기에 설치된 앱의 현재 버전 |
| Browser Type | String | SDK | 웹 프로젝트에 기기가 등록되면 모바일 또는 데스크톱 유형이 자동으로 추적됩니다 |
| City | String | Server | 기기의 마지막으로 등록된 지리적 위치 |
| Country | String | Server | 기기의 마지막으로 등록된 지리적 위치 |
| Device Model | String | SDK | 앱이 설치된 기기 모델을 나타냅니다 |
| First Install | Date | Server | 기기가 처음으로 알림에 등록된 시간을 나타냅니다 |
| In-App Product | List | SDK | 앱 사용자가 구매한 인앱 상품 |
| Last In-App Purchase Date | Date | SDK | 기기에서 마지막으로 인앱 구매가 이루어진 날짜 |
| Language | String | SDK | ISO-639-1에 따른 기기 로케일의 두 글자 소문자 약어; 기기 설정에서 가져옴 |
| Last Application Open | Date | Server | 기기에서 가장 최근에 앱을 실행한 시간 |
| Last Email Open | Date | Server | 기기의 이메일 주소에서 가장 최근에 이메일 열람 이벤트를 등록한 날짜 |
| Last Email Open Message Code | String | Server | 가장 최근에 열린 이메일의 [메시지 코드](/ko/developer/api-reference/api-identifiers#message-code) (`XXXX-XXXXXXXX-XXXXXXXX` 형식). 각 [`PW_EmailOpen`](/ko/product/audience-data-and-segmentation/events/default-events/#pw_emailopen) 이벤트 시 업데이트됩니다. 특정 이메일 캠페인의 수신자 중 이메일을 연 사람을 기준으로 세분화하는 데 사용하세요 |
| Last Email Click | Date | Server | 기기의 이메일 주소에서 가장 최근에 이메일 링크 클릭을 등록한 날짜 |
| Last Email Click Message Code | String | Server | 링크가 클릭된 가장 최근 이메일의 [메시지 코드](/ko/developer/api-reference/api-identifiers#message-code) (`XXXX-XXXXXXXX-XXXXXXXX` 형식). 각 [`PW_EmailLinkClicked`](/ko/product/audience-data-and-segmentation/events/default-events/#pw_emaillinkclicked) 이벤트 시 업데이트됩니다. 특정 이메일 캠페인의 수신자 중 클릭한 사람을 기준으로 세분화하는 데 사용하세요 |
| Last Email Confirm | Date | Server | 기기의 이메일 주소에 대한 가장 최근의 이중 옵트인 구독 확인 날짜 |
| Bounced Email | Date | Server | 이 이메일 주소에 대해 하드 바운스가 발생한 날짜. 시간 기반 세분화를 활성화하기 위해 날짜로 저장됩니다(예: 최근 바운스가 있는 사용자 제외) |
| Unsubscribed Emails | Boolean | SDK | 사용자가 앱에서 이메일 수신을 거부했는지 여부를 나타냅니다 |
| OS Version | Version | SDK | 기기에서 실행 중인 운영 체제의 버전 |
| Platform | String | SDK | 사용자가 프로젝트를 사용하고 있는 플랫폼입니다. |
| Push Alerts Enabled | Boolean | SDK | 기기 설정에서 푸시 알림이 허용되는지 여부를 나타냅니다 |
| SDK Version | Version | SDK | 기기에 구현된 Pushwoosh SDK의 버전 |

## 사용자 지정 태그

여기서 특정 비즈니스 목표를 달성하기 위해 창의력을 발휘할 수 있습니다. 사용자 지정 태그는 고유한 비즈니스 요구에 적합한 세분화 논리 또는 타겟팅 패턴을 기반으로 생성할 수 있습니다. 마케팅팀과 협력하여 캠페인에 필요한 추가 사용자 지정 태그를 정의하세요.

### 사용자 지정 태그 설정 방법

[Pushwoosh 제어판](/ko/product/audience-data-and-segmentation/user-data-tags/tags)에서 새 태그를 추가하거나 [`/addTag`](/ko/developer/api-reference/tags#addtag) 메서드를 사용할 수 있습니다.

#### addTag

`POST` `https://api.pushwoosh.com/json/1.3/addTag`

계정에 태그를 생성합니다.

#### 요청 본문

| 이름 | 유형 | 설명 |
| ------------------------------------------ | ------- | -------------------------------------------------------------------------------------------------------- |
| auth* | string | Pushwoosh 제어판의 API 액세스 토큰. |
| tag* | object | 태그 매개변수. |
| tag.name* | string | 태그 이름. |
| tag.type* | integer | 태그 유형. 아래에서 가능한 값을 참조하세요. |
| tag.user\_specific | boolean | `true`인 경우 태그 값은 사용자 수준에 저장되며 UserID로 설정 시 사용자의 모든 기기에서 공유됩니다. `false`(기본값)인 경우 태그는 기기 수준이며 HWID별로 설정됩니다. |

<Tabs>
<TabItem label="200">
```javascript
{
    "status_code": 200,
    "status_message": "OK",
    "response": {
        "result": true
    }
}
```
</TabItem>
</Tabs>

```javascript title="예시"
{
  "request": {
    "auth": "yxoPUlwqm…………pIyEX4H", // 필수, Pushwoosh 제어판의 API 액세스 토큰
    "tag": {
      "name": "TAG_NAME",    // 필수
      "type": 1,             // 필수, 아래 가능한 값 참조
      "user_specific": false // 선택. true = 사용자 수준; false = 기기 수준(기본값)
    }
  }
}
```

**가능한 태그 값 유형:**

*   1 - Integer
*   2 - String
*   3 - List
*   4 - Date
*   5 - Boolean
*   6 - Decimal. 예: 19.95
*   7 - Version. 예: "1.0.0.0"

### 사용자로부터 정보 수집 방법

태그를 추가하고 구성하면 사용자로부터 정보를 수집할 준비가 된 것입니다. 이를 구현하려면 다음 단계를 따르세요:

1.  관련 통합 가이드에 따라 [Pushwoosh SDK](/ko/developer/pushwoosh-sdk/pushwoosh-sdk-overview/)를 프로젝트에 통합합니다.
2.  [`setTags`](/ko/developer/api-reference/device-api/#settags) 함수를 사용하여 태그를 할당하고 사용자 데이터를 수집합니다.

아래는 [`setTags`](/ko/developer/api-reference/device-api/#settags) 함수를 사용하는 다양한 프레임워크에 대한 구현 예시입니다.

<Tabs>

<TabItem label="iOS 네이티브">

<Card title="iOS 네이티브">
```objective-c
NSDictionary *tags = @{ 
    @"Alias" : aliasField.text,
    @"FavNumber" : @([favNumField.text intValue]),
    @"price" : [PWTags incrementalTagWithInteger:5],
    @"List" : @[ @"Item1", @"Item2", @"Item3" ]
};

[[PushNotificationManager pushManager] setTags:tags];
```

[문서](https://pushwoosh.github.io/pushwoosh-ios-sdk/PushwooshiOS/documentation/pushwooshframework/pushwoosh/settags(_:)/)

</Card>

</TabItem>

<TabItem label="안드로이드 네이티브">

<Card title="안드로이드 네이티브">
```java
pushwoosh.setTags(Tags.intTag("intTag", 42));
```

[문서](https://pushwoosh.github.io/pushwoosh-android-sdk/pushwoosh/com.pushwoosh/-pushwoosh/set-tags.html)

</Card>

</TabItem>

<TabItem label="Cordova">

<Card title="Cordova">
```
PushNotification.prototype.setTags = function(  config, success, fail  )
```

[문서](/ko/developer/pushwoosh-sdk/cross-platform-frameworks/cordova/cordova-plugin-api-reference/#settags)

</Card>

</TabItem>

<TabItem label="Flutter">

<Card title="Flutter">
```dart
Future<void> setTags(Map tags) async {
  await _channel.invokeMethod("setTags", {"tags" : tags});
}
```

[문서](https://pub.dev/documentation/pushwoosh_flutter/latest/pushwoosh_flutter/Pushwoosh/setTags.html)

</Card>

</TabItem>

<TabItem label="React Native">

<Card title="React Native">
```javascript
pushNotification.setTags({ 
    "string_tag" : "Hello world", 
    "int_tag" : 42, 
    "list_tag":["hello", "world"] 
});
```

[문서](https://github.com/Pushwoosh/pushwoosh-react-native-plugin/blob/master/docs/README.md#settags)

</Card>

</TabItem>

</Tabs>

<Tabs>

<TabItem label="Unity">

<Card title="Unity">

##### **SetIntTag**
기기에 Integer 태그를 설정합니다.

```csharp
public virtual void SetIntTag(string tagName, int tagValue)
```

##### **SetStringTag**
기기에 String 태그를 설정합니다.

```csharp
public virtual void SetStringTag(string tagName, string tagValue)
```

##### **SetListTag**
기기에 List 태그를 설정합니다.

```csharp
public virtual void SetListTag(string tagName, List<object> tagValues)
```
[문서](https://github.com/Pushwoosh/pushwoosh-unity/blob/master/Documentation/README.md#pushwoosh)
</Card>

</TabItem>

<TabItem label="Unreal Engine">

<Card title="Unreal Engine">
```cpp
FPushwooshModule& pushwoosh = FPushwooshModule::Get();
pushwoosh.SetTags("{ \"intTag\" : 1, \"stringTag\" : \"example\", \"listTag\" : [ \"a\", \"b\", \"c\" ] }");
```

[문서](https://github.com/Pushwoosh/pushwoosh-unreal-engine/blob/master/Plugins/Pushwoosh/Documentation/README.md#settags)

</Card>

</TabItem>

<TabItem label="Expo">

<Card title="Expo">
```javascript
Pushwoosh.setTags({ "key": keyValue, "value": inputValue });
```

[문서](https://github.com/Pushwoosh/pushwoosh-expo-plugin-sample/blob/main/app/_layout.tsx#L296C17-L296C76)

</Card>

</TabItem>

<TabItem label=".NET MAUI">

<Card title=".NET MAUI">
```objective-c
NSDictionary *tags = @{ 
    @"Alias" : aliasField.text,
    @"FavNumber" : @([favNumField.text intValue]),
    @"price" : [PWTags incrementalTagWithInteger:5],
    @"List" : @[ @"Item1", @"Item2", @"Item3" ]
};
[[PushNotificationManager pushManager] setTags:tags];
```

[문서](https://github.com/Pushwoosh/pushwoosh-dotnet/blob/c40c0fd60cb5fe5c5016c46d677a779a5600f45f/PushwooshSDK.DotNet.iOS.Bindings/PushwooshFramework.xcframework/ios-arm64/PushwooshFramework.framework/Headers/PushNotificationManager.h#L380)

</Card>

</TabItem>

<TabItem label="Outsystems">
<Card title="Outsystems">

**입력 매개변수**
**Tags** – `TagName`과 `TagValue`를 포함하는 태그 레코드 목록.
  - `TagName`은 항상 **Text** 유형이어야 합니다.
  - `TagValue`는 **Text, Integer, Boolean, Date** 등이 될 수 있습니다.

[자세히 알아보기](/ko/developer/pushwoosh-sdk/cross-platform-frameworks/outsystems/pushwoosh-outsystems-plugin-client-actions#settags)

</Card>
</TabItem>

</Tabs>

### API를 통한 태그 설정
대부분의 경우(99%) 태그는 애플리케이션에서 설정되지만, Pushwoosh API를 통해서도 태그를 설정할 수 있습니다. 아래는 [`/setTags`](/ko/developer/api-reference/device-api#settags) 엔드포인트에 대한 일반적인 요청 예시입니다:

POST `https://api.pushwoosh.com/json/1.3/setTags`

```json
{
   "request": {
      "application": "XXXXX-XXXXX", // 필수, Pushwoosh 애플리케이션 코드
      "hwid": "8f65bXXXf378eXXXbeceXXX4e153XXX2", // 필수, /registerDevice API에서 사용되는 하드웨어 기기 ID
      "tags": { // 필수
           "StringTag": "string value", // 문자열 태그 예시
           "IntegerTag": 42, // 정수 태그 예시
           "ListTag": ["string1", "string2"], // 리스트 태그 예시
           "DateTag": "2024-10-02 22:11", // 참고: 시간은 UTC여야 합니다
           "BooleanTag": true // 유효한 값: true, false
      }
   }
}
```

[자세한 내용은 setTags API 문서를 참조하세요](/ko/developer/api-reference/device-api/#settags)

## 기본 **City** 태그 사용하기

기기의 위치는 해당 기기에서 마지막으로 앱이 실행된 순간의 IP 주소를 기반으로 결정됩니다. GeoIP는 위치 데이터를 Pushwoosh에 제출하고, Pushwoosh는 GeoIP에서 받은 위치를 특정 기기의 City 태그 값으로 저장합니다.

경우에 따라 GeoIP에서 제출한 위치가 도시 이름과 다를 수 있습니다. 예를 들어, 도시의 한 지역이나 다른 행정 단위를 가리키는 경우입니다. 세분화 목적으로 기본 City 태그를 사용할 때는 주의하세요: 올바른 값을 선택해야 합니다.

예를 들어, 뮌헨의 사용자를 타겟팅하려는 경우, "Munich" 자체(GeoIP에 의해 반환되고 태그 값으로 저장될 수 있는 다양한 철자 변형과 같은 모든 해당 값 포함)와 여러 인근 지역을 포함한 여러 City 태그 값으로 이를 포괄해야 합니다.

<Aside type="tip">
API를 통해 [세그먼트를 생성](/ko/developer/api-reference/segmentation-filters-api/)하기 전에, [/getTagStats](/ko/developer/api-reference/statistics-api/events-and-tags-statistics/#gettagstats) 요청을 통해 사용자들이 기기에 가지고 있는 값을 확인하세요.
</Aside>