11 KiB
11 KiB
Phase 7 FanTalk 코드 리뷰·QA
1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 7 / FanTalk 목록·답변 작성·수정·원글 soft delete |
| 기준 commit 또는 working tree | dd30e36323543e8f60e9983326503653e8001f12, 2026-07-31 종합 재점검 당시 사용자 변경을 포함한 current working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | prd.md, api-contract.openapi.json 2.3.0, plan-task.md |
| 리뷰 상태 | 판정 완료, 회귀 수정 완료 |
2. 리뷰 목적과 범위
목적
- FanTalk 목록, 답변 판정·작성·수정, 원글 soft delete와 responsive Sheet를 계약에 맞춰 검증한다.
- UTC 응답과 mutation 성공 feedback이 운영자 화면용 표현으로 변환되는지 확인한다.
포함 범위
- 코드:
src/features/fan-talks - 테스트: FanTalk contract/UI/E2E
- 문서:
FANTALK-001~FANTALK-012, PRD 날짜·표시 규칙,P7-* - 수동 검증: list/card/sheet/reply의 날짜·성공 문구 정적 대조
제외 범위
- 제품 범위에서 제외된 별도 FanTalk 상세 route와 서버 sort/filter
- 외부 서버 fixture를 이용한 수동 mutation
3. 판정 기준
심각도는 Blocker, High, Medium, Low, 상태는 후보, 확정, 오탐, 보류, 수정 완료를 사용한다. 계약값을 payload/model에 보존하는 것과 사용자 표시를 구분해 판정한다.
4. 검토한 근거
문서와 코드
- 요구사항:
FANTALK-009,FANTALK-010, PRD §11·§13 - 계약: FanTalk list item과 reply response의
createdAtUtc, ID fields - 계획:
P7-T1~P7-GATE - 코드:
FanTalkList.tsx:28,FanTalkListItem.tsx:15,FanTalkReplySheet.tsx:16-20,49-55,109-114 - 테스트: FanTalk UI test의 raw UTC·내부 ID 성공 문구 assertion
실행 환경
macOS 26.0 / Node v24.12.0 / npm 11.7.0
Playwright 4 projects, 320/768/1280px와 keyboard viewport 포함
실행한 검증
| 명령 또는 수동 검증 | 결과 | 핵심 증거 |
|---|---|---|
npm run test:run |
성공 | 72 files, 354 tests passed |
npm run e2e:mock |
부분 실패 | FanTalk 관련 실행 항목 통과 또는 프로젝트 정책상 skip; 전체 origin 실패는 REV-P0-004 |
npm run typecheck / npm run lint / npm run build |
성공 | 모두 exit 0 |
| 날짜·success feedback 정적 대조 | 실패 | 모든 surface가 UTC 원문을 출력하고 생성 성공 문구가 내부 ID 3개를 노출 |
5. 발견 사항 요약
| ID | 심각도 | 상태 | 제목 | 소유 Task | 후속 goal |
|---|---|---|---|---|---|
REV-P7-001 |
Medium | 수정 완료 | FanTalk가 UTC 원문과 내부 ID 중심 성공 문구를 운영자에게 노출한다 | P7-R1 |
P7-R1 |
6. 발견 사항 상세
REV-P7-001 — FanTalk가 UTC 원문과 내부 ID 중심 성공 문구를 운영자에게 노출한다
- 심각도: Medium
- 상태: 수정 완료
- 관련 요구사항:
FANTALK-009,FANTALK-010, PRD §11, §13 - 관련 계약: list/reply response
createdAtUtc, reply response ID fields - 소유 Task: 신규
P7-R1
관찰 내용
FanTalk desktop list, mobile card, Sheet 원문과 저장된 답변이 2026-...Z 원문을 그대로 표시한다. 새 답변 성공 메시지는 fanTalk <id> · reply <id> · creator <id> · <UTC>로 구성돼 성공 여부보다 내부 식별자를 앞세운다.
근거
- 코드:
src/features/fan-talks/components/FanTalkList.tsx:28 - 코드:
src/features/fan-talks/components/FanTalkListItem.tsx:15 - 코드:
src/features/fan-talks/components/FanTalkReplySheet.tsx:20,52,112 - 문서:
prd.md:328-329,prd.md:637,prd.md:806 - 테스트: 현재 FanTalk test가 raw UTC와 내부 ID 조합을 기대
재현 또는 검증 절차
- FanTalk 목록과 답변 Sheet를 연다.
createdAtUtc가Z문자열 그대로 표시되는 것을 확인한다.- 미답변 글에 답변을 등록한다.
- 성공 상태가 내부 fanTalk/reply/creator ID와 UTC 원문을 표시하는 것을 확인한다.
영향
운영자가 시간대를 직접 계산해야 하고, 핵심 동작 완료 여부보다 내부 구현 정보가 강조된다. desktop/mobile/Sheet 전체에 같은 문제가 반복된다.
권장 조치
중앙 날짜 formatter로 Asia/Seoul 표시를 적용하고 “답변이 등록되었습니다” 같은 행동 중심 success feedback을 사용한다. ID와 UTC 원본은 model·API test에만 보존한다.
판정 기록
- 2026-07-30 — 네 surface, response contract와 PRD 중앙 formatter 규칙을 대조해 확정.
- 2026-07-30 —
P7-R1에서 공통 서울 시각 formatter와 한국어 action-centered success copy를 적용해 수정 완료.
7. 확정 항목의 plan·goal 전환
REV-P7-001→plan-task.md신규P7-R1- goal objective:
[P7-R1] FanTalk 날짜와 저장 성공 문구를 운영자용 표현으로 현지화한다.
8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | FanTalk code·test·계약 대조 |
| 후보 항목 판정 완료 | 충족 | 1건 수정 완료 |
| 확정 항목 plan 반영 | 충족 | P7-R1 |
| 보류 항목의 담당·재개 조건 기록 | 해당 없음 | 보류 없음 |
| 검증 명령과 결과 기록 | 충족 | §4 |
최종 결론: 수정 goal 완료
남은 항목: 실제 server integration은 기존 Gate 정책에 따라 mock UI 증거와 분리해 추적한다.
9. 수정 후 검증 기록
P7-R1 수정 완료 — 2026-07-30
- RED:
npm run test:run -- src/features/fan-talks는 raw UTC와 내부 ID success copy 노출을 잡아 3 failed tests로 실패했다.npm run e2e:mock -- tests/e2e/fan-talk.spec.ts --project=chromium은 목록 raw UTC 표시 assertion에서 실패했다. - GREEN:
FanTalkList.tsx,FanTalkListItem.tsx,FanTalkReplySheet.tsx가formatSeoulDateTime을 사용하고, 저장 성공 status는답변이 등록되었습니다.,답변이 수정되었습니다.만 표시한다. - 검증:
npm run test:run -- src/features/fan-talks는 3 files / 13 tests passed,npm run e2e:mock -- tests/e2e/fan-talk.spec.ts --project=chromium은 7 passed, 전체npm run e2e:mock -- tests/e2e/fan-talk.spec.ts는 26 passed / 2 skipped였다. - 정적 확인:
src/features/fan-talks와tests/e2eLSP diagnostics 오류 0건,npm run typecheckexit 0, targetedgit diff --checkno output.
10. 2차 점검 결과 — 2026-07-30
- Phase 7의 원래 목록·POST·표시 범위에서
REV-P7-001수정 완료 상태가 유지된다. - Phase 10에서 추가된 PUT 응답과 POST→후속 PUT reply ID 결함은 이 보고서에 중복 등록하지 않고
REV-P10-004~005/P10-R4에서 추적한다.
11. 2026-07-31 재점검
- 범위: FanTalk 목록·답변 POST/PUT·팬 원글 DELETE,
creatorReplies[].fanTalkId, UTC 표시, mutation 중복 guard를 PRDFANTALK-001~012와 OpenAPI 2.3.0에 재대조했다. - 검증: 전체 unit 72 files / 360 tests와 server allowlist 36 tests에서 관련 회귀가 통과했다. 전체 Mock matrix에서도 FanTalk 시나리오는 각 project에서 통과하거나 문서화된 platform-policy skip만 발생했다.
- 판정: Phase 7 신규 발견은 없다.
REV-P7-001,REV-P10-004~005수정 완료 상태가 유지된다. - 남은 항목: 실제 개발 API FanTalk mutation은 기존 수동 QA 대기 상태다.
- 신규 Task: 없음.
12. 최종 Phase별 점검 — 2026-07-31
- 검토 범위: FanTalk 목록, 답변 POST/PUT, 원글 DELETE, reply ID·UTC·목록 재조회 불변식을
FANTALK-*, OpenAPI,P7·P10과 대조했다. - 실행 증거:
npm run test:run -- src/features/fan-talks3 files / 13 tests, mock Chromium FanTalk 시나리오 7 tests가 통과했다. - 판정: endpoint·DTO의 별도 신규 finding은 없다. 미답변 원글 DELETE 실패가 표시되지 않고 confirm dialog가 pending/error를 받지 않는 문제는 다른 일반 mutation 상태 공백과 함께
REV-P9-006/P9-R6에 귀속했다. - 남은 위험: 실제 개발 API FanTalk mutation 수동 QA와
P9-R6완료가 필요하다. - 신규 Phase 7 Task: 없음. 중복 Task 대신
P9-R6에서 추적한다.
13. 종합 재점검 — 2026-07-31
- 검토 범위: FanTalk 목록·POST/PUT reply·팬 원글 DELETE, reply ID·UTC·재조회·mutation pending/error를 OpenAPI와 PRD
FANTALK-*에 재대조했다. - 실행 증거: FanTalk를 포함한 도메인 묶음 36 files / 206 tests, exact server E2E 18/18, 현재 두 project mock E2E 109 passed / 5 skipped가 통과했다.
- 판정: Phase 7 소유의 확정 신규 finding 없음.
P9-R6의 DELETE pending/error 보강도 현재 test에서 통과했다. - 남은 위험: 실제 개발 API FanTalk mutation 수동 QA가 필요하다. Safari/WebKit은 현재 지원 범위에서 제외한다.
- 신규 Phase 7 Task: 없음.
14. 요청 기준 재리뷰 — 2026-07-31
- 검토 범위: FanTalk list, reply POST/PUT, 팬 원글 DELETE, reply row ID, UTC 표시와 pending/error 회복.
- 실행 증거: 관련 unit과 4-project mock FanTalk create/edit/delete journey가 0 failure였고 OpenAPI PUT/POST response schema 분리도 contract test에서 통과했다.
- 판정: Phase 7 소유의 확정 신규 발견 사항 없음.
- 남은 위험: 실제 개발 API 답변 수정·원글 삭제·동시 POST 후 reply 1개 불변식 수동 QA.
- 신규 Phase 7 Task: 없음.
15. 최종 재검증 — 2026-07-31
- 검토 범위: FanTalk list, reply POST/PUT, 팬 원글 DELETE, reply ID·UTC 표시와 pending/error recovery.
- 실행 증거: 전체 unit 394 tests와 4-project mock FanTalk 시나리오가 0 failure였고 OpenAPI POST/PUT response schema 분리도 통과했다.
- 판정: Phase 7 소유의 확정 신규 발견 사항 없음.
- 남은 위험: 실제 개발 API 답변 수정·원글 삭제·동시 POST 후 reply 1개 불변식 수동 QA.
- 신규 Phase 7 Task: 없음.
16. 2026-07-31 문서 기준 재리뷰
- 검토 범위: FanTalk list, reply POST/PUT, 팬 원글 DELETE, reply ID·UTC·pending/error·단일 답변 불변식을
FANTALK-001~012·OpenAPI·P7·P10-T5에 대조했다. - 실행 증거: FanTalk reply를 포함한 실패 후보 5-spec focused는 25 tests passed, FanTalk contract/pending test는 full output에서 통과했다. type·lint·build·server E2E 36 tests도 통과했다. full unit 비결정성은
REV-P9-009/P9-R9로 분리했다. WebKit full 중 FanTalk journey는 1회 실패했지만 동일 focused test가 통과해REV-P9-010/P9-R10으로 분리했다. - 판정: FanTalk endpoint·DTO·UI 소유의 확정 신규 발견 사항 없음. 후보·오탐·보류 0건, 신규 Phase 7 Task 없음.
- 남은 위험: 실제 개발 API reply 수정·원글 삭제·동시 POST 수동 QA와
P9-R9~R10회귀가 남는다.