네이티브 광고
기본 템플릿 사용법
Adrop은 기본적인 네이트브 광고 템플릿을 제공합니다. (템플릿은 네이티브 광고 유닛 생성하기에서 확인하실 수 있습니다.)
템플릿에서 "광고주 프로필" 부분은 지원하지 않습니다. 해당 이미지의 "광고주 프로필"은 예시입니다. 기본 템플릿은 소재 및 성과 추적을 미리 만들어서 제공합니다.
사용법은 "배너 광고"와 동일합니다. 배너 광고를 참조해주세요.
커스텀 UI 컨테이너 구성하기
네이티브 광고를 사용하는 이유는 앱에 어울리는 광고 지면을 직접 구현할 수 있다는 장점이 가장 큽니다. 그러므로 커스텀 UI 구성이 가장 흔하게 사용되는 방식입니다.
data attributes를 이용한 방법
<div
data-adrop-unit='YOUR_UNIT_ID' // 필수. 애드컨트롤 콘솔에서 생성한 유닛의 ID
data-adrop-context-id='YOUR_CONTEXT_ID' // 선택. 문맥 타겟팅에 필요한 문맥 문자열
data-adrop-theme='light' // 선택. 'light' 또는 'dark'
data-adrop-render='custom' // 커스텀 UI 사용 시 필수.
data-adrop-entire-click={true} // 커스텀 UI 컨테이너의 클릭 영역을 전체로 할 지 여부
/>개요
간단하게 구현할 때 추천합니다.
별도의 함수 호출 없이, 광고 지면이 렌더링될 때 즉시 광고 요청 및 송출이 진행됩니다.
attributes
data-adrop-unit필수
애드컨트롤 콘솔에서 생성한 유닛의 ID
data-adrop-context-id선택
문맥 타겟팅에 필요한 문맥 문자열 (자세한 내용은 문맥 타겟팅를 참조해주세요)
data-adrop-theme선택 (default:
'light')애드컨트롤 콘솔에서 광고 유닛에 다크 모드 설정을 사용하는 경우 지정 (자세한 내용은 다크 모드 소재 받기를 참조해주세요)
data-adrop-render커스텀 UI 구성 시 필수
값은
'custom'을 입력해주세요.
data-adrop-entire-click선택 (default:
false)false일 땐 컨테이너 내부의 text, image만 클릭 가능
광고주 프로필은 소재에 등록된 광고주 링크로 이동
true일 땐 컨테이너 전체 클릭 가능
이 땐 광고주 프로필을 클릭해도 소재의 destination으로 이동
광고 재요청
key 변화를 통한 remount 방식
<div key={`${unitId}:${contextId}:${theme}:${isEntireClick}`} ... />요청값에 따라 고유한 key값이 되도록 key를 설정하면 remount가 되면서 광고를 다시 불러올 수 있습니다.
renderAd를 호출하는 방식
const ref = useRef<HTMLDivElement | null>(null) useEffect(() => { if (!ref.current) return Adrop.instance().renderAd(ref.current) }, []) <div ref={ref} ... />이 방법은 함수를 통해 원하는 시점에 광고를 재요청할 수 있는 방식입니다.
renderAd호출 시 속성을 변경하고 싶다면, 아래의 “renderAd 함수 호출을 이용한 방법 > 광고 재요청” 섹션을 참고해주세요.
renderAd 함수 호출을 이용한 방법
const ref = useRef<HTMLDivElement | null>(null)
useEffect(() => {
if (!ref.current) return
Adrop.instance().renderAd(ref.current, {
unit: 'YOUR_UNIT_ID' // 필수. 애드컨트롤 콘솔에서 생성한 유닛의 ID
contextId: 'YOUR_CONTEXT_ID' // 선택. 문맥 타겟팅에 필요한 문맥 문자열
theme: 'light', // 선택. 'light' 또는 'dark'
trackMode: 1, // 커스텀 UI 사용 시 필수
isEntireClick: true // 커스텀 UI 컨테이너의 클릭 영역을 전체로 할 지 여부
})
}, [])
<div ref={ref}/>개요
직접 광고 요청 타이밍을 관리할 때 추천합니다.
광고 지면 Container를 renderAd 함수에 전달해야 합니다.
광고 요청 타이밍을 수동으로 조절할 수 있어, 재요청을 비교적 쉽게 처리할 수 있습니다.
props
광고 재요청
Adrop.instance().renderAd(ref.current, {
unit: 'YOUR_UNIT_ID'
contextId: 'YOUR_CONTEXT_ID'
theme: 'light',
trackMode: 1,
isEntireClick: true
})renderAd함수를 다시 호출이 방식은 1번에서 data attributes로 생성한 지면에도 재요청이 가능합니다.
이 경우, data attributes에 존재하지 않는 항목이나 수정하고 싶은 항목만 전달하면 됩니다.
커스텀 UI 컨테이너 내부 구성하기
<div
... // 컨테이너 attributes 또는 ref
>
<!-- 광고주 프로필 로고 -->
<img alt='YOUR_LOGO_ALT' data-adrop-native='profile.displayLogo'/>
<!-- 광고주 프로필 이름 -->
<div data-adrop-native='profile.displayName'/>
<!-- 소재 이미지 -->
<img alt='YOUR_ASSET_ALT' data-adrop-native='asset'/>
<!-- 소재 제목 -->
<div data-adrop-native='headline'/>
<!-- 소재 내용 -->
<div data-adrop-native='body'/>
<!-- 소재 추가 텍스트 -->
<div data-adrop-native='extra.YOUR_EXTRA_ID'/>
</div>각 element의 class나 style, 트리 구조는 앱에 화면이 잘 맞도록 자유롭게 구성하세요.
data-adrop-native를 가진 Element들이 컨테이너에 포함되어있어야 합니다.원하는 소재의 텍스트 및 이미지를 data-adrop-native에 설정해주세요.
광고주 프로필
애드컨트롤 콘솔에서 네이티브 광고 유닛의 "광고주 프로필 표시"를 켜주세요.
로고 이미지는
img태그와 함께'profile.displayLogo'로 설정해주세요.광고주 이름은
'profile.displayName'으로 설정해주세요.
소재 이미지
img태그와 함께'asset'으로 설정해주세요.
소재 제목
'headline' 으로 설정해주세요.
소제 내용
'body'로 설정해주세요.
소재 추가 텍스트
애드컨트롤 콘솔에서 네이티브 광고 유닛의 "추가 텍스트 항목"에서 추가해주세요.
"필수"로 설정하지 않았다면 해당 text가 비어있을 수도 있습니다.
추가 텍스트 항목에서 설정한 아이디를
'extra.{id}' 에 넣어서 설정해주세요.
광고 크기 설정
<div
... // 컨테이너 attributes 또는 ref
className='your_css_class_name' // CSS 적용 시
style={your_style} // style 적용 시
/>기본적으로 애드컨트롤 콘솔에 등록한 광고 유닛의 사이즈대로 광고 지면을 구성하는 것이 가장 바람직합니다.
직광고
반응형 및 가로, 세로 가운데 정렬을 지원합니다.
광고주가 등록한 소재가 최적으로 보이려면
height는 등록한 유닛의 높이대로 지정해주시는 것이 좋습니다.
Backfill 광고
가로 가운데 정렬을 지원합니다.
광고 지면의 사이즈 그대로 Backfill 광고를 요청합니다.
이벤트 처리
이벤트 Callback 등록
useEffect(() => {
// unit: 애드컨트롤 콘솔에서 생성한 유닛 ID
// adData: 광고 요청 응답
// 광고 요청에 성공하면 호출되는 콜백
const adReceivedCallback = (unit: string, adData: AdData) => {
// YOUR AD_RECEIVED CALLBACK FUNCTION
}
// 현재 송출 가능한 직광고가 없을 때 호출되는 콜백
const adNoFillCallback = (unit: string) => {
// YOUR AD_NO_FILL CALLBACK FUNCTION
}
// 광고 요청에 실패했을 때 호출되는 콜백
const adFailedCallback = (unit: string) => {
// YOUR AD_FAILED CALLBACK FUNCTION
}
// 광고 소재 노출 시 호출되는 콜백
const adImpressionCallback = (unit: string, adData: AdData) => {
// YOUR AD_IMPRESSION CALLBACK FUNCTION
}
// 광고 소재 클릭 시 호출되는 콜백
const adClickedCallback = (unit: string, adData: AdData) => {
// YOUR AD_CLICKED CALLBACK FUNCTION
}
// 가능한 Backfill 광고가 없을 때 호출되는 콜백
// 개발 단계에서는 이 콜백이 호출되면 라이브 시 Backfill이 정상 노출됨
// 단, localhost에서는 초기화 때 등록한 app ID에 연결된 광고 유닛 중에서
// Backfill 수익화 중인 유닛이 하나라도 있어야 해당 콜백이 호출됨
const adBackfillNoFillCallback = (unit: string) => {
// YOUR AD_BACKFILL_NO_FILL CALLBACK FUNCTION
}
// 콜백 등록
Adrop.instance().on(Adrop.Events.AD_RECEIVED, adReceivedCallback)
Adrop.instance().on(Adrop.Events.AD_NO_FILL, adNoFillCallback)
Adrop.instance().on(Adrop.Events.AD_FAILED, adFailedCallback)
Adrop.instance().on(Adrop.Events.AD_IMPRESSION, adImpressionCallback)
Adrop.instance().on(Adrop.Events.AD_CLICKED, adClickedCallback)
Adrop.instance().on(Adrop.Events.AD_BACKFILL_NO_FILL, adBackfillNoFillCallback)
// 콜백 해제
return () => {
Adrop.instance().off(Adrop.Events.AD_RECEIVED, adReceivedCallback)
Adrop.instance().off(Adrop.Events.AD_NO_FILL, adNoFillCallback)
Adrop.instance().off(Adrop.Events.AD_FAILED, adFailedCallback)
Adrop.instance().off(Adrop.Events.AD_IMPRESSION, adImpressionCallback)
Adrop.instance().off(Adrop.Events.AD_CLICKED, adClickedCallback)
Adrop.instance().off(Adrop.Events.AD_BACKFILL_NO_FILL, adBackfillNoFillCallback)
}
}, [])이벤트 종류는 AdropEvents를 참조해주세요.
AdData는 AdData를 참조해주세요.
on으로 등록한 콜백은 더이상 쓰지 않을 땐off를 통해 해제해주세요.
이벤트 filter
const BannerComponent = () => {
useEffect(() => {
const adReceivedCallback = (unit: string, adData: AdData) => {
// YOUR AD_RECEIVED CALLBACK FUNCTION
}
Adrop.instance().on(Adrop.Events.AD_RECEIVED, adReceivedCallback, {
unit: 'YOUR_UNIT_ID'
})
return () => {
Adrop.instance().off(Adrop.Events.AD_RECEIVED, adReceivedCallback)
}
}, [])
return <div data-adrop-unit='YOUR_UNIT_ID' .../>
}특정 unit에 대해서만 이벤트 처리를 하고 싶다면
on의 세 번째 파라미터에{ unit: string }을 filter로 추가하면 됩니다.위와 같이 컴포넌트 내에서 이벤트를 같이 처리하고 싶을 때 좋은 방법입니다.
Last updated