11 KiB
Phase 15 커뮤니티 구매·상세 메뉴 리뷰 보고서
1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 15 / P15-T1~P15-T5, P15-GATE |
| 기준 commit 또는 working tree | 02cd583f 기반 미커밋 working tree |
| 리뷰 일자 | 2026-08-10 |
| 리뷰어 | Codex, 독립 재검토 phase15_review |
| 기준 문서 | prd.md F0-20260810, plan-task.md Phase 15 |
| 리뷰 상태 | 수정 검증 완료 |
2. 리뷰 목적과 범위
목적
- Phase 15의 미체크 항목이 단순 체크 누락인지 미구현인지 확인한다.
- PRD의 홈 Response, 유료 미구매 표시, 상세 메뉴 권한, 상위 새로고침 요구사항을 코드·테스트·Gate와 대조한다.
포함 범위
- 코드: Phase 15 파일 구조에 나열된 홈, 커뮤니티 탭, 상세, 상위 Activity, action 파일
- 테스트: Phase 15 focused local unit/source contract 테스트
- 문서:
prd.mdF0-20260810,plan-task.mdPhase 15 - 수동 검증: 코드/diff 정적 검토
제외 범위
app/src/androidTest, 기기·에뮬레이터 UI 조작, 스크린샷·시각 QA- 서버 Response 실제 배포 여부와 외부 API 운영 상태
3. 판정 기준
| 심각도 | 기준 |
|---|---|
| Blocker | 보안·데이터 손실, 핵심 흐름 불능 |
| High | 확정 PRD/API 계약 위반 또는 주요 회귀 |
| Medium | 제한 조건의 기능·접근성·복구 문제 |
| Low | 유지보수성, 문서 정합성, style Gate 문제 |
4. 검토한 근거
문서와 코드
- 요구사항: PRD
Home Response Contract,Home Community Requirements,Community Tab Requirements,Detail Purchase and Badge Requirements,Detail More Menu Requirements,Change Propagation Requirements - 계획:
P15-T1~P15-T5,P15-GATE - 코드/테스트: Phase 15 파일 구조와 각 Task에 명시된 파일
실행 환경
OS: Darwin 25.0.0 x86_64
Java: OpenJDK 17.0.15
Android/Gradle: 저장소 wrapper 및 debug variant
민감 환경 값: 기록하지 않음
실행한 검증
| 명령 | 결과 | 핵심 증거 |
|---|---|---|
| 홈 focused unit test | 성공 | BUILD SUCCESSFUL |
| 커뮤니/action focused unit test | 성공 | BUILD SUCCESSFUL |
CreatorChannelActivitySourceTest |
성공 | BUILD SUCCESSFUL |
./gradlew :app:mergeDebugResources |
성공 | BUILD SUCCESSFUL |
./gradlew :app:compileDebugKotlin |
성공 | BUILD SUCCESSFUL |
./gradlew :app:ktlintCheck |
실패 | CreatorChannelActivity.kt:29:1 Unused import 1건 |
git diff --check |
성공 | 출력 없음 |
| 수정 후 전체 focused test | 성공 | BUILD SUCCESSFUL |
| 수정 후 resource/compile/ktlint Gate | 성공 | BUILD SUCCESSFUL |
수정 후 git diff --check, git diff HEAD --check |
성공 | 출력 없음 |
5. 발견 사항 요약
| ID | 심각도 | 상태 | 제목 | 소유 Task | 후속 goal |
|---|---|---|---|---|---|
REV-P15-001 |
Low | 수정 완료 | 목록 메뉴 제거 후 미사용 import가 style Gate를 막음 | P15-R1 |
미사용 import 1줄 제거 및 Gate 재검증 |
REV-P15-002 |
High | 수정 완료 | 홈 reaction id가 작성자 row에 연결됨 | P15-R2 |
reaction id를 실제 하트·댓글 row로 이동 및 Gate 재검증 |
REV-P15-003 |
High | 수정 완료 | 공유 FeedItem 잠금 정책이 다른 홈 화면 reaction을 숨김 | P15-R3 |
크리에이터 채널 홈만 잠금 숨김 정책을 선택하고 공유 기본값 회귀 검증 |
REV-P15-004 |
Low | 수정 완료 | 메인 홈 회귀 테스트 파일의 미사용 import가 style Gate를 막음 | P15-R4 |
미사용 import 1줄 제거 및 Gate 재검증 |
6. 발견 사항 상세
REV-P15-001 — 목록 메뉴 제거 후 미사용 import가 style Gate를 막음
- 심각도: Low
- 상태: 수정 완료
- 관련 요구사항:
P15-T5orphan 제거,P15-GATE - 소유 Task:
P15-R1
관찰 내용
CreatorChannelActivity의 목록 고정/삭제 로직을 제거한 후 SharedPreferenceManager import가 남아 ktlintCheck가 실패했다.
근거
- 코드:
app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt:29 - 검증:
./gradlew :app:ktlintCheck결과Unused import (no-unused-imports) - 문서:
plan-task.mdP15-T5,P15-GATE
영향
기능 동작에는 영향이 없으나 Phase 15 style Gate를 통과할 수 없다.
권장 조치
SharedPreferenceManager import 1줄만 제거하고 ktlintCheck와 Phase 15 Gate를 재실행한다.
판정 기록
- 2026-08-10 — 기능 테스트·resource merge·compile은 통과했고 ktlint 정확한 1건으로 확정했다.
- 2026-08-10 —
SharedPreferenceManagerimport 1줄 제거 후 최종ktlintCheck와 Phase 15 Gate가 PASS했다.
REV-P15-002 — 홈 reaction id가 작성자 row에 연결됨
- 심각도: High
- 상태: 수정 완료
- 관련 요구사항: PRD
Home Community Requirements,P15-T2 - 소유 Task:
P15-R2
관찰 내용
FeedCommunityView.bind()는 ll_feed_community_reaction에 item.showReaction을 적용하지만, XML의 해당 id가 프로필·닉네임·작성 시간 row에 붙어 있다. 실제 하트·댓글 row에는 id가 없다.
근거
- XML:
view_feed_community.xml:36-41의ll_feed_community_reaction아래에iv_feed_community_profile이 있음 - XML:
view_feed_community.xml:154-195의 실제 reaction row에 id가 없음 - 코드:
FeedCommunityView.kt:51,FeedCommunityView.kt:81
재현 또는 검증 절차
price > 0 && existOrdered == false인 홈 item의showReaction == false를 확인한다.FeedCommunityView.bind()가ll_feed_community_reaction.isVisible = false를 적용한다.- XML tree에서 해당 id가 작성자 row를 가리키므로 작성자 row가 숨겨진다.
- 실제 reaction row는 자신의 visibility binding을 받지 않아 하트·댓글 UI가 남는다.
영향
유료 미구매 홈 item이 PRD와 반대로 작성자 영역을 숨기고 reaction UI를 노출한다.
권장 조치
ll_feed_community_reaction id를 작성자 row에서 실제 하트·댓글 row로 이동한다.
판정 기록
- 2026-08-10 — XML tree와 binding 대상을 대조해 PRD 2번을 재현하는 실제 결함으로 확정했다.
- 2026-08-10 — id를 실제 하트·댓글 reaction row로 이동하고 focused/resource/compile 및 최종 Gate PASS를 확인했다.
REV-P15-003 — 공유 FeedItem 잠금 정책이 다른 홈 화면 reaction을 숨김
- 심각도: High
- 상태: 수정 완료
- 관련 요구사항: PRD
Edge Cases,Constraints & Dependencies,P15-T1~P15-T2 - 소유 Task:
P15-R3
관찰 내용
FeedItem.Community.showReaction = !isLocked와 공유 FeedCommunityView.bind() 조합이 크리에이터 채널 홈뿐 아니라 메인 홈 인기 커뮤니티에도 적용된다. 메인 홈 mapper도 price, existOrdered를 전달하므로 유료 미구매 item의 기존 reaction 표시가 함께 사라진다.
근거
- 공유 정책:
FeedItem.kt의showReaction,showComment - 다른 호출부:
HomeRecommendationMappers.kt:84-103이price,existOrdered를 전달 - 공유 View 사용:
HomePopularCommunityAdapter.kt:49의view.bind(item.item) - 문서: PRD
다른 화면에서 사용하는 FeedItem.Community는 신규 필드 기본값으로 기존 표시 동작을 유지한다.
영향
요구 범위 밖인 메인 홈 인기 커뮤니티의 유료 미구매 item 표시가 변경되어 기존 화면 회귀가 발생한다.
권장 조치
공유 모델의 신규 정책 기본값은 기존 reaction 표시를 유지하고, 크리에이터 채널 홈 mapper만 잠금 reaction 숨김을 명시적으로 선택한다.
판정 기록
- 2026-08-10 — 전체
FeedItem.Communityproduction 생성자와 공유 View 호출부를 추적해 실제 범위 확장 결함으로 확정했다. - 2026-08-10 — 기본값은 기존 reaction 표시를 유지하고 크리에이터 채널 홈만 opt-in하도록 수정했다. 공유 모델·메인 홈 mapper 회귀 테스트와 최종 Gate가 PASS했다.
REV-P15-004 — 메인 홈 회귀 테스트 파일의 미사용 import가 style Gate를 막음
- 심각도: Low
- 상태: 수정 완료
- 관련 요구사항:
P15-R3,P15-GATE - 소유 Task:
P15-R4
관찰 내용
메인 홈 mapper 회귀 테스트 추가로 HomeMainFragmentLayoutTest가 다시 lint 대상이 되면서 사용처가 없는 ColorDrawable import 1건이 확인됐다.
근거
- 코드:
HomeMainFragmentLayoutTest.kt:6 - 검증:
./gradlew :app:ktlintCheck결과Unused import
영향
기능 동작에는 영향이 없으나 Phase 15 style Gate가 실패한다.
권장 조치
사용처가 없는 ColorDrawable import 1줄만 제거한다.
판정 기록
- 2026-08-10 —
rg로 import 외 사용처가 없음을 확인해 정확한 style Gate 결함으로 확정했다. - 2026-08-10 —
ColorDrawableimport 1줄 제거 후ktlintCheck와 최종 focused test Gate가 PASS했다.
7. 확정 항목의 plan·goal 전환
plan-task.mdPhase 15에Task 15.R1/ goalP15-R1,Task 15.R2/ goalP15-R2,Task 15.R3/ goalP15-R3,Task 15.R4/ goalP15-R4를 추가했다.- 각 항목의 대상 파일, 최소 수정 범위, 회귀 검증, 완료 증거를 명시했다.
8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | PRD/plan·production/test/diff 대조 |
| 후보 항목 판정 완료 | 충족 | REV-P15-001~REV-P15-004 확정 |
| 확정 항목 plan 반영 | 충족 | P15-R1~P15-R4 |
| 보류 항목 기록 | 해당 없음 | 없음 |
| 검증 명령과 결과 기록 | 충족 | P15-R1~P15-R4 수정 후 최종 Gate PASS |
최종 결론: 수정 검증 완료
남은 항목: 없음. 기기·에뮬레이터 수동 UI 확인과 실제 서버 Response 배포 상태는 리뷰 범위 밖이다.
9. 수정 후 검증 기록
REV-P15-001:CreatorChannelActivity의 미사용SharedPreferenceManagerimport 1줄을 제거했다.REV-P15-002:ll_feed_community_reactionid를 프로필 row에서 실제 하트·댓글 row로 이동했다.REV-P15-003:FeedItem.Community.hideReactionWhenLocked기본값을false로 두고 크리에이터 채널 홈 mapper만true를 전달했다. 메인 홈 인기 커뮤니티 잠금 item의 기존 reaction 표시 회귀 테스트를 추가했다.REV-P15-004:HomeMainFragmentLayoutTest의 미사용ColorDrawableimport 1줄을 제거했다.- 최종 전체 focused test:
BUILD SUCCESSFUL. - 최종
:app:mergeDebugResources,:app:compileDebugKotlin,:app:ktlintCheck:BUILD SUCCESSFUL. - 최종
git diff --check,git diff HEAD --check: 출력 없이 PASS. - 정적 재검토: 구매 호출은 상세에만 존재하고, 홈·커뮤니티 item은 상세 이동만 수행하며, 상세 배지 제거·권한별 메뉴·홈+커뮤니티 refresh 계약이 유지됨을 확인했다.
- 독립 재검토: Critical/Minor 없음, Important 1건(
REV-P15-003)을 수정 반영했다. - 수정 후 독립 최종 재검토:
REV-P15-001~REV-P15-004반영을 확인했고 새 Critical/Important/Minor 이슈 없음으로 판정했다.