Skip to content

Commit ee16413

Browse files
committed
refactor: 동적 랭킹 키 생성을 위한 RankingKeyGenerator 분리 및 commerce-streamer의 스케줄러 사용을 위한 RankingService 개선
- 동적이고 재사용 가능한 랭킹 키 생성을 위해 RankingKeyGenerator 인터페이스와 RedisRankingKeyGenerator 구현체 도입 - 유지보수성 향상을 위해 RankingService에서 RankingKeyGenerator를 사용하도록 리팩토링 - commerce-api에 있던 중복 carryOverRanking 로직 제거 후 commerce-streamer 모듈로 통합 - 리팩토링된 RankingService를 사용하도록 RankingScheduler 수정
1 parent db4ed51 commit ee16413

5 files changed

Lines changed: 39 additions & 14 deletions

File tree

apps/commerce-api/src/main/java/com/loopers/infrastructure/rank/RankingService.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,4 @@ public Integer getProductRank(Long productId) {
4141

4242
return (rank != null) ? rank.intValue() + 1 : null;
4343
}
44-
45-
public void carryOverRanking(String sourceDate, String targetDate, double weight) {
46-
String sourceKey = "ranking:all:" + sourceDate;
47-
String targetKey = "ranking:all:" + targetDate;
48-
49-
redisTemplate.opsForZSet().unionAndStore(sourceKey, List.of(), targetKey,
50-
Aggregate.SUM, Weights.of(weight));
51-
52-
redisTemplate.expire(targetKey, 2, TimeUnit.DAYS);
53-
}
5444
}

apps/commerce-api/src/main/java/com/loopers/application/rank/RankingScheduler.java renamed to apps/commerce-streamer/src/main/java/com/loopers/application/rank/RankingScheduler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.loopers.application.rank;
22

3-
import com.loopers.infrastructure.rank.RankingService;
3+
import com.loopers.domain.rank.RankingService;
44
import java.time.LocalDateTime;
55
import java.time.format.DateTimeFormatter;
66
import lombok.RequiredArgsConstructor;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.loopers.domain.rank;
2+
3+
import org.springframework.stereotype.Component;
4+
5+
public interface RankingKeyGenerator {
6+
7+
String generateDailyKey(String date);
8+
}
9+

apps/commerce-streamer/src/main/java/com/loopers/domain/rank/RankingService.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22

33
import java.time.LocalDateTime;
44
import java.time.format.DateTimeFormatter;
5+
import java.util.List;
56
import java.util.Map;
67
import java.util.concurrent.TimeUnit;
78
import lombok.RequiredArgsConstructor;
9+
import org.springframework.data.redis.connection.zset.Aggregate;
10+
import org.springframework.data.redis.connection.zset.Weights;
811
import org.springframework.data.redis.core.RedisTemplate;
912
import org.springframework.stereotype.Component;
1013

@@ -13,14 +16,13 @@
1316
public class RankingService {
1417

1518
private final RedisTemplate<String, String> redisTemplate;
16-
17-
private static final String KEY_PREFIX = "ranking:all:";
19+
private final RankingKeyGenerator rankingKeyGenerator;
1820
private static final double VIEW_WEIGHT = 0.1;
1921
private static final double LIKE_WEIGHT = 0.2;
2022
private static final double ORDER_WEIGHT = 0.6;
2123

2224
public void addScore(Long productId, double baseScore, double weight, LocalDateTime dateTime) {
23-
String dateKey = KEY_PREFIX + dateTime.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
25+
String dateKey = rankingKeyGenerator.generateDailyKey(dateTime.format(DateTimeFormatter.ofPattern("yyyyMMdd")));
2426
double finalScore = baseScore * weight;
2527

2628
redisTemplate.opsForZSet().incrementScore(dateKey, productId.toString(), finalScore);
@@ -35,4 +37,14 @@ public void addOrderScoresBatch(Map<String, Map<Long, Double>> updates) {
3537
redisTemplate.expire(dateKey, 2, TimeUnit.DAYS);
3638
});
3739
}
40+
41+
public void carryOverRanking(String sourceDate, String targetDate, double weight) {
42+
String sourceKey = rankingKeyGenerator.generateDailyKey(sourceDate);
43+
String targetKey = rankingKeyGenerator.generateDailyKey(targetDate);
44+
45+
redisTemplate.opsForZSet().unionAndStore(sourceKey, List.of(), targetKey,
46+
Aggregate.SUM, Weights.of(weight));
47+
48+
redisTemplate.expire(targetKey, 2, TimeUnit.DAYS);
49+
}
3850
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.loopers.domain.rank;
2+
3+
import org.springframework.stereotype.Component;
4+
5+
@Component
6+
public class RedisRankingKeyGenerator implements RankingKeyGenerator {
7+
8+
private static final String DAILY_RANKING_PREFIX = "ranking:all:";
9+
10+
@Override
11+
public String generateDailyKey(String date) {
12+
return DAILY_RANKING_PREFIX + date;
13+
}
14+
}

0 commit comments

Comments
 (0)