-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
mapToRankQueryResult 메소드 내에서 solverRepository.findRankByMemberId를 호출하여 각 Solver의 순위를 개별적으로 조회하고 있습니다. 이는 두 가지 문제점이 있습니다.
- N+1 쿼리 문제: 페이지 크기(N)만큼 데이터베이스 쿼리를 추가로 실행하여 비효율적입니다.
- 부정확한 순위 계산:
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)
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels