Skip to content

Commit 5863915

Browse files
committed
feat(ranking): 주간 랭킹 조회 API 페이징 처리 추가
- 주간 랭킹 조회 시 페이징 기능을 추가하여 성능 개선 - 관련 메서드 및 리포지토리 수정
1 parent 7218ff9 commit 5863915

7 files changed

Lines changed: 24 additions & 36 deletions

File tree

apps/commerce-api/src/main/java/com/loopers/application/ranking/WeeklyRankingService.java

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -37,27 +37,14 @@ public Page<WeeklyRankEntity> getWeeklyRanking(String yearWeek, Pageable pageabl
3737
yearWeek, pageable.getPageNumber(), pageable.getPageSize());
3838

3939
// 1. 전체 랭킹 조회 (순위 순으로 정렬됨)
40-
List<WeeklyRankEntity> allRankings = weeklyRankRepository.findByYearWeek(yearWeek);
40+
Page<WeeklyRankEntity> pagedRankings = weeklyRankRepository.findByYearWeek(yearWeek , pageable);
4141

42-
if (allRankings.isEmpty()) {
42+
if (pagedRankings.isEmpty()) {
4343
log.debug("주간 랭킹 데이터 없음: yearWeek={}", yearWeek);
4444
return Page.empty(pageable);
4545
}
4646

47-
// 2. 페이징 처리
48-
int start = (int) pageable.getOffset();
49-
int end = Math.min(start + pageable.getPageSize(), allRankings.size());
50-
51-
if (start >= allRankings.size()) {
52-
return Page.empty(pageable);
53-
}
54-
55-
List<WeeklyRankEntity> pagedRankings = allRankings.subList(start, end);
56-
57-
log.debug("주간 랭킹 조회 완료: yearWeek={}, 전체={}, 페이지={}",
58-
yearWeek, allRankings.size(), pagedRankings.size());
59-
60-
return new PageImpl<>(pagedRankings, pageable, allRankings.size());
47+
return pagedRankings;
6148
}
6249

6350
/**

apps/commerce-api/src/main/java/com/loopers/infrastructure/ranking/WeeklyRankJpaRepository.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.List;
44

5+
import org.springframework.data.domain.Page;
56
import org.springframework.data.domain.Pageable;
67
import org.springframework.data.jpa.repository.JpaRepository;
78
import org.springframework.data.jpa.repository.Modifying;
@@ -26,7 +27,7 @@ public interface WeeklyRankJpaRepository extends JpaRepository<WeeklyRankEntity,
2627
* 특정 주차의 랭킹을 순위 순으로 페이지네이션하여 조회합니다.
2728
*/
2829
@Query("SELECT w FROM WeeklyRankEntity w WHERE w.id.yearWeek = :yearWeek ORDER BY w.rankPosition ASC")
29-
List<WeeklyRankEntity> findByIdYearWeekOrderByRankPosition(@Param("yearWeek") String yearWeek, Pageable pageable);
30+
Page<WeeklyRankEntity> findByIdYearWeekOrderByRankPosition(@Param("yearWeek") String yearWeek, Pageable pageable);
3031

