Skip to content

Commit 6508dad

Browse files
authored
Merge pull request #48 from hyujikoh/feat/batch
코드리뷰 기반 수정
2 parents 78ead14 + 9c26225 commit 6508dad

29 files changed

Lines changed: 270 additions & 268 deletions

File tree

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

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -37,37 +37,12 @@ public Page<MonthlyRankEntity> getMonthlyRanking(String yearMonth, Pageable page
3737
yearMonth, pageable.getPageNumber(), pageable.getPageSize());
3838

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

42-
if (allRankings.isEmpty()) {
43-
log.debug("월간 랭킹 데이터 없음: yearMonth={}", yearMonth);
44-
return Page.empty(pageable);
45-
}
46-
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<MonthlyRankEntity> pagedRankings = allRankings.subList(start, end);
5642

5743
log.debug("월간 랭킹 조회 완료: yearMonth={}, 전체={}, 페이지={}",
58-
yearMonth, allRankings.size(), pagedRankings.size());
59-
60-
return new PageImpl<>(pagedRankings, pageable, allRankings.size());
61-
}
44+
yearMonth, pagedRankings.getTotalPages(), pagedRankings.getNumber());
6245

63-
/**
64-
* 특정 월의 전체 랭킹 개수를 조회합니다.
65-
*
66-
* @param yearMonth 조회할 월
67-
* @return 랭킹 개수
68-
*/
69-
public long getMonthlyRankingCount(String yearMonth) {
70-
List<MonthlyRankEntity> rankings = monthlyRankRepository.findByYearMonth(yearMonth);
71-
return rankings.size();
46+
return pagedRankings;
7247
}
7348
}

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/MonthlyRankJpaRepository.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 MonthlyRankJpaRepository extends JpaRepository<MonthlyRankEntit
2627
* 특정 월의 랭킹을 순위 순으로 페이지네이션하여 조회합니다.
2728
*/
2829
@Query("SELECT m FROM MonthlyRankEntity m WHERE m.id.yearMonth = :yearMonth ORDER BY m.rankPosition ASC")
29-
List<MonthlyRankEntity> findByIdYearMonthOrderByRankPosition(@Param("yearMonth") String yearMonth, Pageable pageable);
30+
Page<MonthlyRankEntity> findByIdYearMonthOrderByRankPosition(@Param("yearMonth") String yearMonth, Pageable pageable);
3031

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

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

Lines changed: 2 additions & 7 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;
@@ -31,13 +32,7 @@ public List<MonthlyRankEntity> saveAll(List<MonthlyRankEntity> entities) {
3132
}
3233

