이전 고민 글
https://aha2246.tistory.com/165
고민 요약
비동기 결제 처리를 위해 카드정보를 미리 입력, 결제를 처리하는 메소드에 단순하게 @Async를 붙여서 비동기로 처리함.
궁극적으로 결제를 비동기로 처리하려는 이유는 사용자가 결제 시에 추가적으로 처리되야할 로직들(ex. 결제 시 이벤트 참가, 사용한 쿠폰 삭제, 포인트 삭감 등)이 길어질경우 그 로직들을 다 기다리지 않고 다른 작업을 할 수 있도록 해야함
하지만 지금 코드대로라면 결국에 전체적인 로직은 계속 동기적으로 처리하고 결제 서비스 메소드만 비동기로 처리, 즉 결국에는 반환값을 받을떄까지 기다리는 동기적인 흐름으로 진행된다고 생각됨.
고민 결과
결제 이후에 들어가는 로직들이 많아지고 이 로직들은 비동기로 흘러가는 로직 상에서 동기로 돌아가야 한다. 주문 생성 후 결제 요청까지 하나의 쓰레드가 요청하고, 이후에 이 비동기 결제가 처리되는 과정(이벤트, 포인트 관련 연산)은 따로 비동기를 처리하는 쓰레드(앞에 요청 쓰레드와는 달라질 수 있습니다) 내에서 동기로 처리되는 구조가 되어야함.
코드 수정
// Controller에서 비동기처리
@PostMapping("/subscribe/payments/onetime")
public ResponseEntity<HttpStatus> paymentOnetime(@RequestBody PaymentOnetimeDto paymentOnetimeDto) {
    CompletableFuture.runAsync(() -> {
        try {
            paymentService.processAsync(paymentOnetimeDto);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    });
    return ResponseEntity.ok(HttpStatus.OK);
}
// 동기적으로 처리되어야 하는 부분을 하나의 트랜잭션으로 묶어서 처리
@Transactional
public void processAsync(PaymentOnetimeDto paymentOnetimeDto) throws IamportResponseException, IOException {
    IamportResponse<Payment> payment = getPaymentOnetime(paymentOnetimeDto);
    orderService.updateMerchant(paymentOnetimeDto.getBuyer_orderId(), paymentOnetimeDto.getMerchant_uid());
    checkFailedPayment(payment);
    
    if (payment.getCode() == 0) {
        updatePaymentStatus(paymentOnetimeDto.getBuyer_orderId());
    }
}
// 결제 실패인 경우 확인
private void checkFailedPayment(IamportResponse<Payment> payment) {
    if (payment.getCode() != 0) {
        throw new IllegalArgumentException(payment.getMessage());
    }
}
//order.js
// 클라이언트 측에서는 데이터가 넘어가기만 하면 요청됨을 사용자에게 안내해줌
if (responseData != null) {
    alert("결제 요청이 완료되었습니다.");
    window.location.href="/my-page";
}
결제 요청시 사용자가 주문 관련 로직들이 끝날때까지 기다려야 했던 것과 달리
수정 후 사용자는 결제 요청을 하게되면 바로 마이페이지로 가게되고
요청시에 비동기로 보내졌던 결제 로직들을 처리하고 결제 성공이 되었다면 사용자는 결제 완료로 상태가 바뀐 주문 내역을 확인할 수 있다.
지금이야 워낙 소규모 프로젝트고, 결제 로직에 추가적인 도메인들이 많이 없지만, 실제 서비스에서는 추가적인 도메인들이 계속 붙을 수 있기 때문에 비동기에 대해 고민했던 시간들과 비동기 결제 처리를 간단하게 맛이라도 보고 경험해본것이 만족스럽다.
'코드개선, 성능개선' 카테고리의 다른 글
| N+1 없애보기 (0) | 2024.02.28 | 
|---|---|
| 비동기 결제 처리 고민 (0) | 2024.02.15 | 
| 검색 성능 개선 - 2 (0) | 2024.01.20 | 
| 검색 성능개선 - 1 (0) | 2024.01.20 |