Files
sodalive-ios/docs/20261013_Yandex_광고_잔여_참조_제거/prd.md
T

9.9 KiB

Yandex 광고 잔여 참조 제거 PRD

문서 정보

항목 내용
문서 상태 코드 구현 완료, 수동 QA 대기
작성일 / 최종 수정일 2026-10-13
대상 제품 SodaLive iOS 운영·개발 타깃
작성자·결정권자 에이전트 작성 / 사용자 승인
관련 API Contract 신규 작성 없음, 기존 캔 충전 계약 유지
관련 구현 계획 plan-task.md
관련 review Phase 1 리뷰

1. Overview

사용자가 Yandex SDK 의존성과 광고 ID 상수를 제거한 상태에서, 앱에 남은 초기화·배너·보상형 광고 코드와 프로젝트 참조를 제거한다. 캔 충전과 광고 유입 측정 설정은 유지한다. 문서 작성 후 사용자 승인을 받아 코드 제거를 수행했으며, 전체 수동 QA와 구현 완료 판정은 구분한다.

2. Problem Statement

아래는 구현 전 확인한 문제 상태다. 구현 후 결과는 §14와 계획의 Progress에 기록한다.

  • Podfile, Podfile.lock, Pods/Manifest.lock에서 Yandex와 전용 하위 의존성은 제거됐고, 두 Constants 파일의 YANDEX_* 선언도 제거됐다.
  • 앱에는 SDK import, 초기화, 삭제된 상수 참조 12곳, 배너 호출 11곳과 채팅 광고 사전 로딩이 남아 있다.
  • 채팅 광고 표시 함수의 호출부는 없지만 잔여 채팅이 1회 이하일 때 사전 로딩하는 경로는 남아 있다.
  • 이 상태는 제거 작업의 중간 상태다. 이번 문서 작성 단계에서 앱 빌드 실패를 실제 실행으로 확인한 것은 아니다.

3. Goals

3.1 제품 목표

  • 앱 코드와 활성 프로젝트 설정에서 Yandex 의존 참조를 없앤다.
  • 운영·개발 두 스킴의 빌드를 검증하고, 기존 캔 충전 동작을 보존한다.

3.2 UX 목표

  • 11개 화면의 광고와 광고 전용 여백을 제거하되 콘텐츠·스크롤·이동 동작은 유지한다.
  • 광고를 다른 UI로 대체하거나 주변 디자인을 개편하지 않는다.

