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

# 타겟팅 설정

> 오디언스 타겟팅과 문맥 타겟팅을 설정하는 방법을 안내합니다.

## 개요

Adrop SDK는 두 가지 타입의 타겟팅을 지원합니다:

* **오디언스 타겟팅**: 사용자 속성(성별, 연령, 관심사 등)을 기반으로 광고를 타겟팅
* **문맥 타겟팅**: 콘텐츠나 화면의 문맥에 따라 광고를 타겟팅

타겟팅을 활용하면 사용자에게 더 관련성 높은 광고를 보여줄 수 있으며, 광고주는 원하는 대상에게 효과적으로 광고를 전달할 수 있습니다.

***

## 오디언스 타겟팅

사용자 속성을 기반으로 광고를 타겟팅할 수 있습니다.

### 1. 타겟팅 생성

먼저 애드컨트롤 콘솔에서 오디언스 타겟팅을 생성하세요.

<Card title="타겟팅 생성하기" icon="bullseye" href="/ko/targeting/audience">
  콘솔에서 오디언스 타겟팅 생성 방법 확인
</Card>

### 2. 사용자 ID 설정

광고 렌더링 전에 사용자 식별자를 설정해야 합니다.

<CodeGroup>
  ```swift Swift theme={null}
  import AdropAds

  // 로그인 후 사용자 ID 설정
  Adrop.setUID("user_id")
  ```

  ```objc Objective-C theme={null}
  @import AdropAds;

  // 로그인 후 사용자 ID 설정
  [Adrop setUID:@"user_id"];
  ```
</CodeGroup>

<Note>
  타겟팅 광고가 정상 동작하려면 광고 지면 진입 전에 UID를 설정하세요.
</Note>

### 3. 사용자 프로퍼티 설정

사용자 속성을 설정하면 더 정교한 타겟팅이 가능합니다.

<CodeGroup>
  ```swift Swift theme={null}
  import AdropAds

  // 기본 제공 속성 설정
  AdropMetrics.setProperty(key: AdropKey.GENDER, value: AdropValue.AdropGender.MALE)
  AdropMetrics.setProperty(key: AdropKey.AGE, value: 30)
  AdropMetrics.setProperty(key: AdropKey.BIRTH, value: "19931225")

  // 커스텀 속성 설정 (콘솔에서 등록 필요)
  AdropMetrics.setProperty(key: "membership", value: "premium")
  AdropMetrics.setProperty(key: "interest_tech", value: true)
  AdropMetrics.setProperty(key: "last_purchase_date", value: "2024-01-15")
  ```

  ```objc Objective-C theme={null}
  @import AdropAds;

  // 기본 제공 속성 설정
  [AdropMetrics setPropertyWithKey:AdropKeyGENDER value:AdropValueAdropGenderMALE];
  [AdropMetrics setPropertyWithKey:AdropKeyAGE value:@30];
  [AdropMetrics setPropertyWithKey:AdropKeyBIRTH value:@"19931225"];

  // 커스텀 속성 설정 (콘솔에서 등록 필요)
  [AdropMetrics setPropertyWithKey:@"membership" value:@"premium"];
  [AdropMetrics setPropertyWithKey:@"interest_tech" value:@YES];
  [AdropMetrics setPropertyWithKey:@"last_purchase_date" value:@"2024-01-15"];
  ```
</CodeGroup>

<Note>`setProperty()` 메서드는 `Encodable` 파라미터 타입으로 인해 Objective-C에서 제한적으로 사용될 수 있습니다. 가능하면 Swift에서 속성을 설정하세요.</Note>

<Warning>
  프로퍼티 값은 단일 값(String, Int, Double, Bool)만 지원합니다. 배열이나 딕셔너리는 지원하지 않습니다.
</Warning>

### 기본 제공 속성

SDK는 일반적으로 사용되는 속성에 대한 사전 정의된 키를 제공합니다.

#### AdropKey

