Files
voiceon-character-admin/docs/20260725_AI캐릭터관리자웹/reviews/phase7-fan-talk.md

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 조합을 기대

재현 또는 검증 절차

  1. FanTalk 목록과 답변 Sheet를 연다.
  2. createdAtUtcZ 문자열 그대로 표시되는 것을 확인한다.
  3. 미답변 글에 답변을 등록한다.
  4. 성공 상태가 내부 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-001plan-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.tsxformatSeoulDateTime을 사용하고, 저장 성공 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-talkstests/e2e LSP diagnostics 오류 0건, npm run typecheck exit 0, targeted git diff --check no 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를 PRD FANTALK-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-talks 3 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 회귀가 남는다.