중복 제어
GfpAdLoader 를 통해 로드되는 모든 형식의 광고는 GfpDedupeManager 클래스를 활용하여 중복 노출을 방지하고, 광고 요청 시 연속적으로 호출되는 광고들에 대해 고유한 광고가 노출되도록 관리할 수 있습니다. 즉, GfpDedupeManager 는 광고 중복 제거 기능을 제공하여 사용자에게 다양한 광고를 제공합니다.
중복 제어는 NAM 에 의해 제어될 수 있는 광고. 즉, NDA 모듈로 처리되는 S2S 광고에 한해서만 처리될 수 있습니다.
1. GfpDedupeManager 설정
NAM SDK 가 지원하는 중복이 제거된 광고 요청을 처리하기 위해서는 우선 GfpDedupeManager 생성이 필요합니다. 다음 예시는 다섯 개의 광고 단위가 Chunk 라는 하나의 그룹으로 묶여, 해당 그룹 내에서는 중복되지 않는 고유한 광고가 노출되도록 설정하는 방법을 보여줍니다. 여기서 Chunk 는 SDK 내부적으로 광고 단위들을 묶어 중복을 제어하는 그룹을 지칭합니다.
- Kotlin
- Java
val dedupeManager = GfpDedupeManager(5)
GfpDedupeManager dedupeManager = new GfpDedupeManager(5);
GfpDedupeManager 생성자의 첫번째 인자가 되는 numAdsDeduped 값은 2 에서 5 사이의 숫자로 할당되기를 권장합니다.
2. 광고 로드
중복 제어 기능을 활성화화여 광고를 로드하려면, 사전에 생성한 GfpDedupeManager 를 통해 광고 로드를 처리해야 합니다. 중복 제어 기능을 사용하여 광고를 로드하려면 GfpDedupeManager 의 loadAd() 메서드를 호출해야 합니다. 이 메서드는 인자로 광고를 로드하는 데 사용할 GfpAdLoader 객체를 받습니다. 즉, GfpAdLoader 객체를 생성하여 loadAd() 메서드의 인자로 전달하면, 중복 제어 로직을 거쳐 광고가 로드됩니다.
이 때 loadAd() 메서드를 통해 전달되는 GfpAdLoader 객체들은 전달된 순서대로 중복 제어 로직을 거치게 됩니다. 즉, 먼저 전달된 GfpAdLoader 의 광고 로드 결과가 후순위 GfpAdLoader 의 중복 제어에 영향을 미칠 수 있습니다.
GfpDedupeManager 의 loadAd() 를 통해서 로드되는 GfpAdLoader 에 한해서만 중복 제어 기능이 사용될 수 있습니다.
- Kotlin
- Java
val dedupeManager = GfpDedupeManager(5)
// . . .
val adLoader1 = GfpAdLoader.Builder(context, adParam)
.withAdListener(/* ... */)
.withNativeSimpleAd(/* ... */)
.build()
val adLoader2 = GfpAdLoader.Builder(context, adParam)
.withAdListener(/* ... */)
.withNativeSimpleAd(/* ... */)
.build()
// . . .
dedupeManager.loadAd(adLoader1)
dedupeManager.loadAd(adLoader2)
GfpDedupeManager dedupeManager = new GfpDedupeManager(5);
// . . .
GfpAdLoader adLoader1 = new GfpAdLoader.Builder(context, adParam)
.withAdListener(/* ... */)
.withNativeSimpleAd(/* ... */)
.build();
GfpAdLoader adLoader2 = new GfpAdLoader.Builder(context, adParam)
.withAdListener(/* ... */)
.withNativeSimpleAd(/* ... */)
.build();
// . . .
dedupeManager.loadAd(adLoader1)
dedupeManager.loadAd(adLoader2)
3. 광고 이벤트
GfpDedupeManager 는 loadAd() 메서드를 통해 전달받은 GfpAdLoader 들을 중복 제거하여 광고 요청을 처리하는 역할을 담당합니다. 광고가 로드된 후 발생하는 광고 이벤트(예: 광고 클릭, 노출 등)는 로드된 광고 형식에 따라 적절한 이벤트 수신 설정 방법을 통해 처리해야 합니다. 즉, GfpDedupeManager 는 광고 중복 제거에 관여하지만, 광고 이벤트 처리와는 독립적으로 동작합니다.
4. 광고 리소스 해제
GfpDedupeManager 의 loadAd() 메서드를 통해 요청된 GfpAdLoader 객체들은 GfpDedupeManager 의 destroy() 메서드를 호출하여 리소스 해제 처리를 할 수 있습니다. 또한, destroy() 메서드를 호출하면 중복 제어를 위해 사용된 값들이 초기화되므로, 중복 제어 관련 설정을 모두 초기화할 수 있습니다.
- Kotlin
- Java
val dedupeManager = GfpDedupeManager(5)
...
dedupeManager.loadAd(adLoader1)
dedupeManager.loadAd(adLoader2)
...
dedupeManager.destroy()
GfpDedupeManager dedupeManager = new GfpDedupeManager(5);
...
dedupeManager.loadAd(adLoader1);
dedupeManager.loadAd(adLoader2);
...
dedupeManager.destroy();
중복 제어 동작 설명
아래 이미지는 GfpDedupeManager 의 numAdsDeduped 값을 5로 설정했을 때의 중복 제어 동작을 시각적으로 설명합니다. 즉, 같은 Chunk 로 묶이는 5개의 광고를 중복 없이 제공하도록 관리하는 경우의 동작 방식입니다.
같은 Chunk 내 광고들 사이에서는 항상 고유한 광고 소재가 노출됩니다. 하지만 직전 호출된 광고를 기준으로 최대 numAdsDeduped * 2 개수의 광고들은 고유한 광고 소재가 노출될 수도 있고, 그렇지 않을 수도 있습니다. 이는 중복 제어 로직이 이전 광고 요청의 응답을 받은 후 다음 요청을 처리하는 방식으로 작동하기 때문입니다. 예를 들어, 리스트 내 여러 광고가 특정 간격으로 노출되는 상황에서 사용자가 빠르게 스크롤하는 경우, 광고 요청이 지연될 수 있습니다. 이러한 현상을 방지하기 위해, 사용자 경험을 개선하고자 광고 요청이 과도하게 밀리지 않도록 조절하는 메커니즘이 포함되어 있습니다.
5 번째 광고 노출 시점
- 1~5 번째 광고는 Chunk1 이라는 그룹으로 묶이기 때문에, 이들 간에는 모두 고유한 광고 소재가 노출되도록 보장됩니다.
9 번째 광고 노출 시점
- 6~9 번째 광고는 Chunk2 이라는 그룹으로 묶이기 때문에, 이들 간에는 모두 고유한 광고 소재가 노출되도록 보장됩니다.
- 1~5 번째 광고들은 이들 간에 중복이 제어되지만 1~5 번째 광고와 6~9 번째 광고에는 중복된 광고가 노출될 수도 있고 아닐 수도 있습니다.
- 즉, 베스트 케이스의 경우, 1~9 번째 광고간에 중복광고가 제거됩니다.
13 번째 광고 노출 시점
- 11~13 번째 광고는 Chunk3 이라는 그룹으로 묶이기 때문에, 이들 간에는 모두 고유한 광고 소재가 노출되도록 보장됩니다.
- 3~10 번째 광고는 비보장 형태로 고유한 광고 소재가 노출됩니다.
- 즉, 베스트 케이스의 경우, 3~13 번째 광고간에 중복광고가 제거됩니다.