docs(recommendation): 응원 크리에이터 검토 기록을 갱신한다

This commit is contained in:
2026-07-31 14:23:34 +09:00
parent ed54483cab
commit 7b9213a9ea
9 changed files with 922 additions and 6 deletions

View File

@@ -0,0 +1,104 @@
# Phase 5 리뷰 보고서
## 1. 리뷰 정보
| 항목 | 내용 |
|---|---|
| 리뷰 대상 | Phase 5 / Task 5.1~5.4 |
| 기준 commit 또는 working tree | 구현 commit `391acf9e`, `7d0cf0a8`, 현재 `5123494e` 기준 working tree |
| 리뷰 일자 | 2026-07-31 |
| 리뷰어 | Codex |
| 기준 문서 | PRD Feature E·F, `plan-task.md` Phase 5 |
| 리뷰 상태 | 보완 완료 |
## 2. 리뷰 목적과 범위
- 대상일 조회, section lock, lock 내부 double-check, single-flight, timeout·실패 격리, refresh 후 재조회 흐름을 확인한다.
- 구현된 동시성 계약의 직접 회귀 테스트가 존재하는지 확인한다.
## 3. 판정 기준
- 구현에는 해당 경로가 존재하지만 직접 테스트가 없는 경우 완료 증거 누락인 Low로 판정한다.
## 4. 검토한 근거
- 코드: `RecommendationSnapshotFallbackService.kt`, `HomeRecommendationQueryService.kt`
- 테스트: `RecommendationSnapshotFallbackServiceTest`, `HomeRecommendationQueryServiceTest`
- 정적 검색: `single|동시|refreshFutures|double-check`와 latch 기반 테스트
- 사용자 지시에 따라 Gradle compile/test는 실행하지 않았다.
## 5. 발견 사항 요약
| ID | 심각도 | 상태 | 제목 | 소유 Task | 후속 goal |
|---|---|---|---|---|---|
| `REV-P5-001` | Low | 보완 완료 | 동일 섹션 single-flight와 lock 내부 double-check의 직접 회귀 테스트가 없다 | Task R5.1 | `P5-R1` |
## 6. 발견 사항 상세
### REV-P5-001 — single-flight와 double-check의 직접 회귀 테스트가 없다
- **심각도:** Low
- **상태:** 확정
- **관련 요구사항:** Feature E, Task 5.1·5.3
- **소유 Task:** Task R5.1
**관찰 내용**
구현은 section별 `refreshFutures`와 lock 획득 후 `hasSnapshot(...)` 재확인을 수행한다. 현재 테스트는 lock miss, refresh 실패, timeout 후 worker 지속, marker 선존재, AI 작업 중 CHEER 독립 실행을 검증하지만 다음 경쟁 조건을 직접 재현하지 않는다.
- 동일 섹션의 동시 요청이 실제 refresh 1회만 공유하는지
- 최초 조회 뒤 lock 진입 전에 다른 실행 주체가 row/marker를 저장했을 때 refresh를 생략하는지
**영향**
향후 executor·future·lock 코드 변경에서 중복 refresh 방지의 핵심 경쟁 조건이 깨져도 focused test가 탐지하지 못할 수 있다.
**권장 조치**
sleep 대신 latch와 결정적 fake를 사용해 두 경쟁 조건을 고정하고, 실패가 확인될 때만 프로덕션 코드를 최소 수정한다.
**판정 기록**
- 2026-07-31 — fallback 테스트 전체와 구현의 동시성 분기를 대조해 확정했다.
- 2026-07-31 — 동일 섹션 동시 요청 single-flight와 lock 내부 double-check를 latch 기반 테스트로 추가했다. 현 구현이 테스트를 만족해 프로덕션 코드는 변경하지 않았고, `RecommendationSnapshotFallbackServiceTest``BUILD SUCCESSFUL`, 관련 `git diff --check`는 출력 없음으로 보완 완료했다.
## 7. 확정 항목의 plan·goal 전환
- `plan-task.md` Phase 5에 Task R5.1 / `P5-R1`을 추가했다.
## 8. 리뷰 종료 판정
| 판정 항목 | 결과 | 근거 |
|---|---|---|
| 리뷰 범위 전체 확인 | 충족 | fallback 코드·테스트 분기 대조 완료 |
| 후보 항목 판정 완료 | 충족 | `REV-P5-001` 확정 |
| 확정 항목 plan 반영 | 충족 | Task R5.1 |
| 검증 명령과 결과 기록 | 충족 | 정적 검색과 기존 기록 참조 |
**최종 결론:** 보완 완료
**남은 항목:** 없음
---
## 9. 2차 리뷰 기록 — 2026-07-31
- **리뷰 대상:** Phase 5 / Task 5.1~5.4·Task R5.1, `5123494e` 기준 미커밋 working tree.
- **검토 근거:** `RecommendationSnapshotFallbackService.kt:81-205`, `HomeRecommendationQueryService.kt:112-136`, `RecommendationSnapshotFallbackServiceTest`, `HomeRecommendationQueryServiceTest`.
- **검증 방법:** 대상일 exact snapshot 조회, marker 존재 판정, section lock·double-check·single-flight, 300ms/1,500ms, timeout 후 worker 유지, refresh 실패 격리, 16명 후보 재조회를 코드·테스트와 정적 대조했다. Gradle compile/test는 실행하지 않았다.
- **발견 사항:** 확정 발견 사항 없음.
- **plan·goal 전환:** 전환 항목 없음.
- **최종 결론:** 확정 발견 사항 없음.
- **남은 항목:** 없음.
---
## 10. 3차 리뷰 기록 — 2026-07-31
- **리뷰 대상:** Phase 5 / Task 5.1~5.4·Task R5.1, `5123494e` 기준 미커밋 working tree.
- **검토 근거:** `RecommendationSnapshotFallbackService.kt:28-245`, `HomeRecommendationQueryService.kt:112-136`, fallback service와 query service의 대상일·marker·lock miss·timeout·실패·동시성 테스트.
- **검증 방법:** 대상일 exact snapshot, section별 lock key, 300ms lock 대기, 1,500ms 홈 대기, lock 내부 double-check, section별 single-flight, timeout 후 worker 유지, 실패 격리, refresh 후 재조회와 16명 후보 전달을 정적으로 추적했다. Gradle compile/test는 실행하지 않았다.
- **발견 사항:** 확정 발견 사항 없음.
- **plan·goal 전환:** 전환 항목 없음.
- **최종 결론:** 확정 발견 사항 없음.
- **남은 항목:** 없음.