bibimbap/.atp/work-session/20260622-092800/implementation/fix-L1.md

69 lines
4.3 KiB
Markdown

---
phase: implementation
agent: implementation-advisor
agent_version: 1
generated_at: 2026-06-22T10:10:00+09:00
fix_loop: L1
concerns: []
concerns_checked: true
planned_workers: 1
actual_workers: 0
workers_spawned: 0
---
# FIX LOOP L1 — GameReviewControllerTest RED 8건 해소
## 근본 원인 (확정)
**가설 1 (기존/신규 테스트 계약 미갱신) 단독.** 컨트롤러 버그(가설 2) 아님.
- 실패 8건 전부 POST body 가 BODY_MIN(10자) 미만 → 컨트롤러가 design.md AC-9
"리뷰 본문 trim 후 9자 거부(400), 10자 통과" 에 따라 **정당하게 400** 반환.
- 컨트롤러 axes 바인딩은 무관: 테스트가 `controller.createReview(...)` 를 6개 위치 인자로
직접 호출(`createReview`/`updateReview` 래퍼, test:409-421) → MockMvc 폼바인딩 경로 미사용.
`@RequestParam` 평면 파라미터(immersion=…) 구성과도 무관. 검증 순서도 design §5.3 정합 확인
(CSRF→auth→game존재→axes파싱→body검증→overall계산→conflict→insert→axes insert).
- conflict 테스트(409 기대)도 동일 원인: 1st POST 의 body 가 3자("또작성") 라 body 검증에서
400 으로 죽어 conflict(169행) 까지 도달 못 함.
### 실패 8건 본문 길이 (수정 전)
| 테스트 | 본문(전) | 길이 | 수정 후 본문 | 길이 |
|---|---|---|---|---|
| createReviewReturnsEditedFalse:72 | 재미있음 | 4 | 정말 재미있는 게임입니다 | 13 |
| updateReviewReturnsEditedTrue:90 | 더 좋아짐 | 5 | 수정 후 훨씬 더 좋아졌습니다 | 16 |
| createSecondReviewReturnsConflict:109 | 또작성 | 3 | 같은 게임에 또 작성 시도합니다 | 17 |
| assertCreateRatingAccepted(1/5 경계) | 내용입니다열자 | 7 | 별점 경계값 통과 검증 본문입니다 | 18 |
| createReviewAutoAveragesOverall…:258 | 자동평균테스트 | 7 | 별점 자동평균 계산 검증 본문 | 16 |
| createReviewUsesManualOverall…:281 | 수동평점테스트 | 7 | 수동 별점 사용 검증 본문입니다 | 17 |
| createReviewPersistsSixAxes:306 | 여섯축저장테스트 | 8 | 여섯 축 저장 검증용 본문입니다 | 17 |
## 수정 내역 (테스트만, 컨트롤러/계약 불변)
파일: `src/test/java/com/pandoli365/bibimbap/controller/api/GameReviewControllerTest.java`
7개 지점 본문 문자열 교체(헬퍼 `assertCreateRatingAccepted` 1곳이 rating 1/5 두 boundary 케이스 커버 → 실패 8건):
- 72행, 90행, 109행, 258행, 281행, 306행 직접 교체
- `assertCreateRatingAccepted` 본문(402행) 교체 → createReviewAcceptsRatingOneBoundary / FiveBoundary 동시 해소
추가(우연통과 배제, §2.6 다항목 재검):
- `assertCreateRatingRejected` 본문(382행) "내용입니다열자"(7자)→"별점 범위 검증용 본문입니다"(15자) 로 상향.
기존 7자였다면 rating 0/6 거부를 검증하려 해도 body 검증(400)에서 먼저 걸려 **우연히** 400 통과할
위험이 있었음. body 를 10자 이상으로 올려 rating 검증 분기까지 실제 도달함을 보장.
**행위 검증 전부 보존**: edited 마커(false/true), 게임당1회 409(never addGameReview),
rating 1~5 경계, overall 자동평균(rating=4·ratingManual=false)/수동(rating=2·manual=true),
addReviewAxes 6행 — 모든 assertion 원형 유지. 검증을 무력화하거나 계약을 약화하지 않음.
## 공유 문자열 일괄치환 회피 (정밀성)
"내용입니다열자"(7자) 는 통과 중인 CSRF/forbidden/missing-axis 테스트(190/204/235행)에도 쓰임.
그 테스트들은 본문 검증 **이전 단계**(CSRF 403 / 비작성자 FORBIDDEN / axis 누락 400)에서 분기되어
짧은 본문이어도 정상 통과 → 의도된 단축 본문. 따라서 일괄 치환 금지, 성공경로 헬퍼 2곳만 정밀 교체.
## 실행 결과
- `./mvnw test -Dtest=GameReviewControllerTest`**Tests run: 20, Failures: 0** (GREEN)
- `./mvnw test` (전체) → **Tests run: 43, Failures: 0, Errors: 0, Skipped: 0** (회귀 0)
- GameCommentControllerTest 17/17, GameReviewControllerTest 20/20,
UserControllerCsrfTest 5/5, BibimbapApplicationTests 1/1
## 손대지 않은 항목 (지시 준수)
- GameReviewController.java 등 main 소스 무수정 (계약·검증순서 design §5 정합 확인만).
- ${}0 / sort5 / axis6 grep 검증, DbUpdateQueryGeneratorTest — 미접촉.