From ed058aaf601fe32d0273ec17e00ef67383262d64 Mon Sep 17 00:00:00 2001 From: yonghwankim-dev Date: Mon, 28 Oct 2024 16:54:03 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20=EB=A7=A4=EC=9E=85=20=EC=9D=B4=EB=A0=A5?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=ED=8A=B8?= =?UTF-8?q?=EB=9F=AC=EB=B8=94=20=EC=8A=88=ED=8C=85=20=EB=AC=B8=EC=84=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d6e49250..9ff6ccfb 100644 --- a/README.md +++ b/README.md @@ -184,14 +184,59 @@ ## 5. 핵심 트러블 슈팅
-매입 이력 추가 후 목표수익률 이벤트 지연 로딩 문제 +매입 이력 추가 후 목표수익금액 달성 이벤트의 지연 로딩 문제
-- 매입 이력 추가 서비스 과정에서 지연 로딩된 연관 엔티티를 이미 로딩되었기 때문에 이벤트 수행 과정에서 직전에 추가된 매입이력이 조회되지 않은 것이 원인 +### 해결 시도 1 + +- 매입 이력 추가 서비스 과정에서 지연 로딩된 연관 엔티티(매입 이력 엔티티, PurchaseHistory) 리스트를 이미 로딩되었기 때문에 + 이벤트 수행 과정에서 직전에 추가된 매입이력이 조회되지 않은 것이 원인 - 매입 이력 추가 서비스에서 직전에 추가된 매입 이력을 연관 엔티티 리스트에 추가하도록 하여 문제 해결(영속성 전이는 설정하지 않고 별도로 db에 추가하도록 하는 방식으로 수행) - [issue#275](https://github.com/fine-ants/FineAnts-was/issues/275) +### 해결 시도 2 + +- 이벤트 리스너에서 @Async 애노테이션을 통하여 이벤트가 비동기로 동작한다고 생각하였으나 @EnableAsync 애노테이션을 설정하지 않아서 + 동기적으로 수행된 것이 원인. +- 매입 이력 추가 서비스와 목표수익금액 달성 알림 이벤트가 같은 트랜잭션 내에 있기 때문에 직전에 추가된 매입이력이 조회되지 않는 것이 원인 +- 설정 클래스에 @EnableAysnc 애노테이션을 추가하여 비동기적으로 수행하게 하고, @TransactionalEventListener 애노테이션을 이벤트 리스너 메서드에 적용하여 매입 이력 추가 서비스 후에 + 동작하도록 개선 +- [issue#515](https://github.com/fine-ants/FineAnts-was/issues/515) + +#### @EnableAsync 설정 + +```java + +@EnableAsync +@Configuration +public class SpringConfig { +} +``` + +#### 이벤트 리스너 메서드 애노테이션 설정 + +이벤트 리스너 메서드인 notifyTargetGainBy 메서드에 @TransactionalEventListner 애노테이션을 설정하여 매입 이력 추가 서비스의 커밋 이후에 동작하도록 합니다. + +```java + +@Component +@RequiredArgsConstructor +@Slf4j +public class PurchaseHistoryEventListener { + // ... + + // 매입 이력 이벤트가 발생하면 포트폴리오 목표수익률에 달성하면 푸시 알림 + @Async + @TransactionalEventListener + public CompletableFuture notifyTargetGainBy(PushNotificationEvent event) { + PurchaseHistoryEventSendableParameter parameter = event.getValue(); + return CompletableFuture.supplyAsync(() -> + (PortfolioNotifyMessagesResponse)notificationService.notifyTargetGain(parameter.getPortfolioId())); + } +//... +``` +