4. Non-Goals

  • 두 Info.plist 전체를 수정하지 않는다. 특히 SKAdNetworkItems, NSAdvertisingAttributionReportEndpoint는 명시적인 보존 대상이다.
  • ATT/IDFA, 추적 권한 문구, AppsFlyer·Meta·Firebase 및 기타 SDK를 변경하지 않는다.
  • 사용자가 완료한 Pod 의존성·상수 제거를 되돌리거나 재수행하지 않는다. pod install, 패키지 업데이트, 캐시 삭제는 계획에 포함하지 않는다.
  • Pods/**, generated/**, 빌드 산출물을 직접 정리하지 않는다. 미사용 Yandex 리소스 스크립트·목록 10개는 현재 활성 복사 단계에서 참조되지 않으므로 제외한다.
  • 현재 objectVersion = 77, 기존 작업물, 과거 광고 문서, 서버의 광고 보상 API와 운영 콘솔은 변경하지 않는다. worktree·브랜치 생성 및 커밋도 수행하지 않는다.

5. Target Users and Permissions

기존 라이브·커뮤니티·시리즈·알림·채팅 이용자에게 적용한다. 로그인, 권한, 구매 자격과 서버의 오류 정책은 변경하지 않는다.

6. 핵심 사용자 흐름

  1. 사용자가 기존 화면에 진입하면 광고 없이 기존 콘텐츠를 탐색한다.
  2. 채팅 쿼터가 부족하면 기존 10캔·20캔 구매 버튼을 사용한다.
  3. 기존 구매 응답에 따라 쿼터와 캔 잔액을 갱신한다. 광고 사전 로딩·표시·광고 보상 구매 경로는 실행하지 않는다.

7. 정보 구조와 라우팅

신규 화면이나 라우팅 변경은 없다. 기존 View 파일에서 광고 소비 코드만 제거한다. 정확한 대상 파일은 계획의 P1-T1~P1-T3에 기록한다.

8. 기능 요구사항

ID 상태 요구사항 수용 기준 Goal 연결
YAN-001 확정 배너 호출 11곳 제거 각 호출과 광고에만 붙은 modifier·빈 조건문을 제거하고 다른 콘텐츠는 유지 P1-T1
YAN-002 확정 보상형 광고 소비 코드 제거 showRewardedAdForChatQuota, prepareRewardedAdIfNeeded 및 호출부 제거, 쿼터 갱신 유지 P1-T2
YAN-003 확정 광고 전용 선언 제거 ChatRoomQuotaChargeType.ad, quotaAdAction, rewardedAdLoadFailed만 제거 P1-T2
YAN-004 확정 SDK 연결과 공용 광고 코드 제거 AppDelegate의 Yandex import·초기화·전용 주석 제거, 공용 파일 삭제, 두 타깃 프로젝트 참조 제거 P1-T3
YAN-005 확정 기존 충전·설정 보존 캔 구매 요청·UI와 두 plist, 마케팅 코드, Project Format 불변 P1-T2, P1-GATE

요구사항의 확정은 대화에서 합의한 범위를 뜻하며, 구현 착수 승인을 뜻하지 않는다. 문서 승인 전 코드 변경은 금지한다.

9. 반응형 기능 범위

기존 iOS 화면 지원 범위를 유지한다. 신규 크기 대응은 추가하지 않고 기존 지원 기기에서 광고 삭제 후 레이아웃을 확인한다.

10. UI/UX Expectations

  • LiveView, CharacterView의 광고 전용 음수 padding과 라이브 상세·알림 설정의 광고 전용 frame/padding은 광고와 함께 제거한다.
  • SeriesMainByGenreView의 광고만 감싼 조건문은 남기지 않는다. 다른 콘텐츠를 감싼 컨테이너나 공용 간격은 임의 변경하지 않는다.
  • ChatQuotaNoticeItemView의 10캔/15채팅, 20캔/40채팅 버튼과 quotaChatCount를 유지한다. 화면 접근성·오류 안내·로딩 동작의 추가 변경은 없다.

11. API 계약

TalkApi.purchaseChatQuota의 POST /api/chat/rooms/{roomId}/quota/purchase와 Repository는 유지한다. 기존 ChatQuotaPurchaseRequest의 container = "ios", chargeType = "CAN", canOption = "CAN_10" | "CAN_20" 직렬화와 optional 선언을 변경하지 않는다. 광고 전용 enum case와 그 호출 경로만 제거하며, DTO나 구매 함수를 재설계하지 않는다.

신규 API 계약, 서버 변경, 별도 api-contract.md는 필요하지 않다.

12. 보안과 데이터 취급

인증·결제·잔액 저장 로직은 변경하지 않는다. 문서·검증 로그에 토큰이나 SDK 키를 복사하지 않는다. 수동 충전 QA에는 승인된 테스트 계정과 재화를 사용하며, 실제 운영 계정에서 비용을 발생시키는 검증은 별도 동의 없이 수행하지 않는다.

13. 성능과 품질 요구사항

  • 저장소에 확인된 테스트 번들 타깃이 없으므로 이번 삭제만을 위한 테스트 인프라는 만들지 않는다. 정적 부재 검사, 보존 파일 대조, 두 스킴 빌드와 수동 QA를 사용한다.
  • rg 결과는 종료 코드 1만 부재 성공으로 해석한다. 0은 잔존, 2는 검사 오류다.
  • 미실행 빌드·수동 QA는 통과로 기록하지 않는다. 계정·기기 등 환경이 없으면 차단 사유와 미검증 범위를 남긴다.

14. 성공 기준

  • 앱 소스·활성 프로젝트·의존성 명세에 Yandex 참조가 없고 광고 전용 메서드·문구·enum case가 없다.
  • 두 plist와 기존 캔 구매 계약, 마케팅 흐름, 사용자 선행 변경이 보존된다.
  • SodaLive, SodaLive-dev Debug 빌드가 성공한다.
  • 11개 화면의 콘텐츠·스크롤·이동과 광고 전용 빈 공간 제거, 두 캔 구매 경로를 확인한다.
  • 실제 검증 결과 및 구현 후 리뷰를 계획 문서에 연결한다. 미검증 항목은 명시한다.

2026-10-13: 코드 리뷰 APPROVE, 두 기기용 Debug 빌드와 개발용 시뮬레이터 Debug 빌드 성공. 실제 DTO 직렬화 3개 시나리오 통과, 보존 파일 13개의 SHA-256 일치. 전용 시뮬레이터에서 홈 화면과 ATT 팝업 표시를 확인했지만, 11개 수정 화면 전체와 실서버 캔 구매는 검증하지 않았다. 이 수동 QA 항목은 [blocked]로 남긴다.

15. Open Questions

추가 인터뷰가 필요한 요구사항 미결정은 없다. 2026-10-13 사용자가 문서를 승인하고 문서대로 진행하도록 요청했다. 테스트 계정·기기 접근 가능 여부는 구현 후 수동 검증의 환경 조건으로 기록한다.

16. 요구사항 추적표

요구사항 API Contract Phase / Goal 자동 검증 수동 검증
YAN-001 해당 없음 1 / P1-T1, P1-GATE 배너 호출 부재·두 빌드 11개 화면 레이아웃·탐색
YAN-002~003 기존 계약 유지, §11 1 / P1-T2, P1-GATE 광고 경로 부재·구매 코드 대조 두 캔 옵션 성공·기존 실패 처리
YAN-004~005 기존 계약 유지, §11 1 / P1-T3, P1-GATE SDK·프로젝트 참조 부재·보존 파일 대조·두 빌드 앱 시작·충전·마케팅 변경 없음

17. Decision Log

날짜 ID 상태 결정 근거 영향
2026-10-13 DEC-001 확정 SDK·상수 제거는 사용자 선행 작업으로 취급 사용자 보고와 현재 파일 확인 전체 범위
2026-10-13 DEC-002 확정 두 SKAdNetwork 관련 키를 제거 대상에서 제외 사용자 직접 지시 YAN-005
2026-10-13 DEC-003 확정 문서만 작성 후 승인 대기, worktree 미사용 사용자 직접 지시 전체 실행
2026-10-13 DEC-004 제안 두 plist 전체 및 미사용 Pods 생성물은 수정하지 않음 최소 변경·생성물 직접 수정 금지, 문서 승인 시 적용 YAN-005
2026-10-13 DEC-005 확정 문서 승인에 따라 구현 착수, DEC-004 보존 방안 승인 사용자 “승인”, “문서대로 진행한다” 전체 실행

18. 변경 관리

범위 변경이나 추가 미결정이 생기면 이 문서의 Decision Log와 요구사항을 먼저 보강하고 plan-task.md에 반영한다. 기존 완료 기록은 덮어쓰지 않는다. 이전 배치·부분 제거 문서는 완료 이력으로 남기고, 이번 전체 잔여 참조 제거는 이 문서 쌍에서 이어서 관리한다.