네이티브 광고

네이티브 광고는 플랫폼 고유의 UI 구성요소를 통해 사용자에게 표시되는 광고 애셋입니다. 이러한 광고는 레이아웃을 구축할 때 사용한 것과 동일한 유형의 뷰를 사용하여 표시되며, 앱의 시각적 디자인과 일치하도록 형식을 지정할 수 있습니다.

네이티브 광고가 로드되면 광고 애셋이 포함된 광고 객체를 앱에서 수신하며, 이때 Google 모바일 광고 SDK가 아닌 앱이 광고를 표시합니다.

일반적으로 네이티브 광고의 성공적인 구현은 SDK를 사용하여 광고를 로드하는 작업과 앱에 광고 콘텐츠를 표시하는 작업으로 구성됩니다.

이 페이지에서는 SDK를 사용하여 네이티브 광고를 로드하는 방법을 보여줍니다. 팁: Google의 네이티브 광고 플레이북에서 네이티브 광고에 대해 자세히 알아보세요.

고객 성공사례인 우수사례 1우수사례 2를 읽어보세요.

기본 요건

항상 테스트 광고로 테스트

앱을 빌드하고 테스트할 때는 실제 프로덕션 광고 대신 테스트 광고를 사용하세요.

테스트 광고를 로드하는 가장 쉬운 방법은 Android의 네이티브 광고용 전용 테스트 광고 단위 ID를 사용하는 것입니다.

ca-app-pub-3940256099942544/2247696110

이 ID는 모든 요청에 대해 테스트 광고를 반환하도록 특별히 구성되었으며, 코딩, 테스트, 디버깅 중에 앱에서 사용할 수 있습니다. 앱을 게시하기 전에 이 ID를 자체 광고 단위 ID로 바꿔야 합니다.

Google 모바일 광고 SDK의 테스트 광고가 작동하는 방식을 자세히 알아보려면 테스트 광고를 참고하세요.

광고 로드

네이티브 광고는 AdLoader 클래스를 통해 로드되며 이 클래스에는 생성 중에 맞춤설정할 수 있는 자체 Builder 클래스가 포함되어 있습니다. AdLoader를 빌드할 때 여기에 리스너를 추가하면 앱에서 어떤 유형의 네이티브 광고를 수신할 준비가 되었는지 지정합니다. 그러면 AdLoader에서 해당 유형만 요청합니다.

AdLoader 구축

다음 코드는 네이티브 광고를 로드할 수 있는 AdLoader를 빌드하는 방법을 보여줍니다.

자바

AdLoader adLoader = new AdLoader.Builder(context, "ca-app-pub-3940256099942544/2247696110")
    .forNativeAd(new NativeAd.OnNativeAdLoadedListener() {
        @Override
        public void onNativeAdLoaded(NativeAd nativeAd) {
            // Show the ad.
        }
    })
    .withAdListener(new AdListener() {
        @Override
        public void onAdFailedToLoad(LoadAdError adError) {
            // Handle the failure by logging, altering the UI, and so on.
        }
    })
    .withNativeAdOptions(new NativeAdOptions.Builder()
            // Methods in the NativeAdOptions.Builder class can be
            // used here to specify individual options settings.
            .build())
    .build();

Kotlin

val adLoader = AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110}")
    .forNativeAd { ad : NativeAd ->
        // Show the ad.
    }
    .withAdListener(object : AdListener() {
        override fun onAdFailedToLoad(adError: LoadAdError) {
            // Handle the failure.
        }
    })
    .withNativeAdOptions(NativeAdOptions.Builder()
            // Methods in the NativeAdOptions.Builder class can be
            // used here to specify individual options settings.
            .build())
    .build()

forNativeAd() 메서드는 NativeAd 형식의 AdLoader를 준비합니다. 광고가 성공적으로 로드되면 리스너 객체의 onNativeAdLoaded() 메서드가 호출됩니다.

AdLoader로 AdListener 설정(선택사항)

