Skip to content

![high](https://www.gstatic.com/codereviewagent/high-priority.svg) #133

@huhdy32

Description

@huhdy32

high

mapToRankQueryResult 메소드 내에서 solverRepository.findRankByMemberId를 호출하여 각 Solver의 순위를 개별적으로 조회하고 있습니다. 이는 두 가지 문제점이 있습니다.

  1. N+1 쿼리 문제: 페이지 크기(N)만큼 데이터베이스 쿼리를 추가로 실행하여 비효율적입니다.
  2. 부정확한 순위 계산: findRankByMemberId 쿼리는 자신보다 점수가 높은 사용자의 수를 반환하므로, 실제 순위는 이 값에 1을 더해야 합니다. 현재 코드에서는 +1이 누락되어 순위가 잘못 계산됩니다.

제안:
Solver 목록은 이미 점수(score) 기준으로 정렬되어 있으므로, 데이터베이스에 추가 쿼리를 보내지 않고 메모리에서 순위를 계산하는 것이 가장 좋습니다.

queryResultPageResult 메소드에서 페이지 번호와 페이지 내 인덱스를 기반으로 순위를 계산하도록 로직을 변경하는 것을 권장합니다. 항목의 순위는 (currentPageNumber) * pageSize + index_in_page + 1이 됩니다.

예시 리팩토링:

// queryResultPageResult 메소드 내
// ...
final int offset = currentPageNumber * pageSize;
List<RankItemResult> results = IntStream.range(0, solvers.size())
    .mapToObj(i -> {
        Solver solver = solvers.get(i);
        long rank = offset + i + 1;
        Tier tier = Tier.getMatchTier(rank, totalCount);
        // RankItemResult.from을 직접 호출하거나, rank를 받는 새로운 헬퍼 메소드 사용
        return RankItemResult.from(solver, rank, tier); 
    })
    .toList();
// ...

이렇게 하면 순위 조회를 위한 N개의 쿼리를 제거하고 정확한 순위를 계산할 수 있습니다.

Originally posted by @gemini-code-assist[bot] in #129 (comment)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions