메인 콘텐츠로 건너뛰기

개요

Adrop SDK는 두 가지 타입의 타겟팅을 지원합니다:
  • 오디언스 타겟팅: 사용자 속성(성별, 연령, 관심사 등)을 기반으로 광고를 타겟팅
  • 문맥 타겟팅: 콘텐츠나 화면의 문맥에 따라 광고를 타겟팅
타겟팅을 활용하면 사용자에게 더 관련성 높은 광고를 보여줄 수 있으며, 광고주는 원하는 대상에게 효과적으로 광고를 전달할 수 있습니다.

오디언스 타겟팅

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

1. 타겟팅 생성

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

타겟팅 생성하기

콘솔에서 오디언스 타겟팅 생성 방법 확인

2. 사용자 ID 설정

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

// 로그인 후 사용자 ID 설정
Adrop.setUID("user_id")
타겟팅 광고가 정상 동작하려면 광고 지면 진입 전에 UID를 설정하세요.

3. 사용자 프로퍼티 설정

사용자 속성을 설정하면 더 정교한 타겟팅이 가능합니다.
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")
프로퍼티 값은 단일 값(String, Int, Bool)만 지원합니다. 배열이나 딕셔너리는 지원하지 않습니다.

기본 제공 속성

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알 수 없음
// 성별 설정
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")     // 전체

커스텀 속성

콘솔에서 추가 등록한 속성을 설정할 수 있습니다. 모든 커스텀 속성의 키는 문자열이며, 값은 String, Int, Bool 타입을 지원합니다.
// 문자열 값
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: "is_subscribed", value: true)
AdropMetrics.setProperty(key: "newsletter_opt_in", value: false)
커스텀 속성을 사용하기 전에 반드시 콘솔에서 해당 속성을 먼저 등록해야 합니다.

제약 사항

프로퍼티 설정 시 다음 제약 사항에 유의하세요:
  • 단일 값만 지원: 배열([String], [Int])이나 딕셔너리([String: Any])는 지원하지 않습니다.
  • 지원 타입: String, Int, Bool만 사용 가능합니다.
  • 사전 등록 필요: 커스텀 속성은 콘솔에서 먼저 등록해야 합니다.
// ❌ 잘못된 사용 (배열/딕셔너리)
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)

이벤트 로깅

사용자 행동을 이벤트로 기록하여 더 정교한 타겟팅을 할 수 있습니다.
import AdropAds

// 파라미터 없는 이벤트
AdropMetrics.logEvent(name: "tutorial_complete")

// 파라미터가 있는 이벤트
AdropMetrics.logEvent(
    name: "purchase",
    params: [
        "item_id": "SKU_12345",
        "price": 9.99,
        "currency": "USD"
    ]
)

// 게임 이벤트 예시
AdropMetrics.logEvent(
    name: "level_complete",
    params: [
        "level": 5,
        "score": 1500,
        "time_spent": 180
    ]
)

일반적인 이벤트 예시

// 앱 이벤트
AdropMetrics.logEvent(name: "app_open")
AdropMetrics.logEvent(name: "tutorial_begin")
AdropMetrics.logEvent(name: "tutorial_complete")

// 전자상거래 이벤트
AdropMetrics.logEvent(name: "view_item", params: ["item_id": "PROD_123"])
AdropMetrics.logEvent(name: "add_to_cart", params: ["item_id": "PROD_123", "quantity": 2])
AdropMetrics.logEvent(name: "begin_checkout", params: ["value": 49.99])
AdropMetrics.logEvent(name: "purchase", params: ["transaction_id": "T12345", "value": 49.99])

// 콘텐츠 이벤트
AdropMetrics.logEvent(name: "view_article", params: ["article_id": "A123", "category": "tech"])
AdropMetrics.logEvent(name: "share_content", params: ["content_type": "article", "item_id": "A123"])

// 게임 이벤트
AdropMetrics.logEvent(name: "level_start", params: ["level": 1])
AdropMetrics.logEvent(name: "level_complete", params: ["level": 1, "score": 1000])
AdropMetrics.logEvent(name: "unlock_achievement", params: ["achievement_id": "first_win"])

문맥 타겟팅

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

1. 타겟팅 생성

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

문맥 타겟팅 생성하기

콘솔에서 문맥 타겟팅 생성 방법 확인

2. 광고 지면에 값 설정

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

배너 광고

import AdropAds

let banner = AdropBanner(unitId: "YOUR_UNIT_ID")
banner.contextId = "sport"  // 문맥 ID 설정
banner.load()

네이티브 광고

import AdropAds

class ViewController: UIViewController {
    private var adLoader: AdropNativeAdLoader?

    func loadAd() {
        adLoader = AdropNativeAdLoader(unitId: "YOUR_UNIT_ID")
        adLoader?.contextId = "tech"  // 문맥 ID 설정
        adLoader?.delegate = self
        adLoader?.loadAd()
    }
}

전면 광고

import AdropAds

class ViewController: UIViewController {
    private var interstitial: AdropInterstitialAd?

    func loadAd() {
        interstitial = AdropInterstitialAd(unitId: "YOUR_UNIT_ID")
        interstitial?.contextId = "news"  // 문맥 ID 설정
        interstitial?.delegate = self
        interstitial?.load()
    }
}

보상형 광고

import AdropAds

class ViewController: UIViewController {
    private var rewarded: AdropRewardedAd?

    func loadAd() {
        rewarded = AdropRewardedAd(unitId: "YOUR_UNIT_ID")
        rewarded?.contextId = "game"  // 문맥 ID 설정
        rewarded?.delegate = self
        rewarded?.load()
    }
}

동적 문맥 설정

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

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

    override func viewDidLoad() {
        super.viewDidLoad()

        banner = AdropBanner(unitId: "YOUR_UNIT_ID")

        // 기사 카테고리에 따라 문맥 설정
        if let category = articleCategory {
            banner?.contextId = category  // "sport", "tech", "business" 등
        }

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

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

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

SwiftUI에서 문맥 설정

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") }
        }
    }
}

전체 예제

오디언스 타겟팅 전체 예제

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.logEvent(name: "app_open")

        return true
    }
}

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

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

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

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

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

문맥 타겟팅 전체 예제

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() {
        banner = AdropBanner(unitId: "YOUR_UNIT_ID")

        // 기사 카테고리를 문맥 ID로 설정
        if let category = article?.category {
            banner?.contextId = category
        }

        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.logEvent(
                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를 설정하세요.
// 로그인 성공 시
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. 프로퍼티 일관성 유지

사용자 프로퍼티는 앱 실행 시 또는 값이 변경될 때마다 설정하세요.
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. 의미 있는 이벤트 로깅

중요한 사용자 행동만 이벤트로 기록하세요.
// ✅ 좋은 예: 의미 있는 행동
AdropMetrics.logEvent(name: "purchase", params: ["value": 99.99])
AdropMetrics.logEvent(name: "level_complete", params: ["level": 10])
AdropMetrics.logEvent(name: "tutorial_complete")

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

4. 문맥 ID 일관성

문맥 ID는 콘솔에 등록한 값과 정확히 일치해야 합니다.
// ✅ 좋은 예: 명확하고 일관된 ID
banner?.contextId = "sport"
banner?.contextId = "tech"
banner?.contextId = "business"

// ❌ 나쁜 예: 불일치하거나 모호한 ID
banner?.contextId = "Sport"  // 대소문자 불일치
banner?.contextId = "technology"  // 콘솔과 다른 값
banner?.contextId = "category_1"  // 의미 불분명

다음 단계