diff --git a/buildSrc/src/main/groovy/myproject-convention.gradle b/buildSrc/src/main/groovy/myproject-convention.gradle index f24ce61..f8a3e88 100644 --- a/buildSrc/src/main/groovy/myproject-convention.gradle +++ b/buildSrc/src/main/groovy/myproject-convention.gradle @@ -23,9 +23,13 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-validation' implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation 'org.springframework.boot:spring-boot-starter-data-redis' + implementation("com.github.ben-manes.caffeine:caffeine:3.2.3") runtimeOnly("com.mysql:mysql-connector-j") + compileOnly 'org.projectlombok:lombok' + testImplementation 'org.projectlombok:lombok' + testAnnotationProcessor 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testAndDevelopmentOnly 'org.springframework.boot:spring-boot-docker-compose' diff --git a/platform/src/main/java/com/commerce/platform/core/domain/service/PaymentPgRouter.java b/platform/src/main/java/com/commerce/platform/core/domain/service/PaymentPgRouter.java index f73e87a..790003c 100644 --- a/platform/src/main/java/com/commerce/platform/core/domain/service/PaymentPgRouter.java +++ b/platform/src/main/java/com/commerce/platform/core/domain/service/PaymentPgRouter.java @@ -7,12 +7,15 @@ import com.commerce.platform.infrastructure.adaptor.PgCacheService; import com.commerce.platform.infrastructure.persistence.PgFeeInfo; import com.commerce.platform.infrastructure.persistence.PgFeeInfoRepository; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.event.ApplicationStartedEvent; import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; +import java.time.Duration; import java.util.Comparator; import java.util.List; import java.util.Map; @@ -32,7 +35,7 @@ public class PaymentPgRouter { private final PgCacheService pgCacheService; private final PgFeeInfoRepository feeInfoRepository; //결제방식 + 카드사/통신사 별 수수료기준 정렬됨 - private Map>> pgFeeCache = null; + private Cache>> pgFeeCache; public PaymentPgRouter(List list, PgCacheService pgCacheService, PgFeeInfoRepository feeInfoRepository) { this.pgStrategies = list.stream() @@ -43,7 +46,11 @@ public PaymentPgRouter(List list, PgCacheService pgCacheService, PgF @EventListener(ApplicationStartedEvent.class) public void initPgCache() { - setPgFeeCache(); + this.pgFeeCache = Caffeine.>>newBuilder() + .expireAfterWrite(Duration.ofDays(1L)) + .build(); + + loadAllPgFee(); } /** @@ -51,7 +58,7 @@ public void initPgCache() { * redis 캐싱된 health check */ public PgStrategy routePg(PayMethod payMethod, PayProvider payProvider) { - PgProvider selectedPg = pgFeeCache.get(payMethod).get(payProvider) + PgProvider selectedPg = pgFeeCache.getIfPresent(payMethod).get(payProvider) .stream() .filter(pgFeeInfo -> pgCacheService.isHealthy(pgFeeInfo.getPgProvider())) .toList() @@ -78,11 +85,11 @@ public PgStrategy getPgStrategyByProvider(PgProvider pgProvider) { @Scheduled(cron = "0 * * * * *") private void refreshPgCache() { - setPgFeeCache(); + loadAllPgFee(); } - private void setPgFeeCache() { - pgFeeCache = feeInfoRepository.findAllActiveAndValid() + public void loadAllPgFee() { + Map>> data = feeInfoRepository.findAllActiveAndValid() .stream() .collect(Collectors.groupingBy(PgFeeInfo::getPayMethod, Collectors.groupingBy(PgFeeInfo::getPayProvider, @@ -90,5 +97,7 @@ private void setPgFeeCache() { new TreeSet<>(Comparator.comparing(PgFeeInfo::getFeeRate)) ) ))); + + pgFeeCache.putAll(data); } }