Skip to content

[Feat] 랭킹 페이징 API#318

Merged
david-parkk merged 4 commits intoKU-rum:developfrom
david-parkk:feat/#317
Oct 27, 2025
Merged

[Feat] 랭킹 페이징 API#318
david-parkk merged 4 commits intoKU-rum:developfrom
david-parkk:feat/#317

Conversation

@david-parkk
Copy link
Contributor

@david-parkk david-parkk commented Oct 24, 2025

#️⃣ 연관된 이슈

closes #317

📝작업 내용

  • 랭킹 페이징 API 추가

작업 상세 내용

  • 랭킹 페이징 API 추가했습니다
  • 페이징 기준이 랭킹입니다

💬리뷰 요구사항

리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요.

Summary by CodeRabbit

  • 새로운 기능

    • 특정 순위 범위(startRank/endRank)를 지정해 장소의 순위 목록을 조회하는 새 API 엔드포인트 추가 — 각 항목에 순위, 닉네임 목록, 공유수 및 본인 여부 포함.
  • 검증 / 오류 처리

    • 순위 범위 유효성 검사 추가 — 유효하지 않은 범위 요청 시 400 응답 및 명확한 오류 코드 반환.
  • 테스트

    • 컨트롤러 단위 테스트로 전환하고 해당 엔드포인트에 대한 요청/응답 검증 및 문서화 테스트 추가.

@coderabbitai
Copy link

coderabbitai bot commented Oct 24, 2025

Walkthrough

지정한 순위 범위(startRank, endRank)에 따른 장소 랭킹 조회 기능이 추가되었습니다. 저장소 쿼리, 서비스 메서드, 응답 레코드, 컨트롤러 엔드포인트, 컨트롤러 테스트 및 관련 예외 상태가 도입되었습니다.

Changes

Cohort / File(s) 변경 요약
저장소 계층
src/main/java/ku_rum/backend/domain/rank/domain/repository/PlaceRankRepository.java
1-기반 순위 범위(startRank, endRank)를 조회하는 findRankByRange 쿼리 메서드 추가 (DENSE_RANK 기반, PlaceRankWithRankingProjection 반환)
서비스 계층
src/main/java/ku_rum/backend/domain/rank/application/RankService.java
getPlaceRanks(CustomUserDetails, Long, int, int) 메서드 추가 — 입력 검증(validateRankRange), findRankByRange 호출, 랭킹별 그룹화(TreeMap) 후 GetPlaceRankResponse로 매핑
응답 객체
src/main/java/ku_rum/backend/domain/rank/application/response/GetPlaceRankResponse.java
새로운 레코드 GetPlaceRankResponse(int ranking, List<String> nickname, int sharingCount, boolean isSelf) 및 정적 팩토리 from(List<PlaceRankWithRankingProjection>, User) 추가 (검증, 정렬, 매핑, isSelf 판별)
프레젠테이션 계층
src/main/java/ku_rum/backend/domain/rank/presentation/RankController.java
GET /api/v1/places/ranks/{placeId} 엔드포인트 추가 — 쿼리파라미터 startRank, endRank 수신 후 rankService.getPlaceRanks(...) 호출 및 BaseResponse.ok로 반환
테스트
src/test/java/ku_rum/backend/domain/rank/presentation/RankControllerTest.java
테스트 범위 축소(@WebMvcTest), ApiLogRepositoryJwtTokenAuthenticationFilter MockBean 추가, getPlaceRank 컨트롤러 테스트(@WithMockUser, 쿼리파라미터 포함) 추가
공통 상태 코드
src/main/java/ku_rum/backend/global/support/status/BaseExceptionResponseStatus.java
새로운 예외 상태 INVALID_RANK_RANGE(1206, HttpStatus.BAD_REQUEST, "잘못된 랭킹입니다") 추가

Sequence Diagram(s)

sequenceDiagram
    actor Client
    participant Controller as RankController
    participant Service as RankService
    participant Repo as PlaceRankRepository
    participant Response as GetPlaceRankResponse

    Note over Client,Controller: 클라이언트가 범위 기반 랭킹 요청 발송
    Client->>Controller: GET /api/v1/places/ranks/{placeId}?startRank=X&endRank=Y
    Controller->>Service: getPlaceRanks(userDetails, placeId, X, Y)
    Service->>Service: validateRankRange(X, Y)
    alt 유효한 범위
        Service->>Repo: findRankByRange(placeId, X, Y)
        Repo-->>Service: List<PlaceRankWithRankingProjection>
        Service->>Service: TreeMap으로 랭킹별 그룹화
        loop 각 랭킹 그룹 처리
            Service->>Response: GetPlaceRankResponse.from(group, user)
            Response-->>Service: GetPlaceRankResponse
        end
        Service-->>Controller: List<GetPlaceRankResponse>
        Controller-->>Client: BaseResponse.ok(...)
    else 범위 오류
        Service-->>Controller: throw INVALID_RANK_RANGE
        Controller-->>Client: Error 400
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • 추가된 쿼리의 SQL 및 projection 매핑(PlaceRankWithRankingProjection) 검증 필요
  • GetPlaceRankResponse.from의 정렬/동일닉네임 처리와 isSelf 판별 로직 확인 권장
  • RankControllerTest의 인증/필터 모킹 설정이 실제 시큐리티 흐름과 일치하는지 점검

Possibly related PRs

Suggested reviewers

  • kmw10693

Poem

🐇
당근 들고 달려왔네, 순위 밭을 훑으며,
구간을 모아 친구들 모아 노래하네.
묶인 순위 손잡고 폴짝—새로운 길, 홉—홉! 🥕✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (4 passed)
Check name Status Explanation
Title Check ✅ Passed 제목 "[Feat] 랭킹 페이징 API"는 PR의 주요 변경 사항을 명확하게 요약하고 있습니다. 제목이 간결하고 구체적이며, 개발자들이 히스토리를 스캔할 때 이 PR의 핵심 목표인 랭킹 페이지네이션 API 기능 추가를 즉시 파악할 수 있습니다. raw_summary에 반영된 모든 주요 변경사항(RankService, RankController, PlaceRankRepository, GetPlaceRankResponse 등)이 이 제목의 범주 내에 포함됩니다.
Linked Issues Check ✅ Passed Issue #317의 요구사항인 "랭킹 페이지네이션 API 추가"에 대해 모든 코드 변경이 직접적으로 준수하고 있습니다. RankService의 getPlaceRanks() 메서드는 지정된 범위의 랭킹 데이터를 조회하는 핵심 로직을 제공하고, RankController의 새 엔드포인트 GET /api/v1/places/ranks/{placeId}는 startRank와 endRank 쿼리 파라미터를 통해 페이지네이션을 구현하며, PlaceRankRepository의 findRankByRange() 쿼리는 데이터베이스 조회를 지원합니다. GetPlaceRankResponse는 응답 형식을 제공하고, 테스트와 예외 처리 로직도 완전히 구현되어 있습니다.
Out of Scope Changes Check ✅ Passed PR의 모든 변경사항이 Issue #317의 "랭킹 페이지네이션 API 추가"라는 목표 범위 내에 있습니다. RankService, GetPlaceRankResponse, PlaceRankRepository, RankController의 변경사항은 API 구현의 핵심 요소이고, RankControllerTest의 변경은 새 API 엔드포인트의 테스트 추가이며, BaseExceptionResponseStatus의 추가는 API 에러 처리와 직접 연관되어 있습니다. 범위를 벗어나거나 불필요한 변경사항은 발견되지 않습니다.
Description Check ✅ Passed PR 설명이 제공된 템플릿의 모든 필수 섹션을 충족하고 있습니다. "연관된 이슈" 섹션에서 closes #317을 명시했고, "작업 내용"에서 체크리스트 형식으로 랭킹 페이징 API 추가를 표시했으며, "작업 상세 내용"에서 API의 페이징 기준이 랭킹임을 설명했습니다. 리뷰 요구사항은 기재하지 않았으나 이는 선택사항으로 판단됩니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a249489 and 589ec76.

