<aside> 💡 콘서트 예약 서비스 시나리오 시스템에서 트랜잭션 범위 및 비즈니스 로직 융합에 따른 문제를 EDA 기반으로 개선합니다.
</aside>
@Component
@RequiredArgsConstructor
public class PaymentFacade {
private final QueueService queueService;
private final PaymentService paymentService;
private final ConcertService concertService;
private final UserPointService userPointService;
private final PushClient pushClient;
private final DataPlatformClient dataPlatformClient;
@Transactional
public PaymentResult.Pay pay(String token, PaymentCommand.Pay command) {
// 1. 좌석 소유권 배정 (예약됨 > 점유)
ConcertResult.AssignSeat seatResult = concertService.assignSeat(command.getReservationId());
// 2. 포인트 잔액 차감
UserResult.UsePoint pointResult = userPointService.usePoint(new UserCommand.UsePoint(command.getUserId(), command.getPrice()));
// 3. 대기열 토큰 만료
queueService.expireToken(token);
// 4. 결제 정보 저장
PaymentResult.Pay paymentResult = paymentService.createPayment(command);
// 5. 데이터 플랫폼 전송
dataPlatformClient.send("결제완료", paymentResult);
// 6. 카카오톡 전송
pushClient.sendKakaotalk("결제완료", paymentResult);
return paymentResult.toBuilder()
.userId(command.getUserId())
.point(pointResult.getPoint())
.build();
}
}

성능 저하를 야기합니다.데드락의 위험이 증가합니다.메인 로직에도 영향을 미쳐 전체 트랜잭션이 롤백되는 문제가 발생합니다.재사용성을 낮춥니다.이벤트를 발행합니다. 다른 시스템은 이벤트를 구독하여 필요한 작업을 수행합니다.주요 로직 : 시스템의 핵심 기능을 수행하는 로직입니다. 현재의 로직에서는 좌석 소유권 배정, 포인트 잔액 차감, 대기열 토큰 만료, 결제 저장 등이 있습니다.부가 로직 : 핵심 기능과는 별도로, 추가적인 작업을 수행하는 로직입니다. 현재의 로직에서는 데이터 플랫폼 전송과 카카오톡 전송이 부가 로직에 해당합니다.별도의 트랜잭션으로 처리하거나, 비동기 작업으로 처리합니다.순서 제어로 모든 주요 로직이 성공적으로 완료된 후에 토큰 만료가 처리되도록 순서를 지정했습니다.success 이벤트 발행Order(1)BEFORE_COMMIT 옵션으로 주요 로직이 트랜잭션 내에서 실행되도록 보장success 이벤트 구독Order(2)BEFORE_COMMIT 옵션으로 주요 로직이 트랜잭션 내에서 실행되도록 보장success 이벤트 구독