fix(main): 최근 활동 이동을 보정한다

This commit is contained in:
Yu Sung
2026-07-30 16:13:32 +09:00
parent 0232cd4335
commit 3ae2dc19d6
7 changed files with 350 additions and 14 deletions

View File

@@ -0,0 +1,147 @@
# Phase 21 최근 활동 LIVE 이동 fallback 보정 리뷰
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 21 / Task 21.1~21.4 |
| 기준 commit 또는 working tree | `0232cd43356dd1988dea6cf03563716542cd491c` 기준 working tree의 Phase 21 변경 6개 파일 |
| 리뷰 일자 | 2026-07-30 |
| 리뷰어 | Codex |
| 기준 문서 | `docs/20260602_메인_홈_추천_UI_API_연동/prd.md`, `docs/20260602_메인_홈_추천_UI_API_연동/plan-task.md` |
| 리뷰 상태 | 판정 완료 |
## 2. 리뷰 목적과 범위
### 목적
- Phase 21의 완료 체크와 실제 모델, 활동 타입 변환, 탭 목적지, callback 연결 및 검증 기록이 일치하는지 확인한다.
- `LIVE`, `LIVE_REPLAY`, `AUDIO`, `COMMUNITY`, 알 수 없는 활동 타입의 이동 규칙과 기존 상세 진입 guard 재사용 여부를 확인한다.
### 포함 범위
- 코드:
- `SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift`
- `SodaLive/Sources/V2/Main/Home/Recommendation/Models/RecommendedActivityType.swift`
- `SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeActiveCreatorSection.swift`
- `SodaLive/Sources/V2/Main/Home/Recommendation/MainHomeRecommendationView.swift`
- `SodaLive/Sources/V2/Main/Home/MainHomeView.swift`
- `SodaLive/Sources/V2/Main/MainView.swift`
- 테스트:
- 변경된 실제 모델 소스를 `swiftc`로 컴파일한 임시 디코딩·라우팅 회귀 체크
- 저장소에 앱 테스트 번들 타깃이 없어 별도 unit test는 실행하지 않음
- 문서:
- PRD의 응답 스키마, 진입 규칙, 성공 기준, 검증 계획
- `plan-task.md`의 Phase 21 Task와 검증 기록
- 정적/빌드 검증:
- 공백 오류, 프로젝트 파일 유효성, `SodaLive-dev` Debug 빌드
### 제외 범위
- Phase 1~20 구현의 재검토
- 실제 서버 응답 계약 자체의 재검증
- 로그인·본인인증·민감 콘텐츠 설정 상태를 포함한 실기기/시뮬레이터 수동 탭 검증
- Phase 21과 무관한 기존 코드와 빌드 경고
## 3. 판정 기준
### 심각도
| 심각도 | 기준 |
|---|---|
| Blocker | 보안·데이터 손실 위험, 핵심 흐름 불능, 완료 판정을 무효화하는 문제 |
| High | 확정 요구사항·API Contract 위반 또는 주요 회귀 |
| Medium | 제한된 조건에서 발생하는 기능·접근성·복구 문제 |
| Low | 유지보수성, 문서 정합성 또는 비핵심 UX 문제 |
### 상태
| 상태 | 의미 | 후속 처리 |
|---|---|---|
| 후보 | 근거를 발견했지만 아직 재현·판정하지 않음 | 검증 후 상태 변경 |
| 확정 | 코드·test·문서 근거로 문제가 확인됨 | `plan-task.md` 회귀 수정 Task 후보 |
| 오탐 | 요구사항이나 실행 결과상 문제가 아님 | 근거를 남기고 종료 |
| 보류 | 외부 계약·환경·제품 결정이 필요함 | 담당 주체와 재개 조건 기록 |
| 수정 완료 | 수정과 관련 검증이 완료됨 | 실행 명령과 결과 연결 |
## 4. 검토한 근거
### 문서와 코드
- 요구사항:
- `prd.md:78-85``HomeActiveCreatorItem.creatorId`
- `prd.md:184-189`의 최근 활동 `LIVE`, `LIVE_REPLAY`, 기존 활동 타입 이동 규칙
- `prd.md:312-314`의 Phase 21 성공 기준
- 계획:
- `plan-task.md:540-629`의 Task 21.1~21.4
- `plan-task.md:633-670`의 Phase 21 구현 및 정정 검증 기록
- 코드:
- `MainHomeRecommendationResponse.swift:29-61`의 필수 `creatorId`와 탭 목적지 분기
- `RecommendedActivityType.swift:3-38``LIVE`/`LIVE_REPLAY` 분리 및 동일 I18n 문구
- `MainHomeActiveCreatorSection.swift:3-55`의 callback 전달
- `MainHomeRecommendationView.swift:38-44``onTapCreator` 연결
- `MainView.swift:474-509`의 양수 검사, 상세 진입 guard 및 최종 이동
- 테스트:
- 실제 변경 모델 소스와 임시 stub/check 소스를 함께 컴파일해 9개 디코딩·라우팅 시나리오와 `LIVE`/`LIVE_REPLAY` 표시 문구 일치를 확인했다.
- 임시 소스와 실행 바이너리는 검증 직후 `/private/tmp`에서 삭제했다.
### 실행 환경
```text
OS: macOS 26.0 (25A354)
Xcode: 26.0 (17A324)
Swift: 6.2
빌드 대상: Any iOS Device / SodaLive-dev / Debug
환경 변수: 별도 설정 없음, 인증 토큰 및 민감정보 미사용
```
### 실행한 검증
| 명령 또는 수동 검증 | 결과 | 핵심 증거 |
|---|---|---|
| `git diff --check` | 성공 | exit code 0, 출력 없음 |
| `plutil -lint SodaLive.xcodeproj/project.pbxproj` | 성공 | `OK` |
| `xcrun swiftc /private/tmp/sodalive_phase21_review_stubs.swift SodaLive/Sources/V2/Main/Home/Recommendation/Models/RecommendedActivityType.swift SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift /private/tmp/sodalive_phase21_review_check.swift -o /private/tmp/sodalive_phase21_review_check` | 성공 | 실제 변경 모델 소스 컴파일 성공 |
| `/private/tmp/sodalive_phase21_review_check` | 성공 | `Phase 21 routing checks passed: 9` |
| `xcodebuild -workspace SodaLive.xcworkspace -scheme SodaLive-dev -configuration Debug build` (sandbox) | 실패 | exit code 66, CoreSimulator·캐시 접근 제한으로 workspace를 열지 못한 환경 실패 |
| `xcodebuild -workspace SodaLive.xcworkspace -scheme SodaLive-dev -configuration Debug build` (sandbox 외 재실행) | 성공 | exit code 0, `BUILD SUCCEEDED` |
| 실기기/시뮬레이터 탭 검증 | 불가 | 실제 서버 응답과 인증 상태를 준비하지 않아 제외 범위로 유지 |
## 5. 발견 사항 요약
**확정 발견 사항 없음.**
- 문서의 `LIVE`, `LIVE_REPLAY`, `AUDIO`, `COMMUNITY`, unknown 분기와 실제 코드가 일치한다.
- `LIVE + targetId == nil``creatorId > 0` 검사와 최종 callback의 양수 guard가 확인된다.
- 기존 `performRecommendationDetailAction`과 라이브룸 입장 흐름을 재사용한다.
- working tree 기준 정적 검증, 임시 회귀 체크 및 `SodaLive-dev` Debug 빌드가 성공했다.
## 6. 발견 사항 상세
확정 발견 사항 없음.
실기기/시뮬레이터 수동 탭 검증은 제외 범위이며, 코드·문서 불일치나 자동 검증 실패로 판정하지 않았다.
## 7. 확정 항목의 plan·goal 전환
전환 항목 없음.
확정 발견 사항이 없으므로 `plan-task.md` Phase 21에 신규 회귀 수정 Task를 추가하지 않는다.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | Phase 21 문서, 변경 코드, callback 소비 지점, 정적 검증 및 빌드 확인 |
| 후보 항목 판정 완료 | 충족 | 남은 후보 없음 |
| 확정 항목 plan 반영 | 해당 없음 | 확정 발견 사항 없음 |
| 보류 항목의 담당·재개 조건 기록 | 해당 없음 | 보류 항목 없음 |
| 검증 명령과 결과 기록 | 충족 | 4절에 실제 명령, 성공·실패 및 환경 사유 기록 |
**최종 결론:** 확정 발견 사항 없음
**남은 항목:** 자동 리뷰 범위 내 없음. 실기기/시뮬레이터 수동 탭 검증은 제외 범위다.
## 9. 수정 후 검증 기록
해당 없음. 확정 발견 사항과 후속 수정이 없다.