| 키                 | 설명   | 값 타입                            |
| ----------------- | ---- | ------------------------------- |
| `AdropKey.GENDER` | 성별   | AdropValue.AdropGender          |
| `AdropKey.AGE`    | 연령   | Int                             |
| `AdropKey.BIRTH`  | 생년월일 | String (YYYY, YYYYMM, YYYYMMDD) |

#### AdropValue

성별에 대한 사전 정의된 값:

| 값                               | 설명     |
| ------------------------------- | ------ |
| `AdropValue.AdropGender.MALE`   | 남성     |
| `AdropValue.AdropGender.FEMALE` | 여성     |
| `AdropValue.AdropGender.OTHER`  | 기타     |
| `AdropValue.UNKNOWN`            | 알 수 없음 |

<CodeGroup>
  ```swift Swift 예시 theme={null}
  // 성별 설정
  AdropMetrics.setProperty(key: AdropKey.GENDER, value: AdropValue.AdropGender.MALE)
  AdropMetrics.setProperty(key: AdropKey.GENDER, value: AdropValue.AdropGender.FEMALE)
  AdropMetrics.setProperty(key: AdropKey.GENDER, value: AdropValue.AdropGender.OTHER)

  // 연령 설정
  AdropMetrics.setProperty(key: AdropKey.AGE, value: 25)

  // 생년월일 설정
  AdropMetrics.setProperty(key: AdropKey.BIRTH, value: "1999")         // 연도만
  AdropMetrics.setProperty(key: AdropKey.BIRTH, value: "199903")       // 연월
  AdropMetrics.setProperty(key: AdropKey.BIRTH, value: "19990315")     // 전체
  ```

  ```objc Objective-C 예시 theme={null}
  // 성별 설정
  [AdropMetrics setPropertyWithKey:AdropKeyGENDER value:AdropValueAdropGenderMALE];
  [AdropMetrics setPropertyWithKey:AdropKeyGENDER value:AdropValueAdropGenderFEMALE];
  [AdropMetrics setPropertyWithKey:AdropKeyGENDER value:AdropValueAdropGenderOTHER];

  // 연령 설정
  [AdropMetrics setPropertyWithKey:AdropKeyAGE value:@25];

  // 생년월일 설정
  [AdropMetrics setPropertyWithKey:AdropKeyBIRTH value:@"1999"];       // 연도만
  [AdropMetrics setPropertyWithKey:AdropKeyBIRTH value:@"199903"];     // 연월
  [AdropMetrics setPropertyWithKey:AdropKeyBIRTH value:@"19990315"];   // 전체
  ```
</CodeGroup>

### 커스텀 속성

콘솔에서 추가 등록한 속성을 설정할 수 있습니다. 모든 커스텀 속성의 키는 문자열이며, 값은 String, Int, Double, Bool 타입을 지원합니다.

<CodeGroup>
  ```swift Swift theme={null}
  // 문자열 값
  AdropMetrics.setProperty(key: "membership", value: "premium")
  AdropMetrics.setProperty(key: "favorite_category", value: "electronics")

  // 정수 값
  AdropMetrics.setProperty(key: "purchase_count", value: 5)
  AdropMetrics.setProperty(key: "loyalty_points", value: 1500)

  // 소수 값
  AdropMetrics.setProperty(key: "average_purchase", value: 49.99)

  // 불린 값
  AdropMetrics.setProperty(key: "is_subscribed", value: true)
  AdropMetrics.setProperty(key: "newsletter_opt_in", value: false)

  // nil을 전달하면 프로퍼티 삭제
  AdropMetrics.setProperty(key: "membership", value: nil)
  ```

  ```objc Objective-C theme={null}
  // 문자열 값
  [AdropMetrics setPropertyWithKey:@"membership" value:@"premium"];
  [AdropMetrics setPropertyWithKey:@"favorite_category" value:@"electronics"];

  // 정수 값
  [AdropMetrics setPropertyWithKey:@"purchase_count" value:@5];
  [AdropMetrics setPropertyWithKey:@"loyalty_points" value:@1500];

  // 소수 값
  [AdropMetrics setPropertyWithKey:@"average_purchase" value:@49.99];

  // 불린 값
  [AdropMetrics setPropertyWithKey:@"is_subscribed" value:@YES];
  [AdropMetrics setPropertyWithKey:@"newsletter_opt_in" value:@NO];

  // nil을 전달하면 프로퍼티 삭제
  [AdropMetrics setPropertyWithKey:@"membership" value:nil];
  ```