3132
/**
3233
* 특정 주차의 모든 랭킹을 삭제합니다.

apps/commerce-api/src/main/java/com/loopers/infrastructure/ranking/WeeklyRankRepositoryImpl.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.List;
44

5+
import org.springframework.data.domain.Page;
56
import org.springframework.data.domain.PageRequest;
67
import org.springframework.data.domain.Pageable;
78
import org.springframework.stereotype.Repository;
@@ -34,15 +35,13 @@ public List<WeeklyRankEntity> saveAll(List<WeeklyRankEntity> entities) {
3435
public List<WeeklyRankEntity> findByYearWeek(String yearWeek) {
3536
return jpaRepository.findByIdYearWeekOrderByRankPosition(yearWeek);
3637
}
37-
3838
@Override
39-
public List<WeeklyRankEntity> findByYearWeekWithPagination(String yearWeek, int page, int size) {
40-
Pageable pageable = PageRequest.of(page, size);
41-
return jpaRepository.findByIdYearWeekOrderByRankPosition(yearWeek, pageable);
39+
public long deleteByYearWeek(String yearWeek) {
40+
return jpaRepository.deleteByIdYearWeek(yearWeek);
4241
}
4342

4443
@Override
45-
public long deleteByYearWeek(String yearWeek) {
46-
return jpaRepository.deleteByIdYearWeek(yearWeek);
44+
public Page<WeeklyRankEntity> findByYearWeek(String yearWeek, Pageable pageable) {
45+
return jpaRepository.findByIdYearWeekOrderByRankPosition(yearWeek, pageable);
4746
}
4847
}

apps/commerce-api/src/test/java/com/loopers/interfaces/api/ranking/RankingApiE2ETest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,8 @@ void should_return_products_in_ranking_order() {
150150
() -> assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK),
151151
() -> assertThat(Objects.requireNonNull(response.getBody()).data().content()).hasSize(3),
152152
() -> assertThat(Objects.requireNonNull(response.getBody()).data().content().get(0).productId()).isEqualTo(product1),
153-
() -> assertThat(Objects.requireNonNull(response.getBody()).data().content().get(2).productId()).isEqualTo(product2),
154-
() -> assertThat(Objects.requireNonNull(response.getBody()).data().content().get(1).productId()).isEqualTo(product3)
153+
() -> assertThat(Objects.requireNonNull(response.getBody()).data().content().get(1).productId()).isEqualTo(product3),
154+
() -> assertThat(Objects.requireNonNull(response.getBody()).data().content().get(2).productId()).isEqualTo(product2)
155155
);
156156
}
157157

apps/commerce-batch/src/main/java/com/loopers/infrastructure/ranking/WeeklyRankJpaRepository.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.List;
44

5+
import org.springframework.data.domain.Page;
56
import org.springframework.data.domain.Pageable;
67
import org.springframework.data.jpa.repository.JpaRepository;
78
import org.springframework.data.jpa.repository.Modifying;
@@ -26,7 +27,7 @@ public interface WeeklyRankJpaRepository extends JpaRepository<WeeklyRankEntity,
2627
* 특정 주차의 랭킹을 순위 순으로 페이지네이션하여 조회합니다.
2728
*/
2829
@Query("SELECT w FROM WeeklyRankEntity w WHERE w.id.yearWeek = :yearWeek ORDER BY w.rankPosition ASC")
29-
List<WeeklyRankEntity> findByIdYearWeekOrderByRankPosition(@Param("yearWeek") String yearWeek, Pageable pageable);
30+
Page<WeeklyRankEntity> findByIdYearWeekOrderByRankPosition(@Param("yearWeek") String yearWeek, Pageable pageable);
3031

3132
/**
3233
* 특정 주차의 모든 랭킹을 삭제합니다.

apps/commerce-batch/src/main/java/com/loopers/infrastructure/ranking/WeeklyRankRepositoryImpl.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.List;
44

5+
import org.springframework.data.domain.Page;
56
import org.springframework.data.domain.PageRequest;
67
import org.springframework.data.domain.Pageable;
78
import org.springframework.stereotype.Repository;
@@ -36,13 +37,12 @@ public List<WeeklyRankEntity> findByYearWeek(String yearWeek) {
3637
}
3738

3839
@Override
39-
public List<WeeklyRankEntity> findByYearWeekWithPagination(String yearWeek, int page, int size) {
40-
Pageable pageable = PageRequest.of(page, size);
41-
return jpaRepository.findByIdYearWeekOrderByRankPosition(yearWeek, pageable);
40+
public long deleteByYearWeek(String yearWeek) {
41+
return jpaRepository.deleteByIdYearWeek(yearWeek);
4242
}
4343

4444
@Override
45-
public long deleteByYearWeek(String yearWeek) {
46-
return jpaRepository.deleteByIdYearWeek(yearWeek);
45+
public Page<WeeklyRankEntity> findByYearWeek(String yearWeek, Pageable pageable) {
46+
return jpaRepository.findByIdYearWeekOrderByRankPosition(yearWeek, pageable);
4747
}
4848
}

modules/jpa/src/main/java/com/loopers/domain/ranking/WeeklyRankRepository.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import java.util.List;
44

5+
import org.springframework.data.domain.Page;
6+
import org.springframework.data.domain.Pageable;
7+
58
/**
69
* 주간 랭킹 Repository 인터페이스
710
*/
@@ -22,16 +25,13 @@ public interface WeeklyRankRepository {
2225
*/
2326
List<WeeklyRankEntity> findByYearWeek(String yearWeek);
2427

25-
/**
26-
* 특정 주차의 랭킹을 페이지네이션하여 조회합니다.
27-
*/
28-
List<WeeklyRankEntity> findByYearWeekWithPagination(String yearWeek, int page, int size);
29-
3028
/**
3129
* 특정 주차의 모든 랭킹을 삭제합니다. (멱등성 보장용)
3230
*
3331
* @param yearWeek 삭제할 주차 (예: "2024-W52")
3432
* @return 삭제된 레코드 수
3533
*/
3634
long deleteByYearWeek(String yearWeek);
35+
36+
Page<WeeklyRankEntity> findByYearWeek(String yearWeek, Pageable pageable);
3737
}

0 commit comments

Comments
 (0)