# 유저 정보 식별

## 1. 유저 정보 설정 <a href="#set-identity" id="set-identity"></a>

SDK에서는 유저를 식별하고, 유저의 다양한 속성을 설정할 수 있는 메서드를 제공합니다. 해당 메서드의 역할은 크게 두 가지 입니다.

1. 유저의 정보를 기록하여 이후 액션에 활용합니다.
   1. 오디언스 세분화 시 조건으로 사용이 가능합니다. (예: 남자이면서 20대인 고객 오디언스 생성)
   2. 캠페인의 메세지 개인화 시에 사용합니다. (예: "`{{user.mkt_name}}`님, 회원가입을 환영합니다."
2. Marketap SDK로 하여금 현재 해당 유저가 연결된 상태라는 사실을 알려줍니다.
   1. SDK는 유저가 연결된 이후부터 발생하는 이벤트의 "user\_id" 값을 해당 유저의 id로 설정합니다.

{% hint style="danger" %}
등록하지 않으면 이후 발생하는 이벤트가 **유저에 연결되지 않아** **누락**될 수 있습니다. 유저와 기기간의 관계는 이 [문서](https://docs.marketap.io/t3ZS4WXNMj0HK27EtIMV/developer/taxonomy/sdk/user-profile/device)에서 자세하게 설명합니다.
{% endhint %}

{% hint style="danger" %}
**유저 ID는 반드시 문자열 타입이어야 합니다.** 숫자형을 사용하시는 경우 문자열로 변환하여 전달해주세요.
{% endhint %}

### 1-1 `identify()` 메서드

현재 식별된 유저의 정보를 마켓탭에 전송합니다. 이때, 이 유저의 id 값과 유저의 속성 값을 전달해야 합니다.

* User ID
  * 문자열로 제공해야 하며 필수값입니다.
* 유저 속성
  * 유저 속성 값은 필수 값이 아닙니다. 따라서, SDK에 user\_id를 연결하는 용도로 유저 id만 호출하여도 됩니다.
    * `Marketap.identify('USER_1234')`&#x20;

{% hint style="danger" %}
커스텀 속성을 사용할 때는 반드시 Marketap 콘솔의 텍소노미에서 해당 속성을 정의하세요. **콘솔에 정의되지 않은 커스텀 속성**은 분석 및 세그먼트 생성에서 무시됩니다.
{% endhint %}

{% hint style="danger" %}
유저 데이터를 연동할 때에는 반드시 유저의 **광고성 메세지 수신동의 여부**를 연동해주세요. 마켓탭은 아예 수집되지 않은 고객에 대해서 수신동의 여부를 **따로 체크하지 않습니다**. 명시적으로 "동의하지 않음"을 표시한 유저에 대해서만 광고 메세지 발송을 제한하고 있습니다. 자세한 내용은 [여기에서](https://docs.marketap.io/t3ZS4WXNMj0HK27EtIMV/developer/taxonomy/sdk/property#undefined) 확인해주세요.
{% endhint %}

{% tabs %}
{% tab title="JavaScript" %}

```javascript
mtap.identify('USER_1234', { // User id는 반드시 문자열이어야 합니다.
  mkt_name: 'John Doe',
  mkt_email: 'john@example.com',
  mkt_gender: 'male',
  mkt_cart: [{
    mkt_product_id: "PRODUCT_001",
    mkt_product_name: "Awesome Product (1)",
    mkt_product_price: 21000.00,
    mkt_quantity: 3,
  }, {
    mkt_product_id: "PRODUCT_002",
    mkt_product_name: "Awesome Product (2)",
    mkt_product_price: 15000.00,
    mkt_quantity: 1,
  }],
  mkt_coupons: [{
    mkt_coupon_id: "REGISTER_COUPON_1",
    mkt_coupon_name: "회원가입 환영 쿠폰(1)",
    mkt_issue_id: "REGISTER_COUPON_0002134",
    mkt_used_coupon: false,
    mkt_coupon_issued_at: "2025-01-01T05:39:22Z",
    mkt_coupon_expired_at: "2025-02-01T00:00:00Z"
  }],
  favorite_color: 'blue', // 커스텀 속성
  interests: ['sports', 'music'], // 커스텀 속성
});
```

{% endtab %}

{% tab title="Android - Kotlin" %}

```kotlin
Marketap.identify(
    userId = "USER_1234", // User id는 반드시 문자열이어야 합니다.
    properties = mapOf(
        "mkt_name" to "John Doe",
        "mkt_email" to "john@example.com",
        "mkt_gender" to "male",
        "mkt_cart" to listOf(
            mapOf(
                "mkt_product_id" to "PRODUCT_001",
                "mkt_product_name" to "Awesome Product (1)",
                "mkt_product_price" to 21000.00,
                "mkt_quantity" to 3
            ),
            mapOf(
                "mkt_product_id" to "PRODUCT_002",
                "mkt_product_name" to "Awesome Product (2)",
                "mkt_product_price" to 15000.00,
                "mkt_quantity" to 1
            )
        ),
        "mkt_coupons" to listOf(
            mapOf(
                "mkt_coupon_id" to "REGISTER_COUPON_1",
                "mkt_coupon_name" to "회원가입 환영 쿠폰(1)",
                "mkt_issue_id" to "REGISTER_COUPON_0002134",
                "mkt_used_coupon" to false,
                "mkt_coupon_issued_at" to "2025-01-01T05:39:22Z",
                "mkt_coupon_expired_at" to "2025-02-01T00:00:00Z"
            )
        ),
        "favorite_color" to "blue",  // 커스텀 속성
        "interests" to listOf("sports", "music")  // 커스텀 속성
    )
)
```

{% hint style="success" %}
Android SDK에서는 미리 정의된 속성에 대한 Builder 패턴을 지원합니다.
{% endhint %}

```kotlin
Marketap.identify(
    userId = "USER_1234",
    properties = UserProperty.Builder()
        .setName("John Doe")
        .setEmail("john@example.com")
        .setGender(Gender.Male)
        .setPhoneNumber("01012345678")
        .setGrade("VIP")
        .setDateOfBirth(1990, 1, 1)
        .setTextMessageOptIn(true)
        .setCart(
            listOf(
                Item.Builder()
                    .setProductId("PRODUCT_001")
                    .setProductName("Awesome Product (1)")
                    .setProductPrice(21000.00)
                    .setQuantity(3)
                    .build(),
                Item.Builder()
                    .setProductId("PRODUCT_002")
                    .setProductName("Awesome Product (2)")
                    .setProductPrice(15000.00)
                    .setQuantity(1)
                    .build()
            )
        ).build()

```

{% endtab %}

{% tab title="Android - Java" %}

```java
Marketap.identify(
    "USER_1234", // User id는 반드시 문자열이어야 합니다.
    new HashMap<String, Object>() {{
        put("mkt_name", "John Doe");
        put("mkt_email", "john@example.com");
        put("mkt_gender", "male");

        // mkt_cart 리스트
        List<Map<String, Object>> cartList = new ArrayList<>();
        cartList.add(new HashMap<String, Object>() {{
            put("mkt_product_id", "PRODUCT_001");
            put("mkt_product_name", "Awesome Product (1)");
            put("mkt_product_price", 21000.00);
            put("mkt_quantity", 3);
        }});
        cartList.add(new HashMap<String, Object>() {{
            put("mkt_product_id", "PRODUCT_002");
            put("mkt_product_name", "Awesome Product (2)");
            put("mkt_product_price", 15000.00);
            put("mkt_quantity", 1);
        }});
        put("mkt_cart", cartList);

        // mkt_coupons 리스트
        List<Map<String, Object>> couponsList = new ArrayList<>();
        couponsList.add(new HashMap<String, Object>() {{
            put("mkt_coupon_id", "REGISTER_COUPON_1");
            put("mkt_coupon_name", "회원가입 환영 쿠폰(1)");
            put("mkt_issue_id", "REGISTER_COUPON_0002134");
            put("mkt_used_coupon", false);
            put("mkt_coupon_issued_at", "2025-01-01T05:39:22Z");
            put("mkt_coupon_expired_at", "2025-02-01T00:00:00Z");
        }});
        put("mkt_coupons", couponsList);

        // 커스텀 속성
        put("favorite_color", "blue");

        // interests 리스트
        put("interests", Arrays.asList("sports", "music"));
    }}
);
```

{% hint style="success" %}
Android SDK에서는 미리 정의된 속성에 대한 Builder 패턴을 지원합니다.
{% endhint %}

```java
Marketap.identify(
    "USER_1234",
    new UserProperty.Builder()
        .setName("John Doe")
        .setEmail("john@example.com")
        .setGender(Gender.Male)
        .setPhoneNumber("01012345678")
        .setGrade("VIP")
        .setDateOfBirth(1990, 1, 1)
        .setTextMessageOptIn(true)
        .setCart(
            Arrays.asList(
                new Item.Builder()
                    .setProductId("PRODUCT_001")
                    .setProductName("Awesome Product (1)")
                    .setProductPrice(21000.00)
                    .setQuantity(3)
                    .build(),
                new Item.Builder()
                    .setProductId("PRODUCT_002")
                    .setProductName("Awesome Product (2)")
                    .setProductPrice(15000.00)
                    .setQuantity(1)
                    .build()
            )
        )
        .build()
);
```

{% endtab %}

{% tab title="IOS - Swift" %}

```swift
Marketap.identify(
    userId: "USER_1234", // User id는 반드시 문자열이어야 합니다.
    userProperties: [
        "mkt_name": "John Doe",
        "mkt_email": "john@example.com",
        "mkt_gender": "male",
        "mkt_cart": [
            [
                "mkt_product_id": "PRODUCT_001",
                "mkt_product_name": "Awesome Product (1)",
                "mkt_product_price": 21000.00,
                "mkt_quantity": 3
            ],
            [
                "mkt_product_id": "PRODUCT_002",
                "mkt_product_name": "Awesome Product (2)",
                "mkt_product_price": 15000.00,
                "mkt_quantity": 1
            ]
        ],
        "mkt_coupons": [
            [
                "mkt_coupon_id": "REGISTER_COUPON_1",
                "mkt_coupon_name": "회원가입 환영 쿠폰(1)",
                "mkt_issue_id": "REGISTER_COUPON_0002134",
                "mkt_used_coupon": false,
                "mkt_coupon_issued_at": "2025-01-01T05:39:22Z",
                "mkt_coupon_expired_at": "2025-02-01T00:00:00Z"
            ]
        ],
        "favorite_color": "blue", // 커스텀 속성
        "interests": ["sports", "music"] // 커스텀 속성
    ]
)
```

{% endtab %}

{% tab title="Flutter - Dart" %}

```dart
Marketap.identify(
  userId: "USER_1234", // User id는 반드시 문자열이어야 합니다.
  userProperties: {
    "mkt_name": "John Doe",
    "mkt_email": "john@example.com",
    "mkt_gender": "male",
    "mkt_cart": [
      {
        "mkt_product_id": "PRODUCT_001",
        "mkt_product_name": "Awesome Product (1)",
        "mkt_product_price": 21000.00,
        "mkt_quantity": 3,
      },
      {
        "mkt_product_id": "PRODUCT_002",
        "mkt_product_name": "Awesome Product (2)",
        "mkt_product_price": 15000.00,
        "mkt_quantity": 1,
      },
    ],
    "mkt_coupons": [
      {
        "mkt_coupon_id": "REGISTER_COUPON_1",
        "mkt_coupon_name": "회원가입 환영 쿠폰(1)",
        "mkt_issue_id": "REGISTER_COUPON_0002134",
        "mkt_used_coupon": false,
        "mkt_coupon_issued_at": "2025-01-01T05:39:22Z",
        "mkt_coupon_expired_at": "2025-02-01T00:00:00Z",
      }
    ],
    "favorite_color": "blue", // 커스텀 속성
    "interests": ["sports", "music"], // 커스텀 속성
  },
);

```

{% endtab %}
{% endtabs %}

### 1-2 `login()` 함수와의 관계

`login()` 메서드는 **유저를 식별**함과 동시에 **로그인 이벤트를 자동으로 트래킹**하는 기능을 포함하고 있습니다.

즉, 아래와 같은 두 가지 과정을 한 번에 처리합니다:

1. `identify(userId, userProperties)`
2. `track("mkt_login", eventProperties)`

따라서 함수 호출 시, 유저id, 유저 속성, 이벤트 속성을 모두 인자로 받습니다. 마찬가지로 유저 속성과 이벤트 속성은 선택값이며 없는 경우 `Marketap.login(user.id)` 와 같은 형식으로도 사용이 가능합니다.

{% tabs %}
{% tab title="JavaScript" %}

```javascript
mtap.login(user.id); // "USER_ID_1234", User id는 반드시 문자열이어야 합니다.
```

{% endtab %}

{% tab title="Android - Kotlin" %}

```kotlin
Marketap.login(user.id); // "USER_ID_1234", User id는 반드시 문자열이어야 합니다.
```

{% endtab %}

{% tab title="Android - Java" %}

```java
Marketap.login(user.id); // "USER_ID_1234", User id는 반드시 문자열이어야 합니다.
```

{% endtab %}

{% tab title="IOS - Swift" %}

```swift
Marketap.login(userId: user.id) // "USER_ID_1234", User id는 반드시 문자열이어야 합니다.
```

{% endtab %}

{% tab title="Flutter - Dart" %}

```swift
Marketap.login(userId: user.id); // "USER_ID_1234", User id는 반드시 문자열이어야 합니다.
```

{% endtab %}
{% endtabs %}

## 2. 유저 정보 설정 해제 <a href="#reset-identity" id="reset-identity"></a>

유저가 로그아웃하거나, 더 이상 특정 유저와 연결된 상태로 이벤트를 수집하지 않아야 하는 경우, Marketap SDK에서는 유저 식별 정보를 명시적으로 해제해야 합니다.

SDK에 유저가 연결된 상태가 유지되면, 이후 발생하는 이벤트는 해당 유저의 `user_id`로 기록됩니다. 따라서 로그아웃 등 식별이 불필요한 상황에서는 반드시 아래 메서드를 호출하여 식별을 초기화해야 합니다.

{% hint style="danger" %}
이 과정을 생략하면 이후 **비회원 유저의 이벤트가 이전 유저에 잘못 연결**될 수 있습니다. 유저와 기기간의 관계는 이 [문서](https://docs.marketap.io/t3ZS4WXNMj0HK27EtIMV/developer/taxonomy/sdk/user-profile/device)에서 자세하게 설명합니다.
{% endhint %}

### 2-1 `resetIdentity()` 함수

* 기기에 등록된 유저의 식별 정보를 초기화하고, 비식별 상태로 전환합니다.

{% hint style="info" %}
**이 함수는 유저를 삭제하지 않습니다.** 유저에 관련된 속성과 정보는 계속 기록되어 있으며, 해당 기기와 유저의 연결만 해제합니다. 마켓탭의 기기-유저에 대한 내용은 [여기 문서](https://docs.marketap.io/t3ZS4WXNMj0HK27EtIMV/developer/taxonomy/sdk/user-profile/device)에서, 마켓탭의 유저 삭제에 대한 내용은 여기 문서에서 확인해주세요.
{% endhint %}

{% tabs %}
{% tab title="JavaScript" %}

```javascript
mtap.resetIdentity();
```

{% endtab %}

{% tab title="Android - Kotlin" %}

```kotlin
Marketap.resetIdentity()
```

{% endtab %}

{% tab title="Android - Java" %}

```java
Marketap.resetIdentity()
```

{% endtab %}

{% tab title="IOS - Swift" %}

```swift
Marketap.resetIdentity()
```

{% endtab %}

{% tab title="Flutter - Dart" %}

```dart
Marketap.resetIdentity()
```

{% endtab %}
{% endtabs %}

### 2-2 `logout()` 함수와의 관계

`logout()` 메서드는 내부적으로 `resetIdentity()`를 포함하고 있으며, 유저의 식별 정보를 해제함과 동시에 **로그아웃 이벤트를 자동으로 트래킹**하는 기능을 포함하고 있습니다.

즉, 아래와 같은 두 가지 과정을 한 번에 처리합니다:

1. `resetIdentity()`
2. `track("mkt_logout", eventProperties)`

따라서 함수 호출 시, 로그아웃 이벤트에 첨부할 **이벤트 속성**을 선택적으로 전달할 수 있습니다. 속성이 없는 경우에는 아래와 같이 간단하게 호출할 수 있습니다:

{% tabs %}
{% tab title="JavaScript" %}

```javascript
mtap.logout();
```

{% endtab %}

{% tab title="Android - Kotlin" %}

```kotlin
Marketap.logout()
```

{% endtab %}

{% tab title="Android - Java" %}

```java
Marketap.logout()
```

{% endtab %}

{% tab title="IOS - Swift" %}

```swift
Marketap.logout()
```

{% endtab %}

{% tab title="Flutter - Dart" %}

```dart
Marketap.logout()
```

{% endtab %}
{% endtabs %}

## 3. 관련 문서

로그인/로그아웃 이벤트관련 내용은 아래 문서에서 더 자세하게 확인하세요.

{% content-ref url="event/predefined/login-logout" %}
[login-logout](https://docs.marketap.io/t3ZS4WXNMj0HK27EtIMV/developer/taxonomy/sdk/event/predefined/login-logout)
{% endcontent-ref %}

유저가 식별/비식별됨에 따른 유저 및 기기간의 관계에 대한 흐름은 아래 문서에서 더 자세하게 확인하세요.

{% content-ref url="user-profile/device" %}
[device](https://docs.marketap.io/t3ZS4WXNMj0HK27EtIMV/developer/taxonomy/sdk/user-profile/device)
{% endcontent-ref %}

## 4. 검증하기

[테스트 및 디버깅](https://docs.marketap.io/t3ZS4WXNMj0HK27EtIMV/developer/taxonomy/validation) 페이지로 이동해주세요.