AdLoader를 생성할 때 withAdListener 함수는 로더의 AdListener를 설정합니다. 이 메서드는 AdListener를 유일한 매개변수로 취하며, 광고 수명 주기 이벤트가 발생할 때 이 매개변수를 통해 AdLoader로부터 콜백을 수신합니다.

자바

.withAdListener(new AdListener() {
    // AdListener callbacks can be overridden here.
})

Kotlin

.withAdListener(object : AdListener() {
    // AdListener callbacks can be overridden here.
})

광고 요청

AdLoader 빌드를 완료한 후 이를 이용해 광고를 요청하세요. 이 작업은 loadAd()loadAds() 메서드를 이용해 처리할 수 있습니다.

loadAd()

이 메서드는 광고 1개에 대한 요청을 보냅니다.

자바

adLoader.loadAd(new AdRequest.Builder().build());

Kotlin

adLoader.loadAd(AdRequest.Builder().build())

loadAds()

이 메서드는 여러 광고(최대 5개)에 대한 요청을 보냅니다.

자바

adLoader.loadAds(new AdRequest.Builder().build(), 3);

Kotlin

adLoader.loadAds(AdRequest.Builder().build(), 3)

두 메서드 모두 AdRequest 객체를 첫 번째 매개변수로 사용합니다. 배너 광고와 전면 광고에서 사용되는 AdRequest 클래스와 동일하며, 다른 광고 형식에서처럼 AdRequest 클래스의 메서드를 이용해 타겟팅 정보를 추가할 수 있습니다.

여러 광고 로드 (선택사항)

loadAds() 메서드는 SDK가 요청에 대해 로드해야 하는 광고 수를 추가 매개변수로 사용합니다. 최댓값은 5이며, SDK가 요청된 수의 광고를 정확하게 반환하지 않을 수 있습니다.

반환된 Google 광고는 모두 서로 다르지만 예약된 인벤토리 또는 서드 파티 구매자의 광고는 고유하지 않을 수 있습니다.

미디에이션을 사용하는 경우 loadAds() 메서드를 사용하지 마세요. 현재 미디에이션을 위해 구성된 광고 단위 ID로는 여러 네이티브 광고에 대한 요청이 발생하지 않으므로

콜백

loadAd() 호출 후에는 이전에 정의된 리스너 메서드에 콜백이 한 번 실행되어 네이티브 광고 객체를 전달하거나 오류를 보고합니다.

loadAds() 호출 후에는 이러한 콜백이 여러 번 이루어집니다 (한 번 이상, 요청된 광고 수 이하). 앱에서 여러 광고를 요청하면 콜백 구현에서 AdLoader.isLoading()을 호출하여 로드 과정이 완료되었는지를 확인해야 합니다.

다음은 onNativeAdLoaded() 콜백에서 isLoading()를 확인하는 방법을 보여주는 예입니다.

자바

final AdLoader adLoader = new AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
        .forNativeAd(new NativeAd.OnNativeAdLoadedListener() {
    @Override
    public void onNativeAdLoaded(NativeAd nativeAd) {
        ...
        // some code that displays the ad.
        ...
        if (adLoader.isLoading()) {
            // The AdLoader is still loading ads.
            // Expect more adLoaded or onAdFailedToLoad callbacks.
        } else {
            // The AdLoader has finished loading ads.
        }
    }
}).build();
adLoader.loadAds(new AdRequest.Builder().build(), 3);

Kotlin

lateinit var adLoader: AdLoader
...
adLoader = AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
    .forNativeAd {
        ...
        // some code that displays the ad.
        ...
        if (adLoader.isLoading) {
            // The AdLoader is still loading ads.
            // Expect more adLoaded or onAdFailedToLoad callbacks.
        } else {
            // The AdLoader has finished loading ads.
        }
    }.build()
adLoader.loadAds(AdRequest.Builder().build(), 3)

리소스 해제

로드된 네이티브 광고에서 destroy() 메서드를 사용해야 합니다. 이렇게 하면 사용된 리소스가 해제되고 메모리 누수가 방지됩니다.

