QA에서 같은 기사 카드에 새 광고가 배정됐는데도 노출 기록이 다시 시작되지 않는 조건을 발견했습니다. 화면은 그대로였지만 광고 입장에서는 새로운 노출 기회였습니다. 무엇이 화면의 동일성을 결정하고, 무엇이 새 측정을 시작하게 하는지를 구분해야 했습니다.

기사 섹션의 제품 가설과 시각 원형은 동료들이 만들었습니다. 저는 원형을 실제 광고 데이터·참여 흐름에 연결하고, 이 재할당 조건의 FE 계측을 고쳤습니다.

화면의 카드와 실제 참여를 구분했다

디자인 원형에는 이미지·제목·누르기 반응이 있었습니다. 실제 제품에서는 그 카드로 들어갈 수 있는 광고와 참여 결과를 기록할 정보가 더 필요했습니다. 저는 카드 표시 모델을 따로 두어, 기사 표현과 광고 참여 가능 여부를 같은 판단으로 취급하지 않았습니다.

참여에 필요한 식별자와 클릭·계측 정보가 없는 항목은 제외했습니다. 이미지 로드만 실패한 유효한 광고에는 대체 표현을 사용했습니다. 열 수 없는 카드와 이미지가 없는 카드는 다른 실패이기 때문입니다.

같은 콘텐츠라도 새 노출일 수 있었다

기사 ID는 사용자가 보고 있는 콘텐츠를 가리킵니다. 광고 할당 ID는 이번 요청에서 측정할 광고 회차를 가리킵니다. 기사 ID만 보면 새 할당을 놓치고, React의 카드 객체 변경을 기준으로 삼으면 같은 할당을 중복 기록할 수 있습니다.

화면의 기사: 그대로 유지
광고 할당: 새 회차로 변경
노출 측정: 이전 타이머 취소 → 새 회차로 시작

그래서 화면의 기사 식별자와 노출의 할당 식별자를 분리했습니다. 실제 할당 요청 ID가 응답까지 이어지도록 하는 작은 서버 변경에도 참여했습니다. FE는 할당 회차가 바뀌면 이전 노출 타이머를 취소하고 새 측정을 시작합니다. 화면용 ID를 새로 만들어 노출로 오인하는 방식은 택하지 않았습니다. 검증 환경에서는 같은 기사에 새 할당이 오면 노출을 다시 보내고, 같은 할당은 중복 기록하지 않는지 확인했습니다. 이는 실기기나 상용 노출 누락률의 확인과는 다른 범위입니다.

출시까지 확인한 범위

9월 초 시각 원형을 받은 뒤 FE 표현·참여·복귀 흐름을 연결하고 QA했습니다. FE 배포 뒤 동료들의 공급·유닛 설정과 제한된 참여·적립 확인을 거쳐 9월 9일 상용으로 전환됐습니다. 출시 다음 날에는 재할당 조건의 회귀 테스트를 보강했습니다.

확인한 결과는 기사 카드를 열고 복귀할 수 있으며, 같은 기사에 새 광고가 배정돼도 새 노출을 측정하는 동작입니다. 초기 운영 관측에는 QA가 섞여 있어 노출 누락 감소량이나 매출 효과는 분리해 말할 수 없습니다. 이 사례에서 제가 보여 주려는 판단은 UI가 그대로인지를 묻기 전에, 제품이 새 사건으로 세어야 하는 것이 무엇인지 정의한 것입니다.