6.8 KiB
6.8 KiB
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 |
REV-P5-002 |
Medium | 보완 완료 | single-flight 테스트가 worker 완료 순서에 의존해 Jenkins에서 timeout된다 | Task R5.2 | P5-R2 |
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.mdPhase 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 전환: 전환 항목 없음.
- 최종 결론: 확정 발견 사항 없음.
- 남은 항목: 없음.
11. 4차 리뷰 기록 — 2026-08-03
- 리뷰 대상: Phase 5 / Task R5.1의
shouldShareSingleCheerCreatorRefreshFutureForConcurrentRequestsJenkins 실패. - 검토 근거: Jenkins
RecommendationSnapshotFallbackServiceTest.kt:322 TimeoutException,RecommendationSnapshotFallbackService.kt:141-149, 테스트의CapturingExecutor와 latch 흐름, 로컬cleanTestfocused test 실행, JDK 17CompletableFuture·CountDownLatch계약. - 확정 발견 사항:
REV-P5-002.taskSubmittedlatch는 worker task가 executor에 전달됐다는 사실만 보장하며, refresh future가refreshFutures에 게시됐거나 두 요청이 같은 future에서 대기 중임을 보장하지 않는다. Jenkins에서 첫 worker가 먼저 완료되면 reference가 제거되고 두 번째 요청은 실행되지 않는 새 captured task를 기다려 바깥get(1s)에서 timeout된다. - 판정: production single-flight 결함 근거는 없다. timeout 확대는 경쟁을 숨기므로 제외하고, refresh를 latch로 pending 상태에 유지한 채 두 요청의 refresh 호출 횟수 1회를 검증하도록 테스트만 수정한다.
- plan·goal 전환:
plan-task.mdPhase 5에 Task R5.2 /P5-R2를 추가했다. - 검증 결과: focused test 최초 1회와 연속 10회,
RecommendationSnapshotFallbackServiceTest전체,ktlintCheck,tasks --all, 전체cleanTest test,git diff --check가 모두 통과했다. Oracle 고강도 리뷰도 blocker 없이 승인했다. - 최종 결론:
P5-R2보완 완료. - 남은 항목: 없음.