인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

bluebamus님의 프로필 이미지
bluebamus

작성한 질문수

파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편

order_pay 뷰 구현

cancel에 대해 질문을 드립니다.

작성

·

43

0

이전에 드렸던 질문이 정리가 잘 되지 않았던 것 같아 다시 정리해 질문을 드리고자 합니다.

 

cancel() 함수와 관련하여 아래 동작에 대해 이해가 잘 되지 않아 질문을 합니다.

  1. 먼저 admin에서 action을 통해 여러개의 선택된 항목들에 대해 queryset을 가져와 for을 이용해 각 항목에 대해 cancel 처리를 하나씩 수행합니다.

@admin.display(description=f"지정 주문결제를 취소합니다.")
    def make_cancel(self, request, queryset):
        for order in queryset:
            order.cancel("관리자가 주문결제를 취소했습니다.")
        self.message_user(request, f"{queryset.count()}개의 주문결제를 취소했습니다.")
  1. 그리고 이후에 호출되는 Order의 cancel()에서는 orderpayment_set.all()을 사용해 하나의 주문에 대한 모든 결제시도 내역을 가져오는 코드를 동작하는 것으로 이해가 됩니다.

def cancel(self, reason=""):
        for payment in self.orderpayment_set.all():
            payment.cancel(reason=reason)
  1. 관련한 코드를 확인하니 orderpay 모델은 order_pay 뷰에 의해 생성이 되며, 생성 조건으로 주문요청 혹은 결제실패 상태가 됩니다.

  2. 그렇다면, orderpayment_set.all() 코드는 한 주문에 대해 성공 및 결제실패에 대한 모든 저장된 결과를 가져와 cancel을 시도하게 되는건데 이게 맞는건지 알고 싶습니다.


답변 2

0

이진석님의 프로필 이미지
이진석
지식공유자

order.orderpayment_set.all() 코드는 한 order 의 결제 시도 목록을 조회합니다. for 반복문에서는 0개 OrderPayment 목록을 순회돌게 되구요. 그런데, OrderPayment 모델에서 결제에 성공할 경우, 다른 다수의 결제 시도 건들을 모두 삭제하기에, Order 마다 1개의 OrderPayment 만이 있을 것입니다.

image.png

각 payment.cancel(reason=reason) 호출 시마다, 각 결제의 merchant_uid 값을 통해 포트원 측에 결제취소를 요청합니다. 결제취소 요청에 대한 응답으로 결제상태를 갱신하거나, 결제취소 요청이 실패할 경우 self.update() 호출을 통해 결제상태 갱신을 재요청토록 구현되어있습니다.

image.png

살펴보시고 댓글 남겨주세요. :-)


이전 질답 링크는 아래에 남겨두겠습니다.
https://www.inflearn.com/community/questions/1415408/cancle%EC%97%90-%EB%8C%80%ED%95%B4-%EB%AC%B8%EC%9D%98-%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4

bluebamus님의 프로필 이미지
bluebamus
질문자

네 해당 코드를 알고 있어, 실재로는 최종 결제 성공 결과 외에는 없을 것이라는 것을 알고 있습니다.

헌데 order.orderpayment_set.all()와 for을 사용해 현재 주문과 관련된 모든 orderpayment에 대해 순회하여 cancel하는 작업을 하는 것인지에 대해 알고 싶습니다.

혹시, 현재는 삭제로 인해 한 주문에 대한 여러 결과는 없지만, 차후에 수정 등으로 인해 생길 수 있는 문제에 대해 방어코드 개념으로 보면 될까요?

이진석님의 프로필 이미지
이진석
지식공유자

옙. 그렇게 이해하실 수 있겠습니다.

질문의 포인트가 그것이었군요 !!! 제가 이해가 늦었습니다.

1:N 관계이니까, 굳이 1:1 관계로 보지않고 순회를 방어적으로 돈 것이죠.

0

안녕하세요, 인프런 AI 인턴입니다. bluebamus님.

주문 결제 취소 로직에서 모든 결제 내역을 가져와 취소를 시도하는 이유는 다음과 같은 몇 가지 요인이 있을 수 있습니다:

  1. 일관성 유지: 여러 번의 결제 시도가 있었던 경우, 성공적인 결제가 이루어졌지만 시스템의 오류로 인해 실패한 결제로 인식될 수 있습니다. 이렇게 모든 결제 정보를 명시적으로 취소해 줌으로써 데이터의 일관성을 확보하려는 의도일 수 있습니다.

  2. 미래의 확장성: 경우에 따라 여러 결제 수단이나 다양한 결제 방식이 포함될 수 있습니다. 모든 결제 내역을 대상으로 취소를 시도하는 것은 시스템 확장성 측면에서 설계의 유연성을 높이는 방법 중 하나입니다.

  3. 보안 및 기록 관리: 모든 결제 시도에 대해 명확하게 취소 기록을 남겨 놓으면, 나중에 발생할 수 있는 분쟁에 대해서도 명확한 근거 자료를 제공할 수 있습니다. 이는 고객 대응 및 서비스 측면에서 긍정적인 영향을 미칠 수 있습니다.

아래와 같은 추가적인 참고 링크도 확인해 보시면 도움이 될 수 있습니다:

  1. 결제 취소 로직 관련 질문 - 유사 사례를 통해 결제 취소 처리에 대한 다른 접근법을 이해할 수 있습니다.
  2. 다중 결제 시스템에서의 처리 방식 - 다중 결제 내역에 대한 관리 방식을 다룬 답변입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

bluebamus님의 프로필 이미지
bluebamus

작성한 질문수

질문하기