광고 하나 넣었을 뿐인데 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. 광고 셀이 끼어드니 행 개수부터 조건 분기가 생긴다.