From 62c465ce772c1c40df66865bb670bbfc3ada10c6 Mon Sep 17 00:00:00 2001 From: pywoo Date: Wed, 20 Aug 2025 23:52:54 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20=EC=9B=94?= =?UTF-8?q?=EB=B3=84=20=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EC=9E=A5=EC=86=8C=20?= =?UTF-8?q?=EC=88=98=20=EC=BA=90=EC=8B=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../log/dateplacelog/scheduler/DatePlaceLogScheduler.java | 7 +++++++ .../service/query/DatePlaceLogQueryServiceImpl.java | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/src/main/java/org/withtime/be/withtimebe/domain/log/dateplacelog/scheduler/DatePlaceLogScheduler.java b/src/main/java/org/withtime/be/withtimebe/domain/log/dateplacelog/scheduler/DatePlaceLogScheduler.java index 3982543..7303b79 100644 --- a/src/main/java/org/withtime/be/withtimebe/domain/log/dateplacelog/scheduler/DatePlaceLogScheduler.java +++ b/src/main/java/org/withtime/be/withtimebe/domain/log/dateplacelog/scheduler/DatePlaceLogScheduler.java @@ -4,6 +4,7 @@ import java.time.LocalDateTime; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -26,6 +27,12 @@ public class DatePlaceLogScheduler { @Scheduled(cron = "${scheduler.logs.date-place.sync-cron}") @Transactional(readOnly = true) + @CacheEvict( + value = "date-place-log", + allEntries = true, + cacheManager = "redisCacheManager", + beforeInvocation = false + ) public void syncPlaceCategoryLogsToDB() { LocalDate now = LocalDate.from(LocalDateTime.now().minusMinutes(1)); diff --git a/src/main/java/org/withtime/be/withtimebe/domain/log/dateplacelog/service/query/DatePlaceLogQueryServiceImpl.java b/src/main/java/org/withtime/be/withtimebe/domain/log/dateplacelog/service/query/DatePlaceLogQueryServiceImpl.java index 5cab6d5..0ae8d90 100644 --- a/src/main/java/org/withtime/be/withtimebe/domain/log/dateplacelog/service/query/DatePlaceLogQueryServiceImpl.java +++ b/src/main/java/org/withtime/be/withtimebe/domain/log/dateplacelog/service/query/DatePlaceLogQueryServiceImpl.java @@ -2,6 +2,7 @@ import java.util.List; +import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; @@ -23,6 +24,13 @@ public class DatePlaceLogQueryServiceImpl implements DatePlaceLogQueryService { private final MongoTemplate mongoTemplate; @Override + @Cacheable( + value = "date-place-log", + key = "T(java.time.LocalDate).now().getYear() + '-' + " + + "T(java.time.LocalDate).now().get(" + "T(java.time.temporal.WeekFields).ISO.weekOfYear()" + ") + '-' + " + + "T(java.time.LocalDate).now().getDayOfWeek().getValue()", + cacheManager = "redisCacheManager" + ) public List findMonthlyDatePlaceLogList() { // 1. 추출할 필드 정의 From 9bb3655901df20fef02c3f12a273f7270d220e7e Mon Sep 17 00:00:00 2001 From: pywoo Date: Wed, 20 Aug 2025 23:56:14 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20=EC=9D=B8?= =?UTF-8?q?=EA=B8=B0=20=ED=82=A4=EC=9B=8C=EB=93=9C=20=EB=AC=B4=ED=9A=A8?= =?UTF-8?q?=ED=99=94=20=EC=8B=9C=20=EC=9E=94=EC=97=AC=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=EA=B0=80=20=EC=97=86=EB=8F=84=EB=A1=9D=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../placecategorylog/scheduler/PlaceCategoryLogScheduler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/withtime/be/withtimebe/domain/log/placecategorylog/scheduler/PlaceCategoryLogScheduler.java b/src/main/java/org/withtime/be/withtimebe/domain/log/placecategorylog/scheduler/PlaceCategoryLogScheduler.java index ccfa9cd..28d4ec0 100644 --- a/src/main/java/org/withtime/be/withtimebe/domain/log/placecategorylog/scheduler/PlaceCategoryLogScheduler.java +++ b/src/main/java/org/withtime/be/withtimebe/domain/log/placecategorylog/scheduler/PlaceCategoryLogScheduler.java @@ -35,10 +35,10 @@ public class PlaceCategoryLogScheduler { private final RedisTemplate redisTemplate; private final PlaceCategoryLogRepository placeCategoryLogRepository; - @Scheduled(cron = "${scheduler.logs.place-category.sync-cron}") // 매 5분마다 + @Scheduled(cron = "${scheduler.logs.place-category.sync-cron}") @CacheEvict( value = "place-category-log", - key = "'weekly:' + T(java.time.LocalDate).now().getYear() + '-' + T(java.time.temporal.WeekFields).ISO.weekOfYear().getFrom(T(java.time.LocalDate).now())", + allEntries = true, cacheManager = "redisCacheManager", beforeInvocation = false ) From 95c628047215876f016e58117623749fd0619f17 Mon Sep 17 00:00:00 2001 From: pywoo Date: Thu, 21 Aug 2025 00:51:37 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20AOP,=20?= =?UTF-8?q?=EC=8A=A4=EC=BC=80=EC=A5=B4=EB=9F=AC=20=EB=B9=84=EB=8F=99?= =?UTF-8?q?=EA=B8=B0=20=EC=B2=98=EB=A6=AC=20=EC=8B=9C=20=EC=8A=A4=EB=A0=88?= =?UTF-8?q?=EB=93=9C=ED=92=80=EC=9D=84=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scheduler/DatePlaceLogScheduler.java | 2 ++ .../query/DatePlaceLogQueryServiceImpl.java | 7 ---- .../aop/LogPlaceCategoryAspect.java | 2 +- .../scheduler/PlaceCategoryLogScheduler.java | 6 ++-- .../withtimebe/global/config/AsyncConfig.java | 35 +++++++++++++++++++ 5 files changed, 40 insertions(+), 12 deletions(-) create mode 100644 src/main/java/org/withtime/be/withtimebe/global/config/AsyncConfig.java diff --git a/src/main/java/org/withtime/be/withtimebe/domain/log/dateplacelog/scheduler/DatePlaceLogScheduler.java b/src/main/java/org/withtime/be/withtimebe/domain/log/dateplacelog/scheduler/DatePlaceLogScheduler.java index 7303b79..92e29bc 100644 --- a/src/main/java/org/withtime/be/withtimebe/domain/log/dateplacelog/scheduler/DatePlaceLogScheduler.java +++ b/src/main/java/org/withtime/be/withtimebe/domain/log/dateplacelog/scheduler/DatePlaceLogScheduler.java @@ -5,6 +5,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cache.annotation.CacheEvict; +import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -25,6 +26,7 @@ public class DatePlaceLogScheduler { private final DatePlaceRepository datePlaceRepository; private final DatePlaceLogRepository datePlaceLogRepository; + @Async("logTaskExecutor") @Scheduled(cron = "${scheduler.logs.date-place.sync-cron}") @Transactional(readOnly = true) @CacheEvict( diff --git a/src/main/java/org/withtime/be/withtimebe/domain/log/dateplacelog/service/query/DatePlaceLogQueryServiceImpl.java b/src/main/java/org/withtime/be/withtimebe/domain/log/dateplacelog/service/query/DatePlaceLogQueryServiceImpl.java index 0ae8d90..ef2e830 100644 --- a/src/main/java/org/withtime/be/withtimebe/domain/log/dateplacelog/service/query/DatePlaceLogQueryServiceImpl.java +++ b/src/main/java/org/withtime/be/withtimebe/domain/log/dateplacelog/service/query/DatePlaceLogQueryServiceImpl.java @@ -24,13 +24,6 @@ public class DatePlaceLogQueryServiceImpl implements DatePlaceLogQueryService { private final MongoTemplate mongoTemplate; @Override - @Cacheable( - value = "date-place-log", - key = "T(java.time.LocalDate).now().getYear() + '-' + " + - "T(java.time.LocalDate).now().get(" + "T(java.time.temporal.WeekFields).ISO.weekOfYear()" + ") + '-' + " + - "T(java.time.LocalDate).now().getDayOfWeek().getValue()", - cacheManager = "redisCacheManager" - ) public List findMonthlyDatePlaceLogList() { // 1. 추출할 필드 정의 diff --git a/src/main/java/org/withtime/be/withtimebe/domain/log/placecategorylog/aop/LogPlaceCategoryAspect.java b/src/main/java/org/withtime/be/withtimebe/domain/log/placecategorylog/aop/LogPlaceCategoryAspect.java index 2bede1e..5148bed 100644 --- a/src/main/java/org/withtime/be/withtimebe/domain/log/placecategorylog/aop/LogPlaceCategoryAspect.java +++ b/src/main/java/org/withtime/be/withtimebe/domain/log/placecategorylog/aop/LogPlaceCategoryAspect.java @@ -27,7 +27,7 @@ public class LogPlaceCategoryAspect { private final RedisTemplate redisTemplate; - @Async + @Async("logTaskExecutor") @AfterReturning("@annotation(org.withtime.be.withtimebe.domain.log.placecategorylog.annotation.LogPlaceCategory)") public void logPlaceCategory(JoinPoint joinPoint) { diff --git a/src/main/java/org/withtime/be/withtimebe/domain/log/placecategorylog/scheduler/PlaceCategoryLogScheduler.java b/src/main/java/org/withtime/be/withtimebe/domain/log/placecategorylog/scheduler/PlaceCategoryLogScheduler.java index 28d4ec0..fff2d30 100644 --- a/src/main/java/org/withtime/be/withtimebe/domain/log/placecategorylog/scheduler/PlaceCategoryLogScheduler.java +++ b/src/main/java/org/withtime/be/withtimebe/domain/log/placecategorylog/scheduler/PlaceCategoryLogScheduler.java @@ -1,12 +1,10 @@ package org.withtime.be.withtimebe.domain.log.placecategorylog.scheduler; import java.time.LocalDate; -import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; @@ -15,10 +13,9 @@ import org.springframework.cache.annotation.CacheEvict; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ZSetOperations; +import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -import org.withtime.be.withtimebe.domain.date.entity.PlaceCategory; -import org.withtime.be.withtimebe.domain.date.repository.PlaceCategoryRepository; import org.withtime.be.withtimebe.domain.log.placecategorylog.converter.PlaceCategoryLogConverter; import org.withtime.be.withtimebe.domain.log.placecategorylog.model.PlaceCategoryLog; import org.withtime.be.withtimebe.domain.log.placecategorylog.repository.PlaceCategoryLogRepository; @@ -35,6 +32,7 @@ public class PlaceCategoryLogScheduler { private final RedisTemplate redisTemplate; private final PlaceCategoryLogRepository placeCategoryLogRepository; + @Async("logTaskExecutor") @Scheduled(cron = "${scheduler.logs.place-category.sync-cron}") @CacheEvict( value = "place-category-log", diff --git a/src/main/java/org/withtime/be/withtimebe/global/config/AsyncConfig.java b/src/main/java/org/withtime/be/withtimebe/global/config/AsyncConfig.java new file mode 100644 index 0000000..8aeaa32 --- /dev/null +++ b/src/main/java/org/withtime/be/withtimebe/global/config/AsyncConfig.java @@ -0,0 +1,35 @@ +package org.withtime.be.withtimebe.global.config; + +import java.util.concurrent.Executor; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +@EnableAsync +@Configuration +public class AsyncConfig { + + @Bean(name = "logTaskExecutor") + public Executor logTaskExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(1); + executor.setMaxPoolSize(3); + executor.setQueueCapacity(5); + executor.setThreadNamePrefix("Executor-Log-"); + executor.initialize(); + return executor; + } + + @Bean(name = "weatherTaskExecutor") + public Executor weatherTaskExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(1); + executor.setMaxPoolSize(3); + executor.setQueueCapacity(5); + executor.setThreadNamePrefix("Executor-Weather-"); + executor.initialize(); + return executor; + } +}