190 lines
11 KiB
Markdown
190 lines
11 KiB
Markdown
# 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
|
|
|
|
### 실행 환경
|
|
|
|
```text
|
|
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. `createdAtUtc`가 `Z` 문자열 그대로 표시되는 것을 확인한다.
|
|
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-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/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` 회귀가 남는다.
|