개요
Adrop SDK는 두 가지 타입의 타겟팅을 지원합니다:- 오디언스 타겟팅: 사용자 속성(성별, 연령, 관심사 등)을 기반으로 광고를 타겟팅
- 문맥 타겟팅: 콘텐츠나 화면의 문맥에 따라 광고를 타겟팅
오디언스 타겟팅
사용자 속성을 기반으로 광고를 타겟팅할 수 있습니다.1. 타겟팅 생성
먼저 애드컨트롤 콘솔에서 오디언스 타겟팅을 생성하세요.타겟팅 생성하기
콘솔에서 오디언스 타겟팅 생성 방법 확인
2. 사용자 ID 설정
광고 렌더링 전에 사용자 식별자를 설정해야 합니다.import AdropAds
// 로그인 후 사용자 ID 설정
Adrop.setUID("user_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")
@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"];
setProperty() 메서드는 Encodable 파라미터 타입으로 인해 Objective-C에서 제한적으로 사용될 수 있습니다. 가능하면 Swift에서 속성을 설정하세요.프로퍼티 값은 단일 값(String, Int, Double, 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") // 전체
// 성별 설정
[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"]; // 전체
커스텀 속성
콘솔에서 추가 등록한 속성을 설정할 수 있습니다. 모든 커스텀 속성의 키는 문자열이며, 값은 String, Int, Double, 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: "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)
// 문자열 값
[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];
커스텀 속성을 사용하기 전에 반드시 콘솔에서 해당 속성을 먼저 등록해야 합니다.
제약 사항
프로퍼티 설정 시 다음 제약 사항에 유의하세요:- 단일 값만 지원: 배열(
[String],[Int])이나 딕셔너리([String: Any])는 지원하지 않습니다. - 지원 타입: String, Int, Double, Bool만 사용 가능합니다.
- 키 길이: 최대 64자.
- 값 길이: 문자열 값 최대 256자.
- 최대 프로퍼티 수: 사용자당 최대 256개.
- 사전 등록 필요: 커스텀 속성은 콘솔에서 먼저 등록해야 합니다.
// ❌ 잘못된 사용 (배열/딕셔너리)
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()를 사용하여 이벤트를 전송합니다.
logEvent()는 더 이상 사용되지 않습니다(deprecated). 대신 sendEvent()를 사용하세요.이벤트 전송
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
])
@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
}];
다중 아이템 이벤트
여러 아이템이 포함된 이벤트(예: purchase, begin_checkout)의 경우,"items" 키 아래에 딕셔너리 배열을 전달합니다.
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]
]
])
@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}
]
}];
지원되는 이벤트 예시
| 이벤트 이름 | 설명 | 주요 파라미터 |
|---|---|---|
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 |
- 이벤트 이름은 1~64자여야 합니다.
- 파라미터 키는 1~64자여야 합니다.
- 문자열 파라미터 값은 최대 1024자까지 가능합니다.
- 동일한 이름과 파라미터를 가진 중복 이벤트는 500ms 이내 전송이 제한됩니다.
사용자 데이터 동의
userDataConsent를 통해 사용자 데이터의 서버 전송 여부를 제어할 수 있습니다. false로 설정하면 속성 데이터는 로컬에만 저장되고, 이벤트는 전송되지 않습니다.
// 현재 동의 상태 확인
let hasConsent = AdropMetrics.userDataConsent
// 동의 상태 설정
AdropMetrics.setUserDataConsent(true)
userDataConsent가 false이면 타겟팅과 이벤트 추적이 동작하지 않습니다. setProperty()나 sendEvent()를 사용하기 전에 동의를 true로 설정하세요.문맥 타겟팅
콘텐츠나 화면의 문맥에 따라 광고를 타겟팅할 수 있습니다.1. 타겟팅 생성
먼저 애드컨트롤 콘솔에서 문맥 타겟팅을 생성하세요.문맥 타겟팅 생성하기
콘솔에서 문맥 타겟팅 생성 방법 확인
2. 광고 지면에 값 설정
콘솔에서 설정한 Context ID를 광고 로드 시 전달합니다.배너 광고
import AdropAds
// contextId는 초기화 시 설정 (읽기 전용 프로퍼티)
let banner = AdropBanner(unitId: "YOUR_UNIT_ID", contextId: "sport")
banner.load()
@import AdropAds;
// contextId는 초기화 시 설정
AdropBanner *banner = [[AdropBanner alloc] initWithUnitId:@"YOUR_UNIT_ID" contextId:@"sport"];
[banner load];
네이티브 광고
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()
}
}
@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
전면 광고
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()
}
}
@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
보상형 광고
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()
}
}
@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
동적 문맥 설정
화면이나 콘텐츠에 따라 동적으로 문맥을 설정할 수 있습니다.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에서 문맥 설정
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.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)
}
}
문맥 타겟팅 전체 예제
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를 설정하세요.// 로그인 성공 시
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.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는 콘솔에 등록한 값과 정확히 일치해야 합니다.// ✅ 좋은 예: 명확하고 일관된 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") // 의미 불분명
다음 단계
배너 광고
배너 광고에 타겟팅 적용하기
네이티브 광고
네이티브 광고에 타겟팅 적용하기
오디언스 타겟팅 생성
콘솔에서 오디언스 타겟팅 생성하기
문맥 타겟팅 생성
콘솔에서 문맥 타겟팅 생성하기