</CodeGroup>

<Warning>
  커스텀 속성을 사용하기 전에 반드시 콘솔에서 해당 속성을 먼저 등록해야 합니다.
</Warning>

### 제약 사항

프로퍼티 설정 시 다음 제약 사항에 유의하세요:

* **단일 값만 지원**: 배열(`[String]`, `[Int]`)이나 딕셔너리(`[String: Any]`)는 지원하지 않습니다.
* **지원 타입**: String, Int, Double, Bool만 사용 가능합니다.
* **키 길이**: 최대 64자.
* **값 길이**: 문자열 값 최대 256자.
* **최대 프로퍼티 수**: 사용자당 최대 256개.
* **사전 등록 필요**: 커스텀 속성은 콘솔에서 먼저 등록해야 합니다.

```swift theme={null}
// ❌ 잘못된 사용 (배열/딕셔너리)
AdropMetrics.setProperty(key: "interests", value: ["tech", "gaming"])  // 지원 안함
AdropMetrics.setProperty(key: "profile", value: ["age": 25])          // 지원 안함

// ✅ 올바른 사용
AdropMetrics.setProperty(key: "interest_tech", value: true)
AdropMetrics.setProperty(key: "interest_gaming", value: true)
AdropMetrics.setProperty(key: "age", value: 25)
```

***

## 이벤트 트래킹

사용자 행동 이벤트를 추적하여 사용자 활동 기반의 오디언스를 구축할 수 있습니다. `AdropMetrics.sendEvent()`를 사용하여 이벤트를 전송합니다.

<Note>
  `logEvent()`는 더 이상 사용되지 않습니다(deprecated). 대신 `sendEvent()`를 사용하세요.
</Note>

### 이벤트 전송

<CodeGroup>
  ```swift Swift theme={null}
  import AdropAds

  // 단순 이벤트 (파라미터 없음)
  AdropMetrics.sendEvent(name: "app_open")

  // 파라미터가 있는 이벤트
  AdropMetrics.sendEvent(name: "view_item", params: [
      "item_id": "SKU-123",
      "item_name": "Widget",
      "item_category": "Electronics",
      "price": 29.99
  ])
  ```

  ```objc Objective-C theme={null}
  @import AdropAds;

  // 단순 이벤트 (파라미터 없음)
  [AdropMetrics sendEventWithName:@"app_open" params:nil];

  // 파라미터가 있는 이벤트
  [AdropMetrics sendEventWithName:@"view_item"
                           params:@{
                               @"item_id": @"SKU-123",
                               @"item_name": @"Widget",
                               @"item_category": @"Electronics",
                               @"price": @29.99
                           }];
  ```
</CodeGroup>

### 다중 아이템 이벤트

여러 아이템이 포함된 이벤트(예: purchase, begin\_checkout)의 경우, `"items"` 키 아래에 딕셔너리 배열을 전달합니다.

<CodeGroup>
  ```swift Swift theme={null}
  import AdropAds

  AdropMetrics.sendEvent(name: "purchase", params: [
      "tx_id": "tx_123",
      "currency": "KRW",
      "items": [
          ["item_id": "A", "item_name": "Product A", "price": 100, "quantity": 1],
          ["item_id": "B", "item_name": "Product B", "price": 200, "quantity": 2]
      ]
  ])
  ```

  ```objc Objective-C theme={null}
  @import AdropAds;

  [AdropMetrics sendEventWithName:@"purchase"
                           params:@{
                               @"tx_id": @"tx_123",
                               @"currency": @"KRW",
                               @"items": @[
                                   @{@"item_id": @"A", @"item_name": @"Product A", @"price": @100, @"quantity": @1},
                                   @{@"item_id": @"B", @"item_name": @"Product B", @"price": @200, @"quantity": @2}
                               ]
                           }];
  ```
