[FIX/#466] 리뷰 목록 조회 1-based 페이지 계약 복원 - #467
Conversation
- #457에서 제거했던 페이지 번호 보정을 Math.max(page - 1, 0) 형태로 복원 - page=1은 첫 페이지로 유지되어 프론트 계약이 깨지지 않고, page 생략 시에도 음수가 되지 않아 #457의 500 에러는 그대로 해소 - 저장소 전반이 1-based 규약(@CheckPage, PageRequest.of(page - 1, ...))을 따르고 있어 리뷰 API만 0-based로 엇갈리던 상태를 정리 - page=1 / 생략 / page=2 / 정렬 유지 케이스 테스트 추가 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Caution Review failedFailed to post review comments. GitHub was unavailable or timed out while CodeRabbit was posting the review. Please request a new review later if the pull request still needs one. Use ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (2)
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review. 🧰 Additional context used📓 Path-based instructions (8)**`@Transactional`**: 서비스 구현 클래스 레벨에 선언.📄 CodeRabbit inference engine (GEMINI.md) Files:
`@Transactional`은 **서비스 구현 클래스 레벨**에 선언.📄 CodeRabbit inference engine (CLAUDE.md) Files:
Use Java 17 with 4-space indentation.📄 CodeRabbit inference engine (AGENTS.md) Files:
테스트 메서드명은 **영어**로 작성.📄 CodeRabbit inference engine (CLAUDE.md) Files:
비즈니스 로직이 Service에 위치📄 CodeRabbit inference engine (CLAUDE.md) Files:
테스트 메서드명은 **영어**로 작성한다.📄 CodeRabbit inference engine (GEMINI.md) Files:
코드 블록 내 주석은 작성하지 않는다.📄 CodeRabbit inference engine (CLAUDE.md) Files:
import 시 와일드카드(`*`)를 사용하지 않는다.📄 CodeRabbit inference engine (GEMINI.md) Files:
📝 WalkthroughWalkthrough리뷰 조회 3종이 프론트의 1-based 페이지 번호를 0-based Changes리뷰 페이지 보정
Priority: ➖ Normal Estimated code review effort: 2 (Simple) | ~10 minutes Severity of issue fixed: Medium 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 첫 페이지는 제자리로 Comment |
#️⃣연관된 이슈
📝작업 내용
#458(#457 수정)에서 발생한 회귀를 되돌립니다.
당시 리뷰 목록 조회 3종의 500 에러를 고치면서
PageRequest.of(pageable.getPageNumber() - 1, ...)보정을 제거했습니다. 500은 해소됐지만 해당 API들만 0-based 페이징으로 바뀌어 프론트와의 기존 계약이 깨졌습니다.page=1을 보내면 첫 페이지가 아니라 두 번째 페이지가 반환되는 상태입니다.#457 이슈 본문에 *"
spring.data.web.pageable.one-indexed-parameters설정도 없어 이-1보정을 정당화할 근거가 없다"*고 적었는데, 이 판단이 틀렸습니다. 이 저장소는 설정이 아니라 코드로 1-based 규약을 구현하고 있었습니다.@CheckPage기본 메시지 "페이지가 1보다 작을 수 없습니다"global/exception/annotation/CheckPage.javaCheckPageValidator의value > 0검증,PAGE_UNDER_ONE반환global/exception/validator/CheckPageValidator.javaPageRequest.of(page - 1, size, ...)InquiryServiceImpl,BackofficeInquiryServiceImpl,NotificationQueryServiceImpl,BackofficeNotificationServiceImplMath.max(pageable.getPageNumber() - 1, 0)+ "프론트에서 1-based 페이지를 보낸 경우 0-based 로 보정" 주석StudentServiceImpl#getUnreviewedUsage마지막 항목이 이번 문제의 정답 패턴이며 이미 같은 저장소에 있었습니다. 보정을 걷어내는 대신 이 패턴을 적용했어야 합니다.
🔎코드 설명(스크린샷(선택))
ReviewServiceImpl에toZeroIndexed()헬퍼를 두고 세 메서드 진입부에서 호출합니다.?page=1page생략?page=0?page=2Math.max가 핵심입니다. 단순- 1은page생략 시-1이 되어 #457의 500이 재발하고, 보정 제거는 계약을 깹니다. 두 요구를 동시에 만족시킵니다.대상은
GET /reviews/student,GET /reviews/partner,GET /reviews/store/{storeId}3개입니다. 프론트 앱 수정은 필요하지 않습니다.테스트
ReviewServiceImplTest에ArgumentCaptor로 실제 조회 인덱스를 검증하는 케이스를 추가했습니다.checkStudentReview_OneIndexedPage_QueriesFirstPagecheckStudentReview_PageOmitted_QueriesFirstPageWithoutErrorcheckStudentReview_SecondPage_QueriesIndexOnecheckStudentReview_PreservesSort./gradlew test전체 통과를 확인했습니다.💬고민사항 및 리뷰 요구사항 (Optional)
배포 순서
이 PR이 main 배포 전에 develop에 머지되어야 합니다. 지금 상태로 배포하면 프론트에 불필요한 앱 수정을 요구하게 됩니다. 프론트 공유 문서에서도 해당 항목을 제거했습니다.
별건 —
@CheckPage가 사용되지 않습니다@CheckPage와CheckPageValidator는 정의만 있고 실제 사용처가 0건입니다. 1-based 규약을 코드로 강제하려면 페이징 컨트롤러에 부착하는 게 맞고, 그럴 계획이 없다면 제거 대상입니다. 이번 범위 밖이라 손대지 않았는데, 어떻게 할지 의견 주시면 별도 이슈로 정리하겠습니다.규약 문서화
이번 건의 근본 원인은 1-based 규약이 코드에만 흩어져 있고 어디에도 명시되어 있지 않다는 점입니다.
CLAUDE.md에 페이징 규약을 한 줄 추가해두면 같은 실수가 반복되지 않을 것 같습니다.비고 (Optional)
🤖 Generated with Claude Code
Summary by CodeRabbit
버그 수정
테스트