From 718b9ee51024bf82c539937cac1293a05b7d0853 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Mon, 23 Mar 2026 15:57:08 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20ThreadPoolTaskExecutor=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../in/koreatech/koin/global/config/AsyncConfig.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/in/koreatech/koin/global/config/AsyncConfig.java b/src/main/java/in/koreatech/koin/global/config/AsyncConfig.java index e9f4094a83..3a37b11ea0 100644 --- a/src/main/java/in/koreatech/koin/global/config/AsyncConfig.java +++ b/src/main/java/in/koreatech/koin/global/config/AsyncConfig.java @@ -6,6 +6,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import lombok.extern.slf4j.Slf4j; @@ -16,7 +17,13 @@ public class AsyncConfig implements AsyncConfigurer { @Override public Executor getAsyncExecutor() { - return null; + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(2); + executor.setMaxPoolSize(5); + executor.setQueueCapacity(20); + executor.setThreadNamePrefix("AsyncExecutor-"); + executor.initialize(); + return executor; } @Override From 76fdb9618fc3a40630f4ec3d3dde73205eee2d03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Mon, 23 Mar 2026 15:58:54 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=EB=B9=84=EB=8F=99=EA=B8=B0=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=98=88=EC=99=B8=20=ED=95=B8=EB=93=A4?= =?UTF-8?q?=EB=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/in/koreatech/koin/global/config/AsyncConfig.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/in/koreatech/koin/global/config/AsyncConfig.java b/src/main/java/in/koreatech/koin/global/config/AsyncConfig.java index 3a37b11ea0..e26d402cf9 100644 --- a/src/main/java/in/koreatech/koin/global/config/AsyncConfig.java +++ b/src/main/java/in/koreatech/koin/global/config/AsyncConfig.java @@ -1,5 +1,7 @@ package in.koreatech.koin.global.config; +import static java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy; + import java.util.concurrent.Executor; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; @@ -22,6 +24,7 @@ public Executor getAsyncExecutor() { executor.setMaxPoolSize(5); executor.setQueueCapacity(20); executor.setThreadNamePrefix("AsyncExecutor-"); + executor.setRejectedExecutionHandler(new CallerRunsPolicy()); executor.initialize(); return executor; } From b3ffca8a1afcae57556ff8ab712aa0ca70b12cdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Mon, 23 Mar 2026 16:07:37 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20onKeywordRequest=20=EB=B9=84?= =?UTF-8?q?=EB=8F=99=EA=B8=B0=20=EC=B2=98=EB=A6=AC=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notification/eventlistener/ArticleKeywordEventListener.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/in/koreatech/koin/domain/notification/eventlistener/ArticleKeywordEventListener.java b/src/main/java/in/koreatech/koin/domain/notification/eventlistener/ArticleKeywordEventListener.java index 53f985fe77..1a2392cbf5 100644 --- a/src/main/java/in/koreatech/koin/domain/notification/eventlistener/ArticleKeywordEventListener.java +++ b/src/main/java/in/koreatech/koin/domain/notification/eventlistener/ArticleKeywordEventListener.java @@ -13,6 +13,7 @@ import java.util.stream.Collectors; import org.springframework.context.annotation.Profile; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.transaction.event.TransactionalEventListener; @@ -42,6 +43,7 @@ public class ArticleKeywordEventListener { // TODO : 리팩터링 필요 (비즈 private final KeywordService keywordService; private final ArticleRepository articleRepository; + @Async @TransactionalEventListener public void onKeywordRequest(ArticleKeywordEvent event) { Map matchedKeywordByUserId = event.matchedKeywordByUserId();