</CodeGroup>

### 지원되는 이벤트 예시

| 이벤트 이름            | 설명       | 주요 파라미터                                     |
| ----------------- | -------- | ------------------------------------------- |
| `app_open`        | 앱 실행     | —                                           |
| `sign_up`         | 회원가입     | `method`                                    |
| `view_item`       | 아이템 조회   | `item_id`, `item_name`, `price`             |
| `add_to_cart`     | 장바구니 추가  | `item_id`, `item_name`, `price`, `quantity` |
| `add_to_wishlist` | 위시리스트 추가 | `item_id`, `item_name`, `price`             |
| `begin_checkout`  | 결제 시작    | `currency`, `items`                         |
| `purchase`        | 구매 완료    | `tx_id`, `currency`, `items`                |
| `page_view`       | 페이지 조회   | `page_id`, `page_category`                  |
| `click`           | 요소 클릭    | `element_id`, `element_type`                |

<Note>
  * 이벤트 이름은 1\~64자여야 합니다.
  * 파라미터 키는 1\~64자여야 합니다.
  * 문자열 파라미터 값은 최대 1024자까지 가능합니다.
  * 동일한 이름과 파라미터를 가진 중복 이벤트는 500ms 이내 전송이 제한됩니다.
</Note>

### 사용자 데이터 동의

`userDataConsent`를 통해 사용자 데이터의 서버 전송 여부를 제어할 수 있습니다. `false`로 설정하면 속성 데이터는 로컬에만 저장되고, 이벤트는 전송되지 않습니다.

```swift theme={null}
// 현재 동의 상태 확인
let hasConsent = AdropMetrics.userDataConsent

// 동의 상태 설정
AdropMetrics.setUserDataConsent(true)
```

<Warning>
  `userDataConsent`가 `false`이면 타겟팅과 이벤트 추적이 동작하지 않습니다. `setProperty()`나 `sendEvent()`를 사용하기 전에 동의를 `true`로 설정하세요.
</Warning>

***

## 문맥 타겟팅

콘텐츠나 화면의 문맥에 따라 광고를 타겟팅할 수 있습니다.

### 1. 타겟팅 생성

먼저 애드컨트롤 콘솔에서 문맥 타겟팅을 생성하세요.

<Card title="문맥 타겟팅 생성하기" icon="tags" href="/ko/targeting/context">
  콘솔에서 문맥 타겟팅 생성 방법 확인
</Card>

### 2. 광고 지면에 값 설정

콘솔에서 설정한 Context ID를 광고 로드 시 전달합니다.

#### 배너 광고

<CodeGroup>
  ```swift Swift theme={null}
  import AdropAds

  // contextId는 초기화 시 설정 (읽기 전용 프로퍼티)
  let banner = AdropBanner(unitId: "YOUR_UNIT_ID", contextId: "sport")
  banner.load()
  ```

  ```objc Objective-C theme={null}
  @import AdropAds;

  // contextId는 초기화 시 설정
  AdropBanner *banner = [[AdropBanner alloc] initWithUnitId:@"YOUR_UNIT_ID" contextId:@"sport"];
  [banner load];
  ```
</CodeGroup>

#### 네이티브 광고

<CodeGroup>
  ```swift Swift theme={null}
  import AdropAds

  class ViewController: UIViewController {
      private var nativeAd: AdropNativeAd?

      func loadAd() {
          // contextId는 초기화 시 설정
          nativeAd = AdropNativeAd(unitId: "YOUR_UNIT_ID", contextId: "tech")
          nativeAd?.delegate = self
          nativeAd?.load()
      }
  }
  ```

  ```objc Objective-C theme={null}
  @import AdropAds;

  @interface ViewController ()
  @property (nonatomic, strong) AdropNativeAd *nativeAd;
  @end

  @implementation ViewController

  - (void)loadAd {
      // contextId는 초기화 시 설정
      self.nativeAd = [[AdropNativeAd alloc] initWithUnitId:@"YOUR_UNIT_ID" contextId:@"tech"];
      self.nativeAd.delegate = self;
      [self.nativeAd load];
  }

  @end
  ```