활동의 onDestroy() 메서드에서 모든 NativeAd 참조가 삭제되는지 확인합니다.

onNativeAdLoaded 콜백에서 참조 해제될 기존 네이티브 광고를 모두 소멸해야 합니다.

또 다른 중요한 확인사항은 활동이 소멸되었는지 여부입니다. 소멸된 경우 반환된 광고에서 destroy()를 호출하고 즉시 반환합니다.

자바

final AdLoader adLoader = new AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
        .forNativeAd(new NativeAd.OnNativeAdLoadedListener() {
    @Override
    public void onNativeAdLoaded(NativeAd nativeAd) {
        // If this callback occurs after the activity is destroyed, you
        // must call destroy and return or you may get a memory leak.
        // Note `isDestroyed()` is a method on Activity.
        if (isDestroyed()) {
            nativeAd.destroy();
            return;
        }
        ...
    }
}).build();

Kotlin

lateinit var adLoader: AdLoader
...
adLoader = AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
    .forNativeAd { nativeAd ->
        // If this callback occurs after the activity is destroyed, you
        // must call destroy and return or you may get a memory leak.
        // Note `isDestroyed` is a method on Activity.
        if (isDestroyed) {
            nativeAd.destroy()
            return@forNativeAd
        }
        ...
    }.build()

권장사항

광고를 로드할 때 다음 규칙을 따르세요.

  • 목록에서 네이티브 광고를 사용하는 앱은 광고 목록을 미리 캐시해야 합니다.

  • 광고를 미리 캐시할 때는 캐시를 지우고 1시간 후에 새로고침합니다.

  • 첫 번째 요청 로드가 완료될 때까지 AdLoader에서 loadAd() 또는 loadAds()를 호출하지 마세요.

  • 네이티브 광고 캐싱을 필요한 만큼만 제한합니다. 예를 들어 미리 캐시할 때는 화면에 즉시 표시되는 광고만 캐시합니다. 네이티브 광고는 메모리 공간이 크며, 네이티브 광고를 폐기하지 않고 캐싱하면 메모리가 과도하게 사용됩니다.

  • 더 이상 사용하지 않는 네이티브 광고를 폐기합니다.

동영상 광고의 하드웨어 가속

네이티브 광고 뷰에 동영상 광고가 제대로 표시되려면 하드웨어 가속이 사용 설정되어 있어야 합니다.

하드웨어 가속은 기본적으로 사용 설정되어 있지만 일부 앱에서 사용 중지할 수도 있습니다. 앱에서 하드웨어 가속이 사용 중지되었다면 광고를 사용하는 Activity 클래스에 하드웨어 가속을 사용하시기 바랍니다.

하드웨어 가속 사용 설정

하드웨어 가속이 전역적으로 사용 설정된 상태에서 앱이 제대로 작동하지 않으면 개별 활동에 맞게 제어할 수도 있습니다. 하드웨어 가속을 사용 또는 중지하려면 AndroidManifest.xml에서 <application><activity> 요소에 android:hardwareAccelerated 속성을 적용하세요. 다음 예에서는 앱 전체에서 하드웨어 가속을 사용하고 있지만, 활동 하나에 대해서는 하드웨어 가속을 사용 중지했습니다.

<application android:hardwareAccelerated="true">
    <!-- For activities that use ads, hardwareAcceleration should be true. -->
    <activity android:hardwareAccelerated="true" />
    <!-- For activities that don't use ads, hardwareAcceleration can be false. -->
    <activity android:hardwareAccelerated="false" />
</application>

하드웨어 가속을 설정하는 옵션에 대해 자세히 알아보려면 하드웨어 가속 관련 가이드를 참고하세요. Activity가 사용 중지된 경우에는 개별 광고 보기에서 하드웨어 가속을 사용할 수 없으므로 Activity 자체에 하드웨어 가속이 사용 설정되어야 합니다.

광고 게재

광고를 로드한 후에는 사용자에게 광고를 게재하는 일만 남게 됩니다. 광고 게재 방식을 알아보려면 네이티브 광고 고급형 가이드를 참고하세요.