3334
@Override
34-
public List<MonthlyRankEntity> findByYearMonth(String yearMonth) {
35-
return jpaRepository.findByIdYearMonthOrderByRankPosition(yearMonth);
36-
}
37-
38-
@Override
39-
public List<MonthlyRankEntity> findByYearMonthWithPagination(String yearMonth, int page, int size) {
40-
Pageable pageable = PageRequest.of(page, size);
35+
public Page<MonthlyRankEntity> findByYearMonth(String yearMonth, Pageable pageable) {
4136
return jpaRepository.findByIdYearMonthOrderByRankPosition(yearMonth, pageable);
4237
}
4338

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/main/java/com/loopers/interfaces/api/ranking/RankingV1Controller.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,9 @@ private String processYearWeekParameter(String yearWeek, LocalDate date) {
7777
// date가 있으면 해당 날짜의 주차, 없으면 현재 주차
7878
LocalDate targetDate = date != null ? date : LocalDate.now();
7979

80-
WeekFields weekFields = WeekFields.of(Locale.getDefault());
80+
WeekFields weekFields = WeekFields.ISO;
8181
int year = targetDate.getYear();
82-
int week = targetDate.get(weekFields.weekOfYear());
82+
int week = targetDate.get(weekFields.weekOfWeekBasedYear());
8383

8484
return String.format("%d-W%02d", year, week);
8585
}

apps/commerce-api/src/test/java/com/loopers/fixtures/UserTestFixture.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.loopers.fixtures;
22

3+
import java.math.BigDecimal;
34
import java.time.LocalDate;
45

56
import org.assertj.core.api.Assertions;
@@ -165,20 +166,20 @@ public static class InvalidGender {
165166
* 사용자의 포인트가 0인지 검증하는 헬퍼 메서드
166167
*/
167168
public static void assertUserPointIsZero(UserEntity user) {
168-
Assertions.assertThat(user.getPointAmount()).isEqualByComparingTo(java.math.BigDecimal.ZERO.setScale(2));
169+
Assertions.assertThat(user.getPointAmount()).isEqualByComparingTo(BigDecimal.ZERO.setScale(2));
169170
}
170171

171172
/**
172173
* 사용자의 포인트 금액 검증 헬퍼 메서드
173174
*/
174-
public static void assertUserPointAmount(UserEntity user, java.math.BigDecimal expectedAmount) {
175+
public static void assertUserPointAmount(UserEntity user, BigDecimal expectedAmount) {
175176
Assertions.assertThat(user.getPointAmount()).isEqualByComparingTo(expectedAmount);
176177
}
177178

178179
/**
179180
* 포인트 충전 실패 검증 헬퍼 메서드
180181
*/
181-
public static void assertChargePointFails(UserEntity user, java.math.BigDecimal amount, String expectedMessage) {
182+
public static void assertChargePointFails(UserEntity user, BigDecimal amount, String expectedMessage) {
182183
Assertions.assertThatThrownBy(() -> user.chargePoint(amount))
183184
.isInstanceOf(IllegalArgumentException.class)
184185
.hasMessage(expectedMessage);

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/batch/job/ranking/dto/RankingAggregation.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.loopers.batch.job.ranking.dto;
22

3+
import java.math.BigDecimal;
4+
35
import com.loopers.batch.job.ranking.support.ScoreCalculator;
46

57
import lombok.Getter;
@@ -17,16 +19,18 @@ public class RankingAggregation {
1719
private final long likeCount;
1820
private final long salesCount;
1921
private final long orderCount;
22+
private final BigDecimal totalSalesAmount;
2023
private final long totalScore;
2124
private int rankPosition; // 가변 필드 (순위 부여용)
2225

2326
private RankingAggregation(Long productId, long viewCount, long likeCount,
24-
long salesCount, long orderCount, long totalScore) {
27+
long salesCount, long orderCount, BigDecimal totalSalesAmount, long totalScore) {
2528
this.productId = productId;
2629
this.viewCount = viewCount;
2730
this.likeCount = likeCount;
2831
this.salesCount = salesCount;
2932
this.orderCount = orderCount;
33+
this.totalSalesAmount = totalSalesAmount;
3034
this.totalScore = totalScore;
3135
this.rankPosition = 0; // 초기값
3236
}
@@ -40,7 +44,7 @@ private RankingAggregation(Long productId, long viewCount, long likeCount,
4044
* @throws IllegalArgumentException row가 null이거나 형식이 잘못된 경우
4145
*/
4246
public static RankingAggregation from(Object[] row, ScoreCalculator calculator) {
43-
if (row == null || row.length < 5) {
47+
if (row == null || row.length < 4) {
4448
throw new IllegalArgumentException("집계 결과 배열이 null이거나 길이가 부족합니다.");
4549
}
4650

@@ -50,10 +54,11 @@ public static RankingAggregation from(Object[] row, ScoreCalculator calculator)
5054
long likeCount = ((Number) row[2]).longValue();
5155
long salesCount = ((Number) row[3]).longValue();
5256
long orderCount = ((Number) row[4]).longValue();
57+
BigDecimal totalSalesAmount = (BigDecimal) row[5];
5358

54-
long totalScore = calculator.calculate(viewCount, likeCount, salesCount, orderCount);
59+
long totalScore = calculator.calculate(viewCount, likeCount, totalSalesAmount);
5560

56-
return new RankingAggregation(productId, viewCount, likeCount, salesCount, orderCount, totalScore);
61+
return new RankingAggregation(productId, viewCount, likeCount, salesCount, orderCount, totalSalesAmount, totalScore);
5762
} catch (ClassCastException | NullPointerException e) {
5863
throw new IllegalArgumentException("집계 결과 데이터 형식이 올바르지 않습니다.", e);
5964
}

0 commit comments

Comments
 (0)