</CodeGroup>

#### 전면 광고

<CodeGroup>
  ```swift Swift theme={null}
  import AdropAds

  class ViewController: UIViewController {
      private var interstitial: AdropInterstitialAd?

      func loadAd() {
          interstitial = AdropInterstitialAd(unitId: "YOUR_UNIT_ID")
          // Note: contextId는 InterstitialAd에서 사용할 수 없습니다
          interstitial?.delegate = self
          interstitial?.load()
      }
  }
  ```

  ```objc Objective-C theme={null}
  @import AdropAds;

  @interface ViewController ()
  @property (nonatomic, strong) AdropInterstitialAd *interstitial;
  @end

  @implementation ViewController

  - (void)loadAd {
      self.interstitial = [[AdropInterstitialAd alloc] initWithUnitId:@"YOUR_UNIT_ID"];
      // Note: contextId는 InterstitialAd에서 사용할 수 없습니다
      self.interstitial.delegate = self;
      [self.interstitial load];
  }

  @end
  ```
</CodeGroup>

#### 보상형 광고

<CodeGroup>
  ```swift Swift theme={null}
  import AdropAds

  class ViewController: UIViewController {
      private var rewarded: AdropRewardedAd?

      func loadAd() {
          rewarded = AdropRewardedAd(unitId: "YOUR_UNIT_ID")
          // Note: contextId는 RewardedAd에서 사용할 수 없습니다
          rewarded?.delegate = self
          rewarded?.load()
      }
  }
  ```

  ```objc Objective-C theme={null}
  @import AdropAds;

  @interface ViewController ()
  @property (nonatomic, strong) AdropRewardedAd *rewarded;
  @end

  @implementation ViewController

  - (void)loadAd {
      self.rewarded = [[AdropRewardedAd alloc] initWithUnitId:@"YOUR_UNIT_ID"];
      // Note: contextId는 RewardedAd에서 사용할 수 없습니다
      self.rewarded.delegate = self;
      [self.rewarded load];
  }

  @end
  ```
</CodeGroup>

### 동적 문맥 설정

화면이나 콘텐츠에 따라 동적으로 문맥을 설정할 수 있습니다.

```swift theme={null}
import UIKit
import AdropAds

class ArticleViewController: UIViewController {
    private var banner: AdropBanner?
    var articleCategory: String?  // 기사 카테고리

    override func viewDidLoad() {
        super.viewDidLoad()

        // contextId는 초기화 시 설정 (읽기 전용 프로퍼티)
        let contextId = articleCategory ?? ""
        banner = AdropBanner(unitId: "YOUR_UNIT_ID", contextId: contextId)

        banner?.delegate = self
        view.addSubview(banner!)
        banner?.load()
    }
}

// 사용 예시
let sportArticle = ArticleViewController()
sportArticle.articleCategory = "sport"

let techArticle = ArticleViewController()
techArticle.articleCategory = "tech"
```

### SwiftUI에서 문맥 설정

```swift theme={null}
import SwiftUI
import AdropAds

struct ArticleView: View {
    let category: String

    var body: some View {
        VStack {
            Text("기사 내용")

            // 카테고리에 따라 동적으로 문맥 설정
            AdropBannerRepresented(
                unitId: "YOUR_UNIT_ID",
                contextId: category
            )
            .frame(width: 320, height: 100)
        }
    }
}

// 사용 예시
struct ContentView: View {
    var body: some View {
        TabView {
            ArticleView(category: "sport")
                .tabItem { Label("스포츠", systemImage: "sportscourt") }

            ArticleView(category: "tech")
                .tabItem { Label("기술", systemImage: "cpu") }

            ArticleView(category: "business")
                .tabItem { Label("비즈니스", systemImage: "chart.line.uptrend.xyaxis") }
        }
    }
}
```

