Android AdMob 광고 최적화 — 배너·전면·앱 오프닝 광고의 생명주기와 수익화 구현
Android 앱을 Google Play에 출시한 후 수익화를 위해 가장 많이 사용하는 서비스 중 하나가 Google AdMob입니다.
AdMob은 배너 광고, 전면 광고, 보상형 광고, 앱 오프닝 광고 등 다양한 광고 형식을 제공합니다.
하지만 광고 SDK를 연동하는 것과 실제 서비스에서 광고를 안정적으로 운영하는 것은 별개의 문제입니다.
특히 다음과 같은 문제가 발생하기 쉽습니다.
화면을 이동할 때마다 배너 광고가 중복 생성됨
전면 광고를 한 번 표시한 뒤 다시 사용하려고 하면 오류가 발생함
앱을 백그라운드에서 복귀할 때 앱 오프닝 광고가 반복 표시됨
Activity가 종료되었는데 광고 콜백이 실행됨
RecyclerView를 스크롤할 때 광고가 계속 새로 요청됨
광고 로딩을 기다리느라 앱 화면이 늦게 표시됨
광고 요청 실패 시 재시도 로직이 과도하게 실행됨
이러한 문제는 광고 수익뿐 아니라 앱의 안정성과 사용자 경험에도 영향을 줄 수 있습니다.
이번 글에서는 Kotlin + XML 기반 Android 프로젝트에서 Google Mobile Ads SDK를 이용해 광고를 구현하고, 생명주기와 로딩 상태를 관리하는 방법을 살펴보겠습니다.
작성 기준: 2026년 10월. Google Mobile Ads SDK의 API 및 정책은 변경될 수 있으므로 실제 적용 시 공식 문서와 사용 중인 SDK 버전을 확인해야 합니다.
1. AdMob 광고 형식 이해하기
AdMob에서 제공하는 주요 광고 형식은 다음과 같습니다.
| 광고 형식 | 설명 | 대표적인 사용 위치 |
|---|---|---|
| 배너 광고 | 화면 일부에 표시 | 목록 하단, 상세 화면 |
| 전면 광고 | 전체 화면을 차지하는 광고 | 자연스러운 화면 전환 지점 |
| 앱 오프닝 광고 | 앱 실행 또는 복귀 시 표시 | 앱 시작·복귀 흐름 |
| 보상형 광고 | 광고 시청에 대한 보상 제공 | 보상 기능 |
| 네이티브 광고 | 앱 UI와 조화되도록 구성 | 목록 중간, 콘텐츠 영역 |
이번 글에서는 배너 광고, 전면 광고, 앱 오프닝 광고를 중심으로 설명합니다.
네이티브 광고는 RecyclerView에 삽입할 수 있지만, 일반 배너 광고를 목록 중간에 삽입하는 방식과는 구현 및 정책상 고려사항이 다릅니다.
광고 형식별 공식 가이드를 확인해 적절한 방식으로 구현해야 합니다.
2. Google Mobile Ads SDK 추가하기
먼저 Gradle에 Google Mobile Ads SDK를 추가합니다.
app/build.gradle.kts
dependencies {
implementation(
"com.google.android.gms:play-services-ads:<version>"
)
}<version>에는 프로젝트에서 사용할 Google Mobile Ads SDK의 안정 버전을 지정합니다.
SDK 버전별로 API가 변경되거나 일부 메서드가 더 이상 권장되지 않을 수 있으므로 공식 릴리스 노트를 확인하는 것이 좋습니다.
AndroidManifest.xml에는 AdMob 앱 ID를 설정합니다.
<application>
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="@string/admob_app_id" />
</application>strings.xml에는 앱 ID를 등록합니다.
<string name="admob_app_id">ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy</string>여기서 앱 ID와 광고 단위 ID는 서로 다릅니다.
앱 ID: AdMob에 등록된 애플리케이션 식별자
광고 단위 ID: 배너, 전면 광고 등 개별 광고 위치의 식별자
두 값을 혼동하지 않도록 주의해야 합니다.
3. 개발 중에는 반드시 테스트 광고 사용하기
광고 구현 단계에서는 실제 광고 단위 ID 대신 Google에서 제공하는 테스트 광고 단위 ID를 사용하는 것이 안전합니다.
Android 배너 테스트 광고 단위 ID는 다음과 같습니다.
ca-app-pub-3940256099942544/9214589741전면 광고 테스트 광고 단위 ID는 다음과 같습니다.
ca-app-pub-3940256099942544/1033173712앱 오프닝 광고 테스트 광고 단위 ID는 다음과 같습니다.
ca-app-pub-3940256099942544/9257395921위 값은 Google이 제공하는 Android 테스트용 광고 단위 ID입니다.
실제 서비스에 배포할 때는 자신의 광고 단위 ID로 변경해야 합니다.
개발 과정에서 실제 광고를 반복해서 클릭하거나 노출시키면 무효 트래픽 문제가 발생할 수 있으므로 주의해야 합니다.
4. AdMob 초기화와 앱 실행 분리하기
AdMob 초기화는 앱 시작 과정에서 수행할 수 있습니다.
MobileAds.initialize(this) { initializationStatus ->
Log.d("AdMob", "SDK initialized")
}하지만 광고 SDK 초기화가 완료될 때까지 앱의 첫 화면을 기다리게 할 필요는 없습니다.
예를 들어 다음과 같은 구조는 피하는 것이 좋습니다.
앱 실행
│
▼
AdMob 초기화 대기
│
▼
광고 로딩 대기
│
▼
MainActivity 표시광고 네트워크 응답에 따라 앱 시작 속도가 달라질 수 있기 때문입니다.
대신 다음 구조를 추천합니다.
앱 실행
│
├── MainActivity 표시
│
└── AdMob 초기화
│
▼
광고 요청
│
▼
광고 표시단, 사용자 동의 관리가 필요한 경우에는 동의 정보 처리와 광고 요청 순서를 준수해야 합니다.
또한 SDK 초기화와 광고 View 조작은 공식 문서에서 안내하는 스레드 요구사항을 따라야 합니다.
5. 배너 광고 XML 레이아웃 구성
배너 광고는 화면 하단에 표시하는 방식이 일반적입니다.
예를 들어 다음과 같은 레이아웃을 구성할 수 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<FrameLayout
android:id="@+id/adContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>배너 광고를 직접 XML에 고정할 수도 있지만, 동적으로 생성하면 광고 크기나 생명주기를 관리하기 편리할 수 있습니다.
특히 화면 회전, WindowInsets, 화면 크기 변경에 대응해야 한다면 광고 영역의 실제 너비를 기준으로 크기를 계산하는 것이 좋습니다.
6. 앵커 적응형 배너 광고 구현
AdMob에서는 다양한 화면 크기에 대응하기 위해 적응형 배너 광고를 사용할 수 있습니다.
다음 코드는 광고 컨테이너의 너비를 기준으로 배너 크기를 계산하는 예시입니다.
private fun loadBannerAd() {
val container = findViewById<FrameLayout>(
R.id.adContainer
)
val displayMetrics = resources.displayMetrics
val widthPixels = if (container.width > 0) {
container.width
} else {
displayMetrics.widthPixels
}
val widthDp = (
widthPixels / displayMetrics.density
).toInt()
val adSize = AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(
this,
widthDp
)
val adView = AdView(this).apply {
adUnitId = "ca-app-pub-3940256099942544/9214589741"
setAdSize(adSize)
}
container.removeAllViews()
container.addView(adView)
adView.loadAd(AdRequest.Builder().build())
}이 코드는 적응형 배너의 기본 흐름을 설명하는 예시입니다.
실제 프로젝트에서는 광고 컨테이너의 너비가 확정된 뒤 광고 크기를 계산하는 것이 더 정확합니다.
또한 이미 생성한 AdView가 있다면 새 광고를 만들기 전에 기존 AdView의 생명주기를 정리해야 합니다.
광고 크기 API는 SDK 버전에 따라 변경될 수 있으므로 현재 버전의 배너 광고 가이드를 확인해야 합니다.
7. 배너 광고 중복 생성 방지
Fragment에서 배너 광고를 사용하는 경우 다음과 같은 코드가 반복 실행될 수 있습니다.
override fun onResume() {
super.onResume()
loadBannerAd()
}이 구조에서는 Fragment가 다시 활성화될 때마다 새로운 광고 객체가 생성될 수 있습니다.
일반적으로는 View가 생성되는 시점에 광고를 구성하고, View가 파괴될 때 정리하는 방식이 관리하기 쉽습니다.
private var adView: AdView? = null
private fun setupBanner() {
if (adView != null) return
adView = AdView(requireContext()).apply {
adUnitId = BANNER_TEST_ID
setAdSize(AdSize.BANNER)
}
binding.adContainer.addView(adView)
adView?.loadAd(
AdRequest.Builder().build()
)
}Fragment의 View가 파괴될 때는 광고 객체도 정리합니다.
override fun onDestroyView() {
adView?.let { view ->
(view.parent as? ViewGroup)?.removeView(view)
view.destroy()
}
adView = null
super.onDestroyView()
}이렇게 하면 View가 파괴된 뒤에도 광고 View가 남아 있는 문제를 줄일 수 있습니다.
단, AdView를 Activity 범위에서 재사용하도록 설계했다면 해당 소유자의 생명주기에 맞춰 관리해야 합니다.
8. 전면 광고의 기본 동작 방식
전면 광고는 화면 전체를 차지하는 광고입니다.
일반적으로 자연스러운 화면 전환 지점에서 표시합니다.
예를 들어 다음과 같은 상황을 고려할 수 있습니다.
콘텐츠 한 단계를 완료한 뒤
사용자가 다음 콘텐츠로 이동하기 전
게임의 한 라운드가 종료된 뒤
반대로 앱 실행 직후나 사용자가 예상하지 못한 시점에 반복적으로 표시하면 사용자 경험이 나빠질 수 있습니다.
또한 Google Play 및 AdMob의 전면 광고 정책을 준수해야 합니다.
9. 전면 광고 로딩 구현
전면 광고는 InterstitialAd.load()를 통해 로딩할 수 있습니다.
private var interstitialAd: InterstitialAd? = null
private fun loadInterstitialAd() {
val adRequest = AdRequest.Builder().build()
InterstitialAd.load(
this,
"ca-app-pub-3940256099942544/1033173712",
adRequest,
object : InterstitialAdLoadCallback() {
override fun onAdLoaded(ad: InterstitialAd) {
interstitialAd = ad
}
override fun onAdFailedToLoad(
error: LoadAdError
) {
interstitialAd = null
Log.e(
"AdMob",
"Interstitial load failed: ${error.message}"
)
}
}
)
}전면 광고 객체는 로딩이 완료된 후 사용할 수 있습니다.
광고 요청에 실패했다면 interstitialAd를 null로 관리하고, 필요할 때 재요청하도록 구성합니다.
실제 서비스에서는 광고 요청이 동시에 여러 번 실행되지 않도록 별도의 로딩 상태를 관리하는 것이 좋습니다.
10. 전면 광고는 한 번 표시한 뒤 재사용하지 않기
전면 광고는 일반적으로 한 번 표시한 객체를 다시 사용하지 않아야 합니다.
따라서 광고를 표시할 때는 기존 참조를 분리하는 방식이 안전합니다.
private fun showInterstitialAd() {
val ad = interstitialAd ?: return
interstitialAd = null
ad.fullScreenContentCallback =
object : FullScreenContentCallback() {
override fun onAdDismissedFullScreenContent() {
loadInterstitialAd()
}
override fun onAdFailedToShowFullScreenContent(
adError: AdError
) {
loadInterstitialAd()
}
}
ad.show(this)
}이 코드는 전면 광고를 표시한 뒤 다음 광고를 준비하는 기본 흐름입니다.
실제 구현에서는 광고가 닫힌 뒤 원래 진행하려던 화면 전환을 계속하도록 구성할 수 있습니다.
또한 광고 로딩이 완료되지 않은 경우에도 사용자의 주요 기능이 차단되지 않도록 해야 합니다.
11. 광고 로딩 상태를 명확하게 관리하기
전면 광고 요청이 중복되는 문제를 줄이려면 로딩 상태를 관리하는 것이 좋습니다.
enum class AdLoadState {
IDLE,
LOADING,
LOADED
}예를 들어 다음과 같이 사용할 수 있습니다.
private var adLoadState = AdLoadState.IDLE
private fun requestInterstitial() {
if (adLoadState != AdLoadState.IDLE) {
return
}
adLoadState = AdLoadState.LOADING
InterstitialAd.load(
this,
INTERSTITIAL_TEST_ID,
AdRequest.Builder().build(),
object : InterstitialAdLoadCallback() {
override fun onAdLoaded(ad: InterstitialAd) {
interstitialAd = ad
adLoadState = AdLoadState.LOADED
}
override fun onAdFailedToLoad(error: LoadAdError) {
interstitialAd = null
adLoadState = AdLoadState.IDLE
}
}
)
}실제 서비스에서는 Activity가 종료되는 상황과 광고 요청 콜백이 뒤늦게 도착하는 경우도 고려해야 합니다.
또한 광고 요청 실패 후 즉시 무한 재시도하는 구조는 피하는 것이 좋습니다.
12. 앱 오프닝 광고(App Open Ad)란?
앱 오프닝 광고는 앱 실행 또는 백그라운드에서 포그라운드로 복귀하는 과정에서 표시할 수 있는 광고 형식입니다.
전면 광고와 비슷하게 전체 화면을 사용하지만 목적과 표시 시점이 다릅니다.
일반적인 구조는 다음과 같습니다.
앱 실행 또는 복귀
│
▼
앱이 포그라운드 상태인지 확인
│
▼
광고 준비 여부 확인
│
├── 준비되지 않음
│ └── 정상 앱 화면 표시
│
└── 준비됨
│
▼
광고 표시
│
▼
앱 화면 복귀중요한 점은 앱 오프닝 광고를 위해 앱의 핵심 화면 표시를 무조건 지연시키지 않는 것입니다.
또한 광고가 표시되는 동안 앱의 포그라운드 이벤트가 다시 발생할 수 있으므로 중복 표시를 방지해야 합니다.
13. App Open Ad 로딩 구현
App Open Ad는 AppOpenAd.load()를 사용해 로딩할 수 있습니다.
private var appOpenAd: AppOpenAd? = null
private var appOpenAdLoadTime = 0L
private fun loadAppOpenAd() {
AppOpenAd.load(
this,
"ca-app-pub-3940256099942544/9257395921",
AdRequest.Builder().build(),
object : AppOpenAd.AppOpenAdLoadCallback() {
override fun onAdLoaded(ad: AppOpenAd) {
appOpenAd = ad
appOpenAdLoadTime =
SystemClock.elapsedRealtime()
}
override fun onAdFailedToLoad(
error: LoadAdError
) {
appOpenAd = null
}
}
)
}이 코드는 기본적인 로딩 흐름을 보여주는 예시입니다.
광고 로딩 시점은 SystemClock.elapsedRealtime()으로 기록했습니다.
광고 객체의 유효 기간을 관리할 때는 현재 SDK 문서에서 안내하는 만료 기준을 확인해야 합니다.
광고 객체를 장시간 보관한 뒤 무조건 재사용하는 방식은 피해야 합니다.
14. App Open Ad 유효 기간 관리
앱 오프닝 광고는 일정 시간이 지나면 다시 로딩해야 합니다.
다음은 광고를 로딩한 시점을 기준으로 유효 여부를 확인하는 예시입니다.
private fun isAppOpenAdAvailable(): Boolean {
val ad = appOpenAd ?: return false
val elapsed =
SystemClock.elapsedRealtime() - appOpenAdLoadTime
val maxAgeMillis = 4 * 60 * 60 * 1000L
return elapsed in 0 until maxAgeMillis
}위 예시는 4시간 기준을 적용한 것입니다.
광고 객체의 만료 기준은 Google 공식 문서와 SDK 버전에 따라 확인해야 합니다.
또한 광고가 유효하다고 해서 반드시 표시해야 하는 것은 아닙니다.
사용자의 현재 화면 상태, 다른 전체 화면 광고 표시 여부, 앱의 시작 흐름을 함께 고려해야 합니다.
15. ProcessLifecycleOwner로 앱 복귀 감지하기
앱이 포그라운드로 복귀하는 시점을 감지하려면 ProcessLifecycleOwner를 사용할 수 있습니다.
class MyApplication : Application(),
DefaultLifecycleObserver {
override fun onCreate() {
super.onCreate()
ProcessLifecycleOwner.get()
.lifecycle
.addObserver(this)
}
override fun onStart(owner: LifecycleOwner) {
super.onStart(owner)
// 앱 포그라운드 진입
}
}이 기능을 사용하려면 Lifecycle Process 관련 의존성이 필요합니다.
implementation(
"androidx.lifecycle:lifecycle-process:<version>"
)다만 앱이 포그라운드로 진입할 때마다 광고를 무조건 표시해서는 안 됩니다.
다음과 같은 조건을 확인해야 합니다.
광고가 이미 표시 중인지
다른 전체 화면 광고가 표시 중인지
현재 Activity가 광고를 표시할 수 있는 상태인지
광고 객체가 유효한지
광고 표시 빈도 제한을 만족하는지
사용자가 중요한 작업을 수행 중인지
16. App Open Ad 중복 표시 방지
앱 오프닝 광고는 중복 표시 방지가 특히 중요합니다.
다음과 같은 상태를 사용할 수 있습니다.
private var isShowingAd = false광고를 표시할 때 상태를 변경합니다.
private fun showAppOpenAd(activity: Activity) {
if (isShowingAd) return
if (!isAppOpenAdAvailable()) return
val ad = appOpenAd ?: return
isShowingAd = true
appOpenAd = null
ad.fullScreenContentCallback =
object : FullScreenContentCallback() {
override fun onAdDismissedFullScreenContent() {
isShowingAd = false
loadAppOpenAd()
}
override fun onAdFailedToShowFullScreenContent(
error: AdError
) {
isShowingAd = false
loadAppOpenAd()
}
}
ad.show(activity)
}이 코드는 광고 중복 표시를 방지하는 기본 구조입니다.
실제 프로젝트에서는 Application과 Activity의 생명주기, 현재 화면 상태, 광고 표시 정책을 함께 관리해야 합니다.
또한 App Open Ad가 표시되는 동안 다른 광고를 요청하거나 표시하지 않도록 전체 화면 광고 상태를 통합 관리하는 것이 좋습니다.
17. RecyclerView에 광고 아이템을 넣을 때 주의사항
RecyclerView에 광고를 삽입하는 앱도 있습니다.
예를 들어 다음과 같은 목록입니다.
조류 데이터 1
조류 데이터 2
조류 데이터 3
광고
조류 데이터 4
조류 데이터 5이 경우 일반 데이터와 광고 데이터를 서로 다른 ViewHolder로 처리할 수 있습니다.
sealed class ListItem {
data class BirdItem(
val bird: Bird
) : ListItem()
data class AdItem(
val id: String
) : ListItem()
}Adapter에서는 getItemViewType()으로 아이템 종류를 구분할 수 있습니다.
override fun getItemViewType(position: Int): Int {
return when (getItem(position)) {
is ListItem.BirdItem -> TYPE_BIRD
is ListItem.AdItem -> TYPE_AD
}
}하지만 광고 아이템을 목록에 넣는 것과 실제 AdMob 광고를 올바르게 구현하는 것은 별개의 문제입니다.
특히 네이티브 광고는 전용 광고 객체와 NativeAdView를 이용해야 하며, 광고 표시와 식별에 관한 정책을 준수해야 합니다.
단순히 일반 배너 광고를 RecyclerView에 반복 삽입하는 방식은 광고 형식과 정책을 먼저 검토해야 합니다.
18. RecyclerView에서 광고 요청 중복 방지
RecyclerView의 onBindViewHolder()는 스크롤 중 반복적으로 호출됩니다.
따라서 다음과 같은 구조는 피하는 것이 좋습니다.
override fun onBindViewHolder(
holder: AdViewHolder,
position: Int
) {
loadNewAd()
}이렇게 하면 같은 광고 아이템이 다시 바인딩될 때마다 광고 요청이 발생할 수 있습니다.
광고 로딩은 Adapter 바인딩과 분리하는 것이 좋습니다.
예를 들어 다음과 같은 구조를 고려할 수 있습니다.
Repository / AdManager
│
├── 광고 요청
├── 광고 상태 관리
└── 광고 객체 관리
│
▼
RecyclerView
│
└── ViewHolder 바인딩이렇게 하면 스크롤 동작과 광고 요청을 분리할 수 있습니다.
단, 네이티브 광고 객체는 사용이 끝났을 때 destroy()를 호출해야 합니다.
광고 객체를 무제한 캐싱하는 방식은 피하는 것이 좋습니다.
19. 광고 로딩 실패 시 재시도 정책
광고 요청은 네트워크 상태나 광고 재고 등에 따라 실패할 수 있습니다.
따라서 광고 로딩 실패를 앱 오류로 취급할 필요는 없습니다.
예를 들어 다음과 같은 코드는 피해야 합니다.
override fun onAdFailedToLoad(error: LoadAdError) {
loadInterstitialAd()
}실패 콜백에서 즉시 다시 요청하면 광고 요청이 반복될 수 있습니다.
대신 다음과 같은 방식이 적절합니다.
일정 시간이 지난 뒤 재시도
다음 자연스러운 광고 표시 지점에서 재요청
네트워크 상태가 변경된 뒤 재시도
실패 횟수에 따른 재시도 간격 증가
광고가 준비되지 않은 상황에서도 앱의 핵심 기능은 정상적으로 동작해야 합니다.
20. 광고 수익 최적화와 사용자 경험
광고 수익을 높이기 위해 광고 노출 횟수만 늘리는 것은 좋은 전략이 아닐 수 있습니다.
광고가 지나치게 자주 표시되면 다음과 같은 문제가 발생할 수 있습니다.
사용자 이탈 증가
앱 평점 하락
광고 피로도 증가
앱 이용 시간 감소
정책 위반 위험 증가
따라서 광고 수익 최적화에서는 광고 요청 수뿐 아니라 사용자 경험을 함께 고려해야 합니다.
특히 전면 광고는 자연스러운 전환 지점에서 표시하고, 앱 오프닝 광고는 사용자가 예상하지 못한 순간에 반복적으로 표시되지 않도록 해야 합니다.
21. AdMob 운영 시 확인할 지표
AdMob 콘솔에서는 광고 운영과 관련된 다양한 지표를 확인할 수 있습니다.
| 지표 | 의미 |
|---|---|
| 요청 수 | 앱에서 광고를 요청한 횟수 |
| 노출 수 | 광고가 실제로 노출된 횟수 |
| 매치율 | 요청 중 광고가 매칭된 비율 |
| eCPM | 1,000회 노출당 예상 수익 |
| 예상 수익 | 광고를 통한 예상 수익 |
이러한 지표를 함께 분석하면 광고 요청은 많은데 실제 노출이 적은지, 특정 광고 형식의 성과가 낮은지 확인할 수 있습니다.
다만 지표의 정확한 정의와 집계 방식은 AdMob 보고서 기준을 확인해야 합니다.
22. AdMob 광고 최적화 체크리스트
Google Mobile Ads SDK 버전 확인
앱 ID와 광고 단위 ID 구분
개발 중 테스트 광고 사용
광고 SDK 초기화와 첫 화면 표시 분리
사용자 동의 관리 절차 확인
배너 광고의 View 생명주기 관리
전면 광고 객체 재사용 금지
전면 광고 중복 요청 방지
App Open Ad 유효 기간 관리
앱 복귀 시 광고 중복 표시 방지
다른 전체 화면 광고와 충돌 방지
RecyclerView 바인딩에서 광고 중복 요청 방지
네이티브 광고 객체 destroy 처리
광고 로딩 실패 시 무한 재시도 방지
광고 표시 빈도 및 정책 준수
AdMob 콘솔의 요청·노출·수익 지표 확인
23. 마무리
AdMob 광고를 안정적으로 운영하려면 광고를 로딩하고 표시하는 코드뿐 아니라 생명주기와 상태 관리가 중요합니다.
특히 Kotlin + XML 기반 Android 앱에서는 다음과 같은 원칙을 추천합니다.
배너 광고는 Activity 또는 Fragment의 View 생명주기에 맞춰 관리합니다.
전면 광고는 한 번 표시한 뒤 재사용하지 않고 새로운 광고를 로딩합니다.
앱 오프닝 광고는 앱 복귀 상태와 중복 표시 여부를 확인합니다.
RecyclerView에서는 광고 요청과 ViewHolder 바인딩을 분리합니다.
광고 로딩 실패가 앱의 주요 기능을 방해하지 않도록 구성합니다.
광고 수익뿐 아니라 사용자 경험과 정책 준수를 함께 고려합니다.
AdMob 최적화의 핵심은 광고를 최대한 많이 요청하는 것이 아닙니다.
적절한 시점에 광고를 요청하고, 유효한 광고를 안정적으로 표시하며, 앱의 핵심 기능을 방해하지 않도록 관리하는 것이 중요합니다.
참고 자료
Google AdMob — Android 시작하기
https://developers.google.com/admob/android/quick-startGoogle AdMob — 배너 광고
https://developers.google.com/admob/android/bannerGoogle AdMob — 전면 광고
https://developers.google.com/admob/android/interstitialGoogle AdMob — 앱 오프닝 광고
https://developers.google.com/admob/android/app-openGoogle AdMob — 네이티브 광고
https://developers.google.com/admob/android/nativeGoogle AdMob — 사용자 동의 관리
https://developers.google.com/admob/android/privacyGoogle AdMob — 테스트 광고
https://developers.google.com/admob/android/test-adsGoogle AdMob — 광고 정책
https://support.google.com/admob/answer/6128543
태그: Android, Kotlin, AdMob, Google Mobile Ads SDK, 배너 광고, 전면 광고, App Open Ad, RecyclerView, Native Ads, 광고 생명주기, 광고 수익화, MVVM, Google Play