From 98b8befadec5230adbdab9ab09ec9c3f90986a51 Mon Sep 17 00:00:00 2001 From: codeVac513 Date: Tue, 5 May 2026 00:22:20 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20async=20=EC=96=B4=EB=85=B8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=EC=9D=84=20=EC=82=AC=EC=9A=A9=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20EnableAsync=20?= =?UTF-8?q?=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/samyookgoo/palgoosam/PalgoosamApplication.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/samyookgoo/palgoosam/PalgoosamApplication.java b/src/main/java/com/samyookgoo/palgoosam/PalgoosamApplication.java index 0daf79af..a7b4a243 100644 --- a/src/main/java/com/samyookgoo/palgoosam/PalgoosamApplication.java +++ b/src/main/java/com/samyookgoo/palgoosam/PalgoosamApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; +@EnableAsync @EnableScheduling @SpringBootApplication public class PalgoosamApplication { From 71dbd50ed271a4fc69f86f1216e9095911ab57e0 Mon Sep 17 00:00:00 2001 From: codeVac513 Date: Tue, 5 May 2026 00:23:09 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20event=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= =?UTF-8?q?=ED=95=B4=EC=84=9C=20=EB=B9=84=EB=8F=99=EA=B8=B0=EB=A1=9C=20?= =?UTF-8?q?=EC=97=98=EB=9D=BC=EC=8A=A4=ED=8B=B1=EC=84=9C=EC=B9=98=20?= =?UTF-8?q?=EB=8F=84=ED=81=90=EB=A8=BC=ED=8A=B8=EB=A5=BC=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=C3=AC=C3=AC?= =?UTF-8?q?=C2=A0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/ElasticsearchAuctionEvent.java | 14 ++++++++++++ .../event_listener/AuctionEventListener.java | 22 +++++++++++++++++++ .../auction/service/AuctionService.java | 7 +++++- 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/samyookgoo/palgoosam/auction/event/ElasticsearchAuctionEvent.java create mode 100644 src/main/java/com/samyookgoo/palgoosam/auction/event_listener/AuctionEventListener.java diff --git a/src/main/java/com/samyookgoo/palgoosam/auction/event/ElasticsearchAuctionEvent.java b/src/main/java/com/samyookgoo/palgoosam/auction/event/ElasticsearchAuctionEvent.java new file mode 100644 index 00000000..cd86ebf0 --- /dev/null +++ b/src/main/java/com/samyookgoo/palgoosam/auction/event/ElasticsearchAuctionEvent.java @@ -0,0 +1,14 @@ +package com.samyookgoo.palgoosam.auction.event; + +import com.samyookgoo.palgoosam.search.domain.AuctionSearchDocument; + +public class ElasticsearchAuctionEvent { + private final AuctionSearchDocument searchDocument; + + public ElasticsearchAuctionEvent(AuctionSearchDocument searchDocument) { + this.searchDocument = searchDocument; + } + + public AuctionSearchDocument getSearchDocument() { + return searchDocument; + }} diff --git a/src/main/java/com/samyookgoo/palgoosam/auction/event_listener/AuctionEventListener.java b/src/main/java/com/samyookgoo/palgoosam/auction/event_listener/AuctionEventListener.java new file mode 100644 index 00000000..477933fe --- /dev/null +++ b/src/main/java/com/samyookgoo/palgoosam/auction/event_listener/AuctionEventListener.java @@ -0,0 +1,22 @@ +package com.samyookgoo.palgoosam.auction.event_listener; + +import com.samyookgoo.palgoosam.auction.event.ElasticsearchAuctionEvent; +import com.samyookgoo.palgoosam.search.repository.AuctionSearchElasticsearchRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +@Component +@RequiredArgsConstructor +public class AuctionEventListener { + + private final AuctionSearchElasticsearchRepository auctionSearchElasticsearchRepository; + + @Async + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + public void onAuctionCreated(ElasticsearchAuctionEvent event) { + auctionSearchElasticsearchRepository.save(event.getSearchDocument()); + } +} diff --git a/src/main/java/com/samyookgoo/palgoosam/auction/service/AuctionService.java b/src/main/java/com/samyookgoo/palgoosam/auction/service/AuctionService.java index bb74f7af..2f3d9280 100644 --- a/src/main/java/com/samyookgoo/palgoosam/auction/service/AuctionService.java +++ b/src/main/java/com/samyookgoo/palgoosam/auction/service/AuctionService.java @@ -14,6 +14,7 @@ import com.samyookgoo.palgoosam.auction.dto.request.AuctionSearchRequestDto; import com.samyookgoo.palgoosam.auction.dto.request.AuctionUpdateRequest; import com.samyookgoo.palgoosam.auction.dto.response.*; +import com.samyookgoo.palgoosam.auction.event.ElasticsearchAuctionEvent; import com.samyookgoo.palgoosam.auction.exception.AuctionCategoryException; import com.samyookgoo.palgoosam.auction.exception.AuctionForbiddenException; import com.samyookgoo.palgoosam.auction.exception.AuctionImageException; @@ -59,6 +60,7 @@ //import org.springframework.beans.factory.annotation.Value; //import org.springframework.data.redis.core.RedisTemplate; //import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.data.elasticsearch.client.elc.NativeQuery; @@ -83,6 +85,7 @@ public class AuctionService { private final AuctionSearchElasticsearchRepository auctionSearchElasticsearchRepository; private final ElasticsearchOperations elasticsearchOperations; private final CategoryService categoryService; + private final ApplicationEventPublisher publisher; // private final S3Service s3Service; // private final StringRedisTemplate stringRedisTemplate; @@ -133,12 +136,14 @@ public AuctionCreateResponse createAuction(AuctionCreateRequest request) { savedAuction.getEndTime(), imageResponses.getFirst().getUrl() ); - this.auctionSearchElasticsearchRepository.save(searchDocument); + publisher.publishEvent(new ElasticsearchAuctionEvent(searchDocument)); return AuctionCreateResponse.of(auction, imageResponses, category, request.getStartDelay(), request.getDurationTime()); } + + @Transactional(readOnly = true) public AuctionDetailResponse getAuctionDetail(Long auctionId) { User user = authService.getCurrentUser();