네이티브 광고
네이티브 광고는 앱 측에서 레이아웃을 정의할 수 있는 광고 유형입니다. 이 기능을 통해 앱 디자인의 특성을 고려하여 광고의 시각적 스타일과 배치를 변경할 수 있습니다.
네이티브 광고는 광고 경험을 향상합니다. 그 결과 사용자 관심을 잃지 않으면서 광고를 더 많이 표시할 수 있습니다. 그러면 장기적으로 광고를 통한 최대 수익이 보장됩니다.
광고 렌더링은 광고 성능과 폼질을 높이는 네이티브 플랫폼 도구로 수행됩니다.
표시 예

이 가이드는 Android 앱에 네이티브 광고를 통합하는 과정을 다룹니다. 코드 샘플과 지침 외에도 형식별 권장 사항 및 추가 자료에 대한 링크가 포함되어 있습니다.
사전 준비
- 빠른 시작에 설명된 SDK 통합 단계를 수행하세요.
- 광고 SDK를 미리 초기화하세요.
- 최신 Yandex Mobile Ads SDK 버전을 사용하고 있는지 확인하세요. 중재를 사용하는 경우, 최신 통합 빌드 버전을 실행하고 있는지도 확인하세요.
실행
네이티브 광고 통합을 위한 주요 단계:
- NativeAdLoader라는 광고 로더를 생성하고 구성합니다.
- 광고 로드 이벤트 리스너를 등록합니다.
- 광고를 로드합니다.
- 로드된 광고를 렌더링합니다.
네이티브 광고 통합 세부 내용
-
Yandex Mobile Ads SDK 메서드에 대한 모든 호출은 메인 스레드에서 이루어져야 합니다.
-
onAdFailedToLoad()
콜백이 오류를 반환하면 새로운 광고를 다시 로드하려고 시도하지 마세요. 다른 옵션이 없는 경우, 광고 로드 재시도 횟수를 제한하세요. 이렇게 하면 제한이 있는 경우 지속적인 실패 요청 및 연결 문제를 방지할 수 있습니다. -
광고와 그 로더에 대한 강한 참조를 광고와의 상호 작용이 일어나는 화면의 수명 주기 동안 유지하는 것이 좋습니다.
-
광고 컨테이너의 크기는 광고 콘텐츠를 기반으로 해야 합니다. 광고가 로드되면 모든 자산을 렌더링해야 합니다. 사용 가능한 광고 자산 목록은 NativeAd 광고 객체에서 가져올 수 있습니다.
-
동영상 광고는 일반적으로 최상의 결과를 제공합니다. 동영상 광고를 표시하려면 광고 컨테이너와 MediaView 자산의 크기가 최소 300×160dp(밀도 독립 화소)여야 합니다.
-
모든 가능한 자산을 포함하는 레이아웃을 사용하는 것이 좋습니다. 실질적으로 이러한 레이아웃이 더 높은 전환율을 가져옵니다.
광고 로드
네이티브 광고를 로드하려면 NativeAdLoader
객체를 생성하세요.
광고 요청 매개변수는 NativeAdRequestConfiguration.Builder
클래스 객체를 통해 구성됩니다. 요청 매개변수에서는 광고 단위 ID, 이미지 로딩 방법, 연령, 성별 속성, 그리고 노출의 관련성을 높일 수 있는 기타 데이터를 전달할 수 있습니다. 광고 타겟팅 섹션에서 자세한 내용을 확인하세요.
광고 로딩 결과에 대한 알림을 받으려면 NativeAdLoadListener
인스턴스를 생성하여 광고 로더 이벤트 리스너로 설정합니다.
광고를 로드하려면 loadAd()
메서드를 호출합니다.
아래 예시는 Activity에서 네이티브 광고를 로드하는 방법을 보여줍니다.
class CustomNativeAdActivity : AppCompatActivity(R.layout.activity_custom_native_ad) {
private val nativeAdView get() = binding.nativeAd.root
private var nativeAdLoader: NativeAdLoader? = null
private lateinit var binding: ActivityCustomNativeAdBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityCustomNativeAdBinding.inflate(layoutInflater)
setContentView(binding.root)
nativeAdLoader = createNativeAdLoader()
nativeAdLoader?.loadAd(
// 여기서 NativeAdRequestConfiguration.Builder 클래스의 메서드를 사용하여 개별 옵션 설정을 지정할 수 있습니다.
NativeAdRequestConfiguration.Builder("your-ad-unit-id").build())
}
private fun createNativeAdLoader(): NativeAdLoader {
return nativeAdLoader ?: NativeAdLoader(this).apply {
setNativeAdLoadListener(object : NativeAdLoadListener {
override fun onAdLoaded(p0: NativeAd) {
// 광고가 성공적으로 로드되었습니다. 이제 로드된 광고를 표시할 수 있습니다.
}
override fun onAdFailedToLoad(p0: AdRequestError) {
// AdRequestError로 광고를 로드하는 데 실패했습니다.
// onAdFailedToLoad() 메서드에서 새 광고를 로드하려는 시도는 권장되지 않습니다.
}
})
}
}
}
class CustomNativeAdActivity extends AppCompatActivity {
private NativeAdView mNativeAdView = mBinding.nativeAd.getRoot();
@Nullable private NativeAdLoader mNativeAdLoader = null;
private ActivityCustomNativeAdBinding mBinding;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = ActivityCustomNativeAdBinding.inflate(getLayoutInflater());
setContentView(mBinding.getRoot());
mNativeAdLoader = createNativeAdLoader();
if (mNativeAdLoader != null) {
// 여기서 NativeAdRequestConfiguration.Builder 클래스의 메서드를 사용하여 개별 옵션 설정을 지정할 수 있습니다.
mNativeAdLoader.loadAd(
new NativeAdRequestConfiguration.Builder("your-ad-unit-id").build()
);
}
}
private NativeAdLoader createNativeAdLoader() {
if (mNativeAdLoader != null) {
return mNativeAdLoader;
}
final NativeAdLoader newNativeAdLoader = new NativeAdLoader(this);
newNativeAdLoader.setNativeAdLoadListener(new NativeAdLoadListener() {
@Override
public void onAdLoaded(@NonNull final NativeAd nativeAd) {
// 광고가 성공적으로 로드되었습니다. 이제 로드된 광고를 표시할 수 있습니다.
}
@Override
public void onAdFailedToLoad(@NonNull final AdRequestError error) {
// AdRequestError로 광고를 로드하는 데 실패했습니다.
// onAdFailedToLoad() 메서드에서 새 광고를 로드하려는 시도는 권장되지 않습니다.
}
});
return newNativeAdLoader;
}
}
광고 표시
광고가 로드되면 모든 자산을 렌더링해야 합니다. 사용 가능한 광고 자산 목록은 NativeAd 광고 객체에서 가져올 수 있습니다.
광고 레이아웃을 구성하는 방법은 두 가지입니다.
- 템플릿 기반 레이아웃.
- 네이티브 광고 레이아웃 수동 구성.
템플릿 기반 레이아웃
표준 템플릿 레이아웃은 네이티브 광고를 다루는 가장 간단한 방법으로, 기본 변형을 설정하는 데 몇 줄의 코드만 필요합니다.
템플릿에는 이미 필요한 광고 자산의 전체 세트가 포함되어 있으며, 이들의 상대적 배치를 정의합니다. 템플릿은 지원되는 모든 유형의 네이티브 광고와 호환됩니다.
샘플 코드
private fun showAd(nativeAd: NativeAd) {
nativeAd.setNativeAdEventListener(NativeAdEventLogger())
binding.nativeBanner.setAd(nativeAd)
}
private inner class NativeAdEventLogger : NativeAdEventListener {
override fun onAdClicked() {
// 광고에 대한 클릭이 기록될 때 호출됩니다.
}
override fun onLeftApplication() {
// 사용자가 광고를 클릭한 후 애플리케이션을 종료하려고 할 때(예: 브라우저로 이동) 호출됩니다.
}
override fun onReturnedToApplication() {
// 사용자가 클릭한 후 애플리케이션으로 돌아왔을 때 호출됩니다.
}
override fun onImpression(data: ImpressionData?) {
// 광고에 대한 노출이 기록될 때 호출됩니다.
}
}
private void showAd(@NonNull final NativeAd nativeAd) {
nativeAd.setNativeAdEventListener(new NativeAdEventLogger());
mBinding.nativeBanner.setAd(nativeAd);
}
private static class NativeAdEventLogger implements NativeAdEventListener {
@Override
public void onAdClicked() {
// 광고에 대한 클릭이 기록될 때 호출됩니다.
}
@Override
public void onLeftApplication() {
// 사용자가 광고를 클릭한 후 애플리케이션을 종료하려고 할 때(예: 브라우저로 이동) 호출됩니다.
}
@Override
public void onReturnedToApplication() {
// 사용자가 클릭 후 애플리케이션으로 돌아왔을 때 호출됩니다.
}
@Override
public void onImpression(@Nullable ImpressionData impressionData) {
// 광고에 대한 노출이 기록될 때 호출됩니다.
}
}
네이티브 광고 템플릿은 사용자 정의할 수 있습니다. 자세히 알아보려면 템플릿을 사용하여 레이아웃 설정을 참조하세요.
네이티브 광고 레이아웃 수동 구성
템플릿이 요구 사항을 충족하지 못하는 경우, 네이티브 광고의 레이아웃을 수동으로 구성할 수 있습니다.
이 방법을 통해 네이티브 광고에 대한 사용자 정의 레이아웃을 만들고 이들의 상대적 위치를 정의할 수 있습니다. 광고에는 표시를 위한 필수 및 선택적 자산이 모두 포함될 수 있습니다. 전체 목록은 네이티브 광고 자산을 참조하세요.
Совет
모든 가능한 자산을 포함하는 레이아웃을 사용하는 것이 좋습니다. 실질적으로 이러한 레이아웃이 더 높은 전환율을 가져옵니다.
각 광고 자산에 대해 NativeAdViewBinder.Builder
클래스의 인스턴스를 통해 보기를 제공합니다. 클래스는 NativeAdView
컨테이너를 인수로 수락합니다. 이 컨테이너의 하위 보기로 모든 광고 자산을 정의해야 합니다.
기성 광고 레이아웃을 NativeAd
객체에 연결하세요.
샘플 코드
private fun showAd(nativeAd: NativeAd) {
val nativeAdViewBinder = binding.nativeAd.run {
NativeAdViewBinder.Builder(nativeAdView)
.setAgeView(age)
.setBodyView(body)
.setCallToActionView(callToAction)
.setDomainView(domain)
.setFaviconView(favicon)
.setFeedbackView(feedback)
.setIconView(icon)
.setMediaView(media)
.setPriceView(price)
.setRatingView(rating)
.setReviewCountView(reviewCount)
.setSponsoredView(sponsored)
.setTitleView(title)
.setWarningView(warning)
.build()
}
try {
nativeAd.bindNativeAd(nativeAdViewBinder)
nativeAd.setNativeAdEventListener(NativeAdEventLogger())
} catch (exception: NativeAdException) {
Logger.error(exception.message.orEmpty())
}
}
private inner class NativeAdEventLogger : NativeAdEventListener {
override fun onAdClicked() {
// 광고에 대한 클릭이 기록될 때 호출됩니다.
}
override fun onLeftApplication() {
// 사용자가 광고를 클릭한 후 애플리케이션을 종료하려고 할 때(예: 브라우저로 이동) 호출됩니다.
}
override fun onReturnedToApplication() {
// 사용자가 클릭한 후 애플리케이션으로 돌아왔을 때 호출됩니다.
}
override fun onImpression(data: ImpressionData?) {
// 광고에 대한 노출이 기록될 때 호출됩니다.
}
}
private void showAd(@NonNull final NativeAd nativeAd) {
final NativeAdViewBinder nativeAdViewBinder = new NativeAdViewBinder.Builder(mNativeAdView)
.setAgeView(age)
.setBodyView(body)
.setCallToActionView(callToAction)
.setDomainView(domain)
.setFaviconView(favicon)
.setFeedbackView(feedback)
.setIconView(icon)
.setMediaView(media)
.setPriceView(price)
.setRatingView(rating)
.setReviewCountView(reviewCount)
.setSponsoredView(sponsored)
.setTitleView(title)
.setWarningView(warning)
.build();
try {
nativeAd.bindNativeAd(nativeAdViewBinder);
nativeAd.setNativeAdEventListener(new CustomNativeAdActivity.NativeAdEventLogger());
} catch (final NativeAdException exception) {
Log.e("TAG", exception.getMessage());
}
}
private class NativeAdEventLogger implements NativeAdEventListener {
@Override
public void onAdClicked() {
// 광고에 대한 클릭이 기록될 때 호출됩니다.
}
@Override
public void onLeftApplication() {
// 사용자가 광고를 클릭한 후 애플리케이션을 종료하려고 할 때(예: 브라우저로 이동) 호출됩니다.
}
@Override
public void onReturnedToApplication() {
// 사용자가 클릭 후 애플리케이션으로 돌아왔을 때 호출됩니다.
}
@Override
public void onImpression(@Nullable ImpressionData data) {
// 광고에 대한 노출이 기록될 때 호출됩니다.
}
}
여러 광고 로드
Yandex Mobile Ads SDK는 한 번의 요청으로 여러 광고를 로드하는 옵션을 제공합니다(최대 9개 광고).
대량 광고 요청을 하려면 NativeBulkAdLoader
클래스의 인스턴스를 사용하세요. 이 클래스는 loadAds
메서드에서 count
인수를 받아 요청당 원하는 광고 수를 식별합니다.
샘플 코드
class NativeBulkAdLoaderActivity : AppCompatActivity(R.layout.activity_custom_native_ad) {
private val nativeAdView get() = binding.nativeAd.root
private var nativeAdsLoader: NativeBulkAdLoader? = null
private lateinit var binding: ActivityCustomNativeAdBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityCustomNativeAdBinding.inflate(layoutInflater)
setContentView(binding.root)
nativeAdsLoader = createNativeBulkAdLoader()
// 여기서 NativeAdRequestConfiguration.Builder 클래스의 메서드를 사용하여 개별 옵션 설정을 지정할 수 있습니다.
val adRequestConfiguration = NativeAdRequestConfiguration.Builder("your-ad-unit-id").build()
nativeAdsLoader?.loadAds(adRequestConfiguration, 3)
}
private fun createNativeBulkAdLoader(): NativeBulkAdLoader {
return nativeAdsLoader ?: NativeBulkAdLoader(this).apply {
setNativeBulkAdLoadListener(object : NativeBulkAdLoadListener {
override fun onAdsLoaded(p0: MutableList<NativeAd>) {
// 광고가 성공적으로 로드되었습니다. 이제 로드된 광고를 표시할 수 있습니다.
for (nativeAd in p0) {
showAd(nativeAd)
}
}
override fun onAdsFailedToLoad(p0: AdRequestError) {
// AdRequestError로 광고를 로드하는 데 실패했습니다.
// onAdFailedToLoad() 메서드에서 새 광고를 로드하려는 시도는 권장되지 않습니다.
}
})
}
}
}
class CustomBulkNativeAdActivity extends AppCompatActivity {
private NativeAdView mNativeAdView = mBinding.nativeAd.getRoot();
@Nullable private NativeBulkAdLoader mNativeAdsLoader = null;
private ActivityCustomNativeAdBinding mBinding;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = ActivityCustomNativeAdBinding.inflate(getLayoutInflater());
setContentView(mBinding.getRoot());
mNativeAdsLoader = createNativeBulkAdLoader();
if (mNativeAdsLoader != null) {
// 여기서 NativeAdRequestConfiguration.Builder 클래스의 메서드를 사용하여 개별 옵션 설정을 지정할 수 있습니다.
mNativeAdsLoader.loadAds(
new NativeAdRequestConfiguration.Builder("your-ad-unit-id").build();
);
}
}
private NativeBulkAdLoader createNativeBulkAdLoader() {
if (mNativeAdsLoader != null) {
return mNativeAdsLoader;
}
final NativeBulkAdLoader newNativeBulkAdLoader = new NativeBulkAdLoader(this);
newNativeBulkAdLoader.setNativeBulkAdLoadListener(new NativeBulkAdLoadListener() {
@Override
public void onAdsLoaded(@NonNull final List<NativeAd> list) {
// 광고가 성공적으로 로드되었습니다. 이제 로드된 광고를 표시할 수 있습니다.
}
@Override
public void onAdsFailedToLoad(@NonNull final AdRequestError error) {
// AdRequestError로 광고를 로드하는 데 실패했습니다.
// onAdFailedToLoad() 메서드에서 새 광고를 로드하려는 시도는 권장되지 않습니다.
}
});
return newNativeBulkAdLoader;
}
}
Примечание
대량 광고 요청을 사용하여 여러 개의 개별 광고를 선택할 수 있습니다.
대량 요청으로 반환된 광고 어레이에는 0개에서 count
개 사이의 NativeAd
객체가 포함될 수 있습니다. 수신된 모든 광고 객체는 이전에 설명한 네이티브 광고 레이아웃 방법을 사용하여 독립적으로 표시할 수 있습니다.
네이티브 광고 통합 테스트
광고 테스트를 위한 데모 광고 단위 사용
테스트 광고를 사용하여 네이티브 광고 통합 및 앱 자체를 확인하세요.
각 광고 요청에 대해 테스트 광고가 반환되도록 하기 위해, 광고 통합을 테스트하는 데 도움이 되는 특별 데모 광고 배치 ID를 만들었습니다.
텍스트 및 이미지 광고를 위한 데모 adUnitId
: demo-native-content-yandex
.
모바일 앱 광고를 위한 데모 adUnitId
: demo-native-app-yandex
.
Важно
앱을 스토어에 게시하기 전에 데모 배치 ID를 Partner Interface에서 가져온 실제 ID로 교체하세요.
광고 통합 테스트
SDK의 내장 분석기를 사용하여 네이티브 광고가 올바르게 통합되었는지 확인할 수 있습니다.
이 도구는 네이티브 광고가 제대로 활성화되었는지 확인하고 로그에 상세한 보고서를 출력합니다. 보고서를 보려면 Android 앱 디버깅 도구인 Logcat에서 "YandexAds" 키워드로 검색을 실행하세요.
adb logcat -v brief '*:S YandexAds'
통합에 성공하면 다음과 같은 메시지가 반환됩니다.
adb logcat -v brief '*:S YandexAds'
mobileads$ adb logcat -v brief '*:S YandexAds'
I/YandexAds(13719): [Integration] Ad type native was integrated successfully
네이티브 광고 통합에 문제가 있으면, 상세한 문제 보고서와 문제 해결 권장 사항을 받게 됩니다.
올바른 네이티브 광고 통합 표시기
이 표시기를 사용하여 네이티브 광고 통합이 성공했는지 확인할 수 있습니다. 그렇지 않으면 문제 원인을 설명하는 디버그 정보를 얻을 수 있습니다.
Примечание
이제 디버그 패널에서 올바른 광고 통합 표시기를 활성화/비활성화할 수 있습니다.
디버그 모드에서 표시기를 활성화하려면 enableDebugErrorIndicator
메서드를 호출하여 true
로 설정하세요.
MobileAds.enableDebugErrorIndicator(true)
통합이 성공하면, 디버그 모드에서 광고 위에 연한 녹색 테두리가 나타납니다.

네이티브 광고 통합에 오류가 있으면, 디버그 모드에서 광고 위에 표시기가 나타납니다. 표시기를 클릭하여 문제의 근본 원인을 가리키는 디버그 메시지를 확인하세요. 표시기를 다시 클릭하면 메시지가 숨겨집니다.
|
|
디버그 모드에서 표시기를 비활성화하려면 enableDebugErrorIndicator
메서드를 호출하여 false
로 설정하세요.
MobileAds.enableDebugErrorIndicator(false)
동영상 광고를 위한 하드웨어 가속
앱 화면에서 동영상 광고가 성공적으로 재생되도록 하려면, 하드웨어 가속이 활성화되어 있어야 합니다(문서에서 자세한 내용 확인).
하드웨어 가속은 기본적으로 활성화되어 있습니다. 앱에서 하드웨어 가속을 비활성화한 경우, 광고가 제공되는 앱 화면에서 이를 활성화해야 합니다.
하드웨어 가속을 활성화하는 코드
<application android:hardwareAccelerated="true">
<!-- 광고를 사용하는 활동의 경우, hardwareAcceleration은 true여야 합니다. -->
<activity android:hardwareAccelerated="true" />
</application>