📒 Files selected for processing (4)
  • src/main/java/ku_rum/backend/domain/rank/application/RankService.java (3 hunks)
  • src/main/java/ku_rum/backend/domain/rank/application/response/GetPlaceRankResponse.java (1 hunks)
  • src/main/java/ku_rum/backend/domain/rank/presentation/RankController.java (3 hunks)
  • src/main/java/ku_rum/backend/global/support/status/BaseExceptionResponseStatus.java (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/main/java/ku_rum/backend/domain/rank/presentation/RankController.java
🔇 Additional comments (6)
src/main/java/ku_rum/backend/global/support/status/BaseExceptionResponseStatus.java (1)

127-129: LGTM!

새로운 예외 상태 정의가 적절하며, 형식도 올바릅니다.

src/main/java/ku_rum/backend/domain/rank/application/RankService.java (2)

37-38: LGTM!

매직 넘버 처리를 위한 상수 정의가 적절합니다.


149-153: LGTM!

랭킹 범위 검증 로직이 올바르게 구현되었습니다.

src/main/java/ku_rum/backend/domain/rank/application/response/GetPlaceRankResponse.java (3)

24-28: LGTM!

빈 리스트에 대한 방어적 검증이 적절합니다.


30-35: LGTM!

닉네임 추출 및 정렬 로직이 명확하고 올바릅니다.


37-40: LGTM!

사용자 닉네임 포함 여부 확인 로직이 올바릅니다.


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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (2)
src/main/java/ku_rum/backend/domain/rank/application/RankService.java (1)

126-128: 사용되지 않는 파라미터를 제거하세요.

customUserDetails 파라미터가 전달되지만 실제로는 userService.getUser()를 통해 사용자를 조회하고 있습니다. 불필요한 파라미터를 제거하거나, 다른 메서드들과의 일관성을 위해 해당 파라미터를 활용하도록 수정하세요.

-public List<GetPlaceRankResponse> getPlaceRanks(CustomUserDetails customUserDetails, Long placeId, int startRank,
-                                                int endRank) {
+public List<GetPlaceRankResponse> getPlaceRanks(Long placeId, int startRank, int endRank) {
     User user = userService.getUser();

또는 일관성을 위해 다른 메서드처럼 파라미터를 활용:

 public List<GetPlaceRankResponse> getPlaceRanks(CustomUserDetails customUserDetails, Long placeId, int startRank,
                                                 int endRank) {
-    User user = userService.getUser();
+    User user = userService.findById(customUserDetails.getUserPK());
src/test/java/ku_rum/backend/domain/rank/presentation/RankControllerTest.java (1)

111-162: 엣지 케이스 테스트 추가를 고려하세요.

기본 시나리오에 대한 테스트는 잘 작성되었습니다. 다음과 같은 추가 테스트 케이스를 고려해보세요:

  • startRank > endRank인 경우
  • startRank 또는 endRank가 음수인 경우
  • 범위에 해당하는 랭킹 데이터가 없는 경우
  • 매우 큰 범위를 요청하는 경우

예시:

@Test
@WithMockUser(username = "testUser", roles = {"USER"})
void getPlaceRank_InvalidRange_ThrowsException() throws Exception {
    Long placeId = 75L;
    
    mockMvc.perform(get("/api/v1/places/ranks/{placeId}", placeId)
                    .param("startRank", "10")
                    .param("endRank", "1")
                    .header("Authorization", "Bearer ..."))
            .andExpect(status().isBadRequest());
}
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7822434 and ef4e43f.

📒 Files selected for processing (5)
  • src/main/java/ku_rum/backend/domain/rank/application/RankService.java (2 hunks)
  • src/main/java/ku_rum/backend/domain/rank/application/response/GetPlaceRankResponse.java (1 hunks)
  • src/main/java/ku_rum/backend/domain/rank/domain/repository/PlaceRankRepository.java (1 hunks)
  • src/main/java/ku_rum/backend/domain/rank/presentation/RankController.java (3 hunks)
  • src/test/java/ku_rum/backend/domain/rank/presentation/RankControllerTest.java (2 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
src/main/java/ku_rum/backend/domain/rank/application/response/GetPlaceRankResponse.java (1)
src/main/java/ku_rum/backend/domain/rank/application/response/PlaceUserRankResponse.java (1)
  • PlaceUserRankResponse (10-35)
🔇 Additional comments (1)
src/test/java/ku_rum/backend/domain/rank/presentation/RankControllerTest.java (1)

31-31: 테스트 범위 변경이 적절합니다.

@SpringBootTest에서 @WebMvcTest(RankController.class)로 변경하여 테스트 범위를 좁힌 것은 좋은 개선입니다. 컨트롤러 레이어만 테스트하므로 실행 속도가 빠르고 의존성이 명확해집니다.

Comment on lines 10 to 34
public record GetPlaceRankResponse(int ranking, List<String> nickname, int sharingCount, boolean isSelf) {

public static GetPlaceRankResponse from(List<PlaceRankWithRankingProjection> placeRanks, User user) {
if (placeRanks.isEmpty()) {
throw new GlobalException(BaseExceptionResponseStatus.RANK_NOT_FOUND);
}

List<String> names = placeRanks.stream()
.sorted(Comparator.comparing(PlaceRankWithRankingProjection::getModifiedAt))
.map(placeRankWithRankingProjection -> placeRankWithRankingProjection.getNickname())
.toList();

int count = placeRanks.stream()
.findFirst()
.get()
.getCount();

boolean isSelf = placeRanks.stream()
.findFirst()
.map(placeRankWithRankingProjection -> placeRankWithRankingProjection.getNickname()
.equals(user.getNickname()))
.orElse(false);

return new GetPlaceRankResponse(placeRanks.get(0).getRanking(), names, count, isSelf);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

🧩 Analysis chain

코드 중복을 제거하세요.

GetPlaceRankResponsePlaceUserRankResponse (src/main/java/ku_rum/backend/domain/rank/application/response/PlaceUserRankResponse.java)가 거의 동일한 구조와 로직을 가지고 있습니다. 이는 DRY(Don't Repeat Yourself) 원칙을 위반합니다.

다음 중 하나의 방법을 고려하세요:

방법 1: 공통 로직을 유틸리티 클래스로 추출

public class RankResponseMapper {
    public static <T extends RankResponse> T from(
            List<PlaceRankWithRankingProjection> placeRanks, 
            User user,
            BiFunction<Integer, List<String>, Integer, Boolean, T> constructor) {
        // 공통 로직
    }
}

방법 2: 두 클래스가 실제로 동일한 목적이라면 하나로 통합

사용처를 확인하여 GetPlaceRankResponsePlaceUserRankResponse의 차이가 명명뿐이라면, 하나의 클래스로 통합하고 의미있는 이름을 사용하세요.

두 응답 클래스의 사용처를 확인하여 통합 가능한지 검증하세요:


🏁 Script executed:

#!/bin/bash
# Description: Check usage of both response classes

echo "=== GetPlaceRankResponse 사용처 ==="
rg -n "GetPlaceRankResponse" --type=java -C3

echo -e "\n=== PlaceUserRankResponse 사용처 ==="
rg -n "PlaceUserRankResponse" --type=java -C3

Length of output: 30003


GetPlaceRankResponsePlaceUserRankResponse 통합 필요

두 클래스가 완전히 동일한 구조와 로직을 가지고 있습니다. PlaceUserRankResponse (src/main/java/ku_rum/backend/domain/rank/application/response/PlaceUserRankResponse.java)와 비교하면 record 정의, 필드, factory 메서드 구현이 모두 같습니다.

이 중복을 제거하세요:

  • 단일 클래스로 통합하거나
  • 공통 로직을 추출하여 재사용

현재 두 클래스가 서로 다른 service 메서드에서 사용되고 있으나, 응답 구조가 동일하므로 하나의 클래스를 여러 곳에서 재사용하는 것이 적절합니다.

Comment on lines +72 to +95
@Query(value = """
SELECT
ranked.rank_id AS rankId,
ranked.count AS count,
u.nickname AS nickname,
ranked.place_place_id AS placePlaceId,
ranked.created_at AS createdAt,
ranked.modified_at AS modifiedAt,
ranked.ranking AS ranking
FROM (
SELECT
pr.*,
DENSE_RANK() OVER (ORDER BY pr.count DESC) AS ranking
FROM place_rank pr
WHERE place_place_id =:placeId
) ranked
JOIN users u
ON u.id = ranked.user_id
WHERE ranking >= :startRank AND ranking <= :endRank
ORDER BY ranking
""", nativeQuery = true)
List<PlaceRankWithRankingProjection> findRankByRange(@Param("placeId") Long placeId,
@Param("startRank") int startRank,
@Param("endRank") int endRank);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

입력값 검증이 필요합니다.

새로운 쿼리 메서드가 올바르게 구현되었지만, startRankendRank 파라미터에 대한 검증이 필요합니다. 컨트롤러 또는 서비스 레이어에서 다음 사항을 확인해야 합니다:

  • startRankendRank가 양수인지
  • startRank <= endRank인지
  • 적절한 범위 제한 (예: 최대 100개 조회 제한 등)

다음 스크립트로 컨트롤러와 서비스에서 검증 로직이 있는지 확인하세요:


🏁 Script executed:

#!/bin/bash
# Description: Check if there's input validation for startRank and endRank

# Search for validation logic in controller and service
rg -n -A5 -B5 'startRank.*endRank|endRank.*startRank' --type=java

Length of output: 4090




🏁 Script executed:

#!/bin/bash
# Description: Find RankService implementation and check for validation logic in getPlaceRanks method

# Find the RankService interface/class
fd -e java RankService --type f

# Then search for the getPlaceRanks method implementation and surrounding validation
rg -n -A10 -B2 'getPlaceRanks' --type=java -i

Length of output: 7325




🏁 Script executed:

#!/bin/bash
# Description: Read the complete RankService.getPlaceRanks method with range parameters

cat git/src/main/java/ku_rum/backend/domain/rank/application/RankService.java | sed -n '126,155p'

Length of output: 910


입력값 검증 로직이 누락되었습니다. (중요)

RankService.getPlaceRanks() 메서드(126-145줄)에서 startRankendRank 파라미터가 검증 없이 직접 저장소에 전달되고 있습니다. 다음 사항을 반드시 확인하세요:

  • startRankendRank가 양수인지 검증
  • startRank <= endRank 조건 검증
  • 조회 범위 제한 (예: 최대 100개 등) 설정
  • 유효하지 않은 입력에 대한 예외 처리

컨트롤러(RankController.java 38-44줄)에서 유효성 검사를 추가하거나, 서비스 메서드 시작 부분에서 파라미터 검증 로직을 구현해야 합니다.

Comment on lines 37 to 44
@GetMapping("/ranks/{placeId}")
public BaseResponse<List<GetPlaceRankResponse>> getPlaceRank(
@AuthenticationPrincipal final CustomUserDetails userDetails,
@PathVariable("placeId") Long placeId,
@RequestParam("startRank") int startRank,
@RequestParam("endRank") int endRank) {
return BaseResponse.ok(rankService.getPlaceRanks(userDetails, placeId, startRank, endRank));
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

요청 파라미터 검증을 추가하세요.

컨트롤러에서 startRankendRank 파라미터에 대한 검증이 누락되었습니다. 잘못된 입력값으로 인한 문제를 방지하기 위해 검증 로직을 추가해야 합니다.

다음과 같이 수정하는 것을 권장합니다:

+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.Max;
+
 @GetMapping("/ranks/{placeId}")
 public BaseResponse<List<GetPlaceRankResponse>> getPlaceRank(
         @AuthenticationPrincipal final CustomUserDetails userDetails,
         @PathVariable("placeId") Long placeId,
-        @RequestParam("startRank") int startRank,
-        @RequestParam("endRank") int endRank) {
+        @RequestParam("startRank") @Min(1) int startRank,
+        @RequestParam("endRank") @Min(1) @Max(100) int endRank) {
+    if (startRank > endRank) {
+        throw new GlobalException(BaseExceptionResponseStatus.INVALID_RANK_RANGE);
+    }
     return BaseResponse.ok(rankService.getPlaceRanks(userDetails, placeId, startRank, endRank));
 }

또한 @Validated 어노테이션을 클래스에 추가해야 검증이 동작합니다.

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In src/main/java/ku_rum/backend/domain/rank/presentation/RankController.java
around lines 37 to 44, the request parameters startRank and endRank lack
validation; add parameter-level constraints (e.g., @Min(1) and/or @Positive for
both, and if there is a max allowed rank use @Max) and annotate the controller
class with @Validated so Spring enforces them, then add a simple guard in the
method to ensure startRank <= endRank and throw a meaningful 400-level exception
(or return a BaseResponse error) when the range is invalid; this combination
ensures invalid inputs are rejected by framework validation and you still
enforce logical ordering.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ef4e43f and ba3f823.

📒 Files selected for processing (2)
  • src/main/java/ku_rum/backend/domain/rank/application/RankService.java (2 hunks)
  • src/main/java/ku_rum/backend/global/support/status/BaseExceptionResponseStatus.java (1 hunks)
🔇 Additional comments (3)
src/main/java/ku_rum/backend/global/support/status/BaseExceptionResponseStatus.java (1)

127-129: LGTM!

새로운 에러 상태 코드 추가가 적절합니다. 코드 번호가 순차적이며, BAD_REQUEST 상태와 메시지가 랭킹 유효성 검증 목적에 부합합니다.

src/main/java/ku_rum/backend/domain/rank/application/RankService.java (2)

13-13: LGTM!

새로운 응답 타입 임포트가 적절합니다.


146-150: 검증 로직은 올바르게 구현되었습니다.

검증 조건들이 적절합니다:

  • startRank와 endRank가 1 이상인지 확인
  • startRank가 endRank보다 크지 않은지 확인

다만, 위에서 언급한 것처럼 이 메서드가 getPlaceRanks 메서드에서 호출되지 않고 있어 현재는 실제로 동작하지 않습니다.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ba3f823 and a249489.

📒 Files selected for processing (2)
  • src/main/java/ku_rum/backend/domain/rank/application/RankService.java (2 hunks)
  • src/main/java/ku_rum/backend/global/support/status/BaseExceptionResponseStatus.java (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/main/java/ku_rum/backend/global/support/status/BaseExceptionResponseStatus.java
🔇 Additional comments (1)
src/main/java/ku_rum/backend/domain/rank/application/RankService.java (1)

147-151: 검증 로직이 올바르게 구현되었습니다.

입력값 검증 메서드가 잘 구현되어 있습니다. 1부터 시작하는 랭킹 범위를 올바르게 검증하고, 잘못된 입력에 대해 적절한 예외를 발생시킵니다.

Comment on lines 126 to 145
public List<GetPlaceRankResponse> getPlaceRanks(CustomUserDetails customUserDetails, Long placeId, int startRank,
int endRank) {
validateRankRange(startRank,endRank)
User user = userService.getUser();
List<PlaceRankWithRankingProjection> placeRankWithRankings = placeRankRepository.findRankByRange(placeId,
startRank,
endRank);

Map<Integer, List<PlaceRankWithRankingProjection>> placeRanksGroupedByCount = placeRankWithRankings.stream()
.collect(Collectors.groupingBy(
PlaceRankWithRankingProjection::getRanking,
TreeMap::new,
toList())
);

return placeRanksGroupedByCount.values()
.stream()
.map(placeRanks -> GetPlaceRankResponse.from(placeRanks, user))
.toList();
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

구문 오류: 세미콜론 누락

Line 128에서 validateRankRange(startRank,endRank) 호출 뒤에 세미콜론이 누락되어 컴파일 오류가 발생합니다.

추가 이슈:

  • customUserDetails 파라미터가 선언되었으나 사용되지 않고 있습니다. Line 129에서 userService.getUser()를 호출하여 사용자를 가져오므로, 이 파라미터는 불필요하거나 일관되게 사용되어야 합니다.
  • public 메서드에 대한 JavaDoc 주석이 누락되었습니다.

다음 diff를 적용하여 구문 오류를 수정하고 JavaDoc을 추가하세요:

+    /**
+     * 장소 랭킹 페이징 조회
+     *
+     * @param customUserDetails 사용자 인증 정보
+     * @param placeId 장소 ID
+     * @param startRank 시작 랭킹 (1부터 시작)
+     * @param endRank 종료 랭킹
+     * @return 랭킹 범위에 해당하는 장소 랭킹 목록
+     */
     public List<GetPlaceRankResponse> getPlaceRanks(CustomUserDetails customUserDetails, Long placeId, int startRank,
                                                     int endRank) {
-        validateRankRange(startRank,endRank)
+        validateRankRange(startRank, endRank);
         User user = userService.getUser();

customUserDetails 파라미터의 경우, 사용하지 않는다면 제거하거나, userService.getUser() 대신 이 파라미터로부터 사용자 정보를 추출하여 일관성을 유지하세요.

🤖 Prompt for AI Agents
In src/main/java/ku_rum/backend/domain/rank/application/RankService.java around
lines 126 to 145, there is a missing semicolon after the call to
validateRankRange(startRank, endRank) which causes a compile error; add the
semicolon, then address the unused customUserDetails parameter by either
removing it from the method signature (and updating all call sites) if it is
unnecessary, or replace the call to userService.getUser() with code that
extracts the User from customUserDetails so the parameter is used consistently;
finally add a brief JavaDoc for the public method describing its purpose,
parameters, and return value.

Copy link
Contributor

@kmw10693 kmw10693 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 짜느라 고생하셨습니다~

@david-parkk david-parkk merged commit 7878233 into KU-rum:develop Oct 27, 2025
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

랭킹 페이지네이션

2 participants