광고 하나 넣었을 뿐인데 cellForRowAt이 230줄이 됐다. 이 글은 광고 삽입 요구사항 → 1차 구현(괴물 탄생) → 리팩토링(수습) → 그 과정에서 잡은 버그 3건의 기록이다.

1️⃣ 요구사항

기획 요구는 단순했다. "무조건 3번째 셀 자리에 광고가 들어가도록 해달라."

단순해 보이지만 리스트 데이터 개수에 따라 규칙이 갈라진다.

받은 선물 내역

보낸 선물 내역

셀 용도
GiftBoxListCustomCellStyle2 "데이터 없음" 안내
GiftBoxListCustomCellStyle3 수락 대기 선물
GiftBoxListCustomCellStyle4 일반 선물 (받은/보낸 공용)
GiftBoxListCustomCellStyle5 광고 배너

2️⃣ 광고 셀 만들기

class GiftBoxListCustomCellStyle5: UITableViewCell {
    
    @IBOutlet weak var bannerView: BannerAdView!
    private var isBannerLoaded = false
    
    override func awakeFromNib() {
        super.awakeFromNib()
    }
    
    func setupBannerAd(rootVC: UIViewController) {
        if !isBannerLoaded {
            bannerView.setBannerAd(rootVC: rootVC, placementId: "테스트코드 입력", size: .DYNAMIC) // 테스트 코드
            bannerView.delegate = self
            bannerView.requestAd()
            isBannerLoaded = true
        }
    }
}

extension GiftBoxListCustomCellStyle5: BannerAdWidgetDelegate {
    func onBannerLoaded(_ apid: String) {
        print("GiftBoxListCustomCell5 테스트 배너 로드 성공")
    }
    
    func onBannerFailed(_ apid: String, error: AvatyeAdCash.AdCashErrorModel) {
        print("GiftBoxListCustomCell5 테스트 배너 로드 실패", error)
    }
    
    func onBannerClicked(_ apid: String) {
        print("GiftBoxListCustomCell5 테스트 배너 클릭")
    }
}

isBannerLoaded 플래그는 셀 재사용 시 광고가 중복 요청되는 걸 막는다.

3️⃣ 1차 구현 - 그리고 괴물의 탄생

먼저 numberOfRowsInSection. 광고 셀이 끼어드니 행 개수부터 조건 분기가 생긴다.