WebView에서 광고를 실행한 뒤 앱으로 돌아왔는데, 네이티브 콜백이 오지 않아 화면이 대기 상태에 남는 문제가 있었습니다.
광고 Config도 잘못된 설정이 실행 단계로 넘어가지 않도록 검증할 필요가 있었습니다.
콜백 누락은 앱 복귀 후 복구 타이머로 처리하고, Config는 저장과 해석 단계에서 검증하도록 했습니다.
콜백이 오지 않을 때 대기를 끝내기
광고 화면에서 앱으로 돌아와도 콜백이 없으면 결과를 기다리는 UI가 종료되지 않았습니다.
그렇다고 광고 요청 시점부터 시간을 계산하면 앱이 백그라운드에 머무는 시간까지 포함됩니다. 그래서 복구 타이머는 요청 시점이 아니라 hidden → visible로 돌아온 시점에 시작하도록 했습니다.
동작은 다음과 같이 구성했습니다.
- 활성 광고 요청이 있는 상태에서 visible로 돌아오면 10초 복구 타이머를 시작합니다.
- 다시 hidden 상태가 되면 타이머를 취소합니다.
- 타이머가 끝나면 같은 요청이 여전히 활성 상태인지, 앱 복귀 시점이 바뀌지 않았는지 확인합니다.
- 타임아웃 리스너를 통해 대기 UI와 후속 흐름을 복구합니다.
- 타임아웃 이후 도착한 콜백은 현재 결과 리스너에 다시 전달하지 않습니다.
여기서 타임아웃이 발생했다고 광고가 성공한 것은 아닙니다.
이후 보완 과정에서는 didStart로 실제 광고가 시작됐는지를 구분했습니다. 콜백이 왔는데도 UI가 해제되지 않는 경우에는 별도 보호 경로를 추가했습니다.
보상·완료 정책과 화면 상태 처리는 각 앱에서 담당하도록 유지했습니다.
가상 시계로 확인한 동작
변경 전후 커밋의 소스를 같은 조건에서 실행했습니다. 광고 요청을 만든 뒤 백그라운드 진입과 앱 복귀를 재현하고, 가상 시계로 타이머 경계에서의 동작을 확인했습니다.
| 확인 항목 | 결과 |
|---|---|
| 복귀 후 9,999ms | timeout 알림 없음 |
| 복귀 후 10,000ms | timeout 알림 1회 |
| timeout 이후 success callback 두 개 전달 | 현재 결과 listener 호출: 이전 2회 → 이후 0회 |
10초는 앱 복귀를 기준으로 설정한 타이머 값입니다. 백그라운드 타이머의 동작 특성 때문에 실제 시간 기준으로 정확히 10초 안에 처리된다는 SLA를 보장하지는 않습니다.
이 테스트에서 확인한 것은 타임아웃 이후 현재 요청의 결과가 다시 전달되는지입니다. 새 요청까지 구분하는 전 구간 요청 ID 계약이나, 전체 보상이 정확히 한 번만 처리되는 exactly-once까지 검증한 것은 아닙니다.
Config는 저장과 해석 단계에서 검증하기
기존 type 배열만으로는 같은 광고 제공사의 서로 다른 실행 대상(target)을 구분하기 어려웠습니다.
그래서 후보마다 ID와 광고 제공사(provider), 광고 형식(format), OS별 target을 명시했습니다. 다음 광고 후보(fallback)는 ID로 참조하도록 했습니다.
화면에서 입력값만 검사하는 것으로 끝내지 않고, 공통 파서와 관리자 화면의 저장 단계에서도 다음 내용을 확인하도록 했습니다.
- 후보 ID가 중복되는지
- fallback이 실제로 존재하는 후보를 참조하는지
- A → B → A 같은 순환 참조가 있는지
- 확률 합계가 유효한지
- provider와 OS에 필요한 target이 있는지
정규화한 설정은 앱에 이미 있던 광고 제공사 실행 어댑터로 연결했습니다.
실행 환경과 명령·콜백 형식, 정책 해석은 공통 계층에서 관리했습니다. 광고 제공사 호출과 보상·UI 처리는 각 앱에 남겼습니다.
기존 설정과 새 저장 형식의 경계
새 형식을 도입하더라도 런타임은 기존 설정을 계속 읽을 수 있어야 했습니다. 이를 위해 기존 설정을 읽는 파서 경로를 유지했습니다.
반면 새 관리자 화면은 schemaVersion: 1 설정만 편집·저장하도록 분리했습니다.
동일한 테스트 입력으로 정상 v1 후보와 ID fallback이 유지되는지, 존재하지 않는 ID 참조와 순환 참조는 거절되는지 확인했습니다. 기존 설정도 런타임에서는 계속 읽을 수 있었지만, 새 관리자 화면에서는 편집이 거절됐습니다.
기존 설정을 읽는 경로는 유지했지만, 새 관리자 화면에서 기존 설정을 자동으로 변환해 편집·저장하는 기능은 포함하지 않았습니다.
적용 범위
콜백 복구는 활성 요청이 있고 hidden → visible 전이가 확인되는 광고 경로에 적용했습니다.
Config의 엄격한 검증은 v1 계약을 대상으로 합니다. 모든 v1 검증 조건이 기존 입력에도 적용되는 것은 아닙니다.
이번 작업에서는 대기 상태를 복구하는 조건과 잘못된 설정을 거절하는 동작을 코드와 테스트로 확인했습니다. 다만 운영 장애율이나 중복 보상이 얼마나 줄었는지는 측정하지 않았습니다.