Skip to content

Commit 84b46b4

Browse files
authored
Merge branch 'yeonjiyeon' into feature/week10
2 parents 5bd085e + 360a1ac commit 84b46b4

4 files changed

Lines changed: 96 additions & 0 deletions

File tree

apps/commerce-api/build.gradle.kts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,19 @@ dependencies {
1313
implementation("org.springframework.boot:spring-boot-starter-actuator")
1414
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:${project.properties["springDocOpenApiVersion"]}")
1515

16+
// Resilience4j (Spring Boot 3.x 기준)
17+
implementation("io.github.resilience4j:resilience4j-spring-boot3")
18+
19+
// AOP
20+
implementation("org.springframework.boot:spring-boot-starter-aop")
21+
22+
//Micrometer Prometheus
23+
implementation("io.micrometer:micrometer-registry-prometheus")
24+
25+
//Spring Cloud OpenFeign
26+
implementation("org.springframework.cloud:spring-cloud-starter-openfeign")
27+
28+
1629
// querydsl
1730
annotationProcessor("com.querydsl:querydsl-apt::jakarta")
1831
annotationProcessor("jakarta.persistence:jakarta.persistence-api")
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.loopers.application.rank;
2+
3+
import com.loopers.infrastructure.rank.RankingService;
4+
import java.time.LocalDateTime;
5+
import java.time.format.DateTimeFormatter;
6+
import lombok.RequiredArgsConstructor;
7+
import lombok.extern.slf4j.Slf4j;
8+
import org.springframework.scheduling.annotation.Scheduled;
9+
import org.springframework.stereotype.Component;
10+
11+
@Slf4j
12+
@Component
13+
@RequiredArgsConstructor
14+
public class RankingScheduler {
15+
16+
private final RankingService rankingService;
17+
18+
@Scheduled(cron = "0 50 23 * * *")
19+
public void scheduleRankingCarryOver() {
20+
LocalDateTime now = LocalDateTime.now();
21+
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
22+
23+
String today = now.format(formatter);
24+
String tomorrow = now.plusDays(1).format(formatter);
25+
26+
log.info("Starting Ranking Carry-Over: {} -> {}", today, tomorrow);
27+
28+
try {
29+
rankingService.carryOverRanking(today, tomorrow, 0.1);
30+
log.info("Ranking Carry-Over completed successfully.");
31+
} catch (Exception e) {
32+
log.error("Ranking Carry-Over failed", e);
33+
}
34+
}
35+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.loopers.domain.metrics;
2+
3+
import jakarta.persistence.Entity;
4+
import jakarta.persistence.Id;
5+
import jakarta.persistence.Table;
6+
import java.time.LocalDateTime;
7+
import lombok.AccessLevel;
8+
import lombok.Getter;
9+
import lombok.NoArgsConstructor;
10+
11+
@Entity
12+
@Getter
13+
@Table(name = "product_metrics")
14+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
15+
public class ProductMetrics {
16+
17+
@Id
18+
private Long productId;
19+
20+
private int likeCount = 0;
21+
private int viewCount = 0;
22+
private int salesCount = 0;
23+
24+
private LocalDateTime updatedAt;
25+
26+
public ProductMetrics(Long productId) {
27+
this.productId = productId;
28+
}
29+
30+
public void updateLikeCount(int newCount, LocalDateTime eventTime) {
31+
if (this.updatedAt != null && eventTime.isBefore(this.updatedAt)) {
32+
return;
33+
}
34+
this.likeCount = newCount;
35+
this.updatedAt = eventTime;
36+
}
37+
38+
public void incrementViewCount() {
39+
this.viewCount += 1;
40+
this.updatedAt = LocalDateTime.now();
41+
}
42+
43+
public void addSalesCount(int quantity) {
44+
this.salesCount += quantity;
45+
this.updatedAt = LocalDateTime.now();
46+
}
47+
}

settings.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ include(
88
":modules:jpa",
99
":modules:redis",
1010
":modules:kafka",
11+
1112
":supports:jackson",
1213
":supports:logging",
1314
":supports:monitoring",

0 commit comments

Comments
 (0)