***

## 전체 예제

### 오디언스 타겟팅 전체 예제

```swift theme={null}
import UIKit
import AdropAds

class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        // SDK 초기화
        Adrop.initialize(production: false)

        // 사용자 로그인 후 UID 설정
        Adrop.setUID("user_12345")

        // 기본 사용자 속성 설정
        AdropMetrics.setProperty(key: AdropKey.GENDER, value: AdropValue.AdropGender.MALE)
        AdropMetrics.setProperty(key: AdropKey.AGE, value: 28)
        AdropMetrics.setProperty(key: AdropKey.BIRTH, value: "19960315")

        // 커스텀 속성 설정
        AdropMetrics.setProperty(key: "membership", value: "premium")
        AdropMetrics.setProperty(key: "interest_tech", value: true)
        AdropMetrics.setProperty(key: "interest_sports", value: true)
        AdropMetrics.setProperty(key: "purchase_count", value: 15)

        // 앱 시작 이벤트 전송
        AdropMetrics.sendEvent(name: "app_open")

        return true
    }
}

class ProductViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        // 상품 조회 이벤트
        AdropMetrics.sendEvent(
            name: "view_item",
            params: [
                "item_id": "PROD_123",
                "category": "electronics",
                "price": 299.99
            ]
        )
    }

    @IBAction func addToCartTapped(_ sender: UIButton) {
        // 장바구니 추가 이벤트
        AdropMetrics.sendEvent(
            name: "add_to_cart",
            params: [
                "item_id": "PROD_123",
                "quantity": 1,
                "price": 299.99
            ]
        )
    }

    func completePurchase() {
        // 구매 완료 이벤트
        AdropMetrics.sendEvent(
            name: "purchase",
            params: [
                "transaction_id": "T67890",
                "value": 299.99,
                "currency": "USD"
            ]
        )

        // 구매 횟수 업데이트
        let newPurchaseCount = 16
        AdropMetrics.setProperty(key: "purchase_count", value: newPurchaseCount)
    }
}
```

### 문맥 타겟팅 전체 예제

```swift theme={null}
import UIKit
import AdropAds

// 뉴스 앱 예제: 기사 카테고리에 따라 다른 광고 표시
class NewsArticleViewController: UIViewController {
    private var banner: AdropBanner?

    // 기사 정보
    var article: Article?

    struct Article {
        let id: String
        let title: String
        let category: String  // "sport", "tech", "business", "entertainment"
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        setupBanner()
        loadArticle()
    }

    private func setupBanner() {
        // contextId는 읽기 전용 — 초기화 시 설정
        let contextId = article?.category ?? ""
        banner = AdropBanner(unitId: "YOUR_UNIT_ID", contextId: contextId)

        banner?.delegate = self

        if let bannerView = banner {
            view.addSubview(bannerView)
            bannerView.translatesAutoresizingMaskIntoConstraints = false
            NSLayoutConstraint.activate([
                bannerView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
                bannerView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
                bannerView.widthAnchor.constraint(equalToConstant: 320),
                bannerView.heightAnchor.constraint(equalToConstant: 100)
            ])
        }

        banner?.load()
    }

    private func loadArticle() {
        // 기사 조회 이벤트 전송
        if let article = article {
            AdropMetrics.sendEvent(
                name: "view_article",
                params: [
                    "article_id": article.id,
                    "category": article.category
                ]
            )
        }
    }
}

extension NewsArticleViewController: AdropBannerDelegate {
    func onAdReceived(_ banner: AdropBanner) {
        print("카테고리 '\(article?.category ?? "")' 맞춤 광고 로드 성공")
    }

    func onAdFailedToReceive(_ banner: AdropBanner, _ errorCode: AdropErrorCode) {
        print("광고 로드 실패: \(errorCode)")
    }

    func onAdImpression(_ banner: AdropBanner) {
        print("광고 노출")
    }

    func onAdClicked(_ banner: AdropBanner) {
        print("광고 클릭")
    }
}

// 사용 예시
let sportArticle = NewsArticleViewController()
sportArticle.article = NewsArticleViewController.Article(
    id: "A123",
    title: "프리미어리그 경기 결과",
    category: "sport"
)

let techArticle = NewsArticleViewController()
techArticle.article = NewsArticleViewController.Article(
    id: "A124",
    title: "새로운 AI 기술 발표",
    category: "tech"
)
```

***

## 모범 사례

### 1. UID 설정 타이밍

사용자가 로그인하는 즉시 UID를 설정하세요.

```swift theme={null}
// 로그인 성공 시
func didLoginSuccessfully(userId: String) {
    Adrop.setUID(userId)

    // 사용자 속성도 함께 설정
    AdropMetrics.setProperty(key: "is_logged_in", value: true)
}

// 로그아웃 시
func didLogout() {
    Adrop.setUID("")  // UID 초기화
    AdropMetrics.setProperty(key: "is_logged_in", value: false)
}
```

### 2. 프로퍼티 일관성 유지

사용자 프로퍼티는 앱 실행 시 또는 값이 변경될 때마다 설정하세요.

```swift theme={null}
class UserManager {
    func updateUserProfile(profile: UserProfile) {
        // 프로필 정보 업데이트 시 프로퍼티 동기화
        AdropMetrics.setProperty(key: AdropKey.AGE, value: profile.age)
        AdropMetrics.setProperty(key: "membership", value: profile.membershipLevel)
        AdropMetrics.setProperty(key: "interest_\(profile.mainInterest)", value: true)
    }
}
```

### 3. 의미 있는 이벤트 전송

중요한 사용자 행동만 이벤트로 전송하세요.

```swift theme={null}
// ✅ 좋은 예: 의미 있는 행동
AdropMetrics.sendEvent(name: "purchase", params: ["value": 99.99])
AdropMetrics.sendEvent(name: "level_complete", params: ["level": 10])
AdropMetrics.sendEvent(name: "tutorial_complete")

// ❌ 나쁜 예: 과도한 이벤트
AdropMetrics.sendEvent(name: "button_tapped")  // 너무 일반적
AdropMetrics.sendEvent(name: "scroll")         // 너무 빈번함
```

### 4. 문맥 ID 일관성

문맥 ID는 콘솔에 등록한 값과 정확히 일치해야 합니다.

```swift theme={null}
// ✅ 좋은 예: 명확하고 일관된 ID (초기화 시 설정)
let sportBanner = AdropBanner(unitId: "YOUR_UNIT_ID", contextId: "sport")
let techBanner = AdropBanner(unitId: "YOUR_UNIT_ID", contextId: "tech")
let bizBanner = AdropBanner(unitId: "YOUR_UNIT_ID", contextId: "business")

// ❌ 나쁜 예: 불일치하거나 모호한 ID
let banner1 = AdropBanner(unitId: "YOUR_UNIT_ID", contextId: "Sport")  // 대소문자 불일치
let banner2 = AdropBanner(unitId: "YOUR_UNIT_ID", contextId: "technology")  // 콘솔과 다른 값
let banner3 = AdropBanner(unitId: "YOUR_UNIT_ID", contextId: "category_1")  // 의미 불분명
```

***

## 다음 단계

<CardGroup cols={2}>
  <Card title="배너 광고" href="/ko/sdk/ios/banner">
    배너 광고에 타겟팅 적용하기
  </Card>

  <Card title="네이티브 광고" href="/ko/sdk/ios/native">
    네이티브 광고에 타겟팅 적용하기
  </Card>

  <Card title="오디언스 타겟팅 생성" icon="bullseye" href="/ko/targeting/audience">
    콘솔에서 오디언스 타겟팅 생성하기
  </Card>

  <Card title="문맥 타겟팅 생성" icon="tags" href="/ko/targeting/context">
    콘솔에서 문맥 타겟팅 생성하기
  </Card>
</CardGroup>
