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

inspireworld님의 프로필 이미지
inspireworld

작성한 질문수

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

order_pay 뷰 구현

주문 로직

작성

·

97

0

현재는 주문하기 버튼을 클릭하는 순간, 주문정보와 결제정보가 같이 생성되는데 예제이나

보통의 쇼핑몰에서는 결제 시점에 주문정보와 결제정보가 생성되겠죠..?

알리익스프레스의 경우 결제 도중에 취소하면, 결제대기? 비슷하게 주문목록에 남았던 것 같긴합니다.

근데 관리차원에서는 결제가 정상적으로 완료되는 시점에서만 주문과 결제정보를 생성하는게 좋을 것 같은데..

이 과정에서 로직 상 문제가 될만한 점이 있을까요.?

답변 3

0

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

이해했습니다.

"주문하기" 버튼 클릭 시에 Order(주문내역)을 생성하고, 장바구니를 비우고, OrderPayment(결제시도)를 생성하고 있습니다. 이는 간소화된 구현이구요.

말씀하신 대로, 결제가 완료되는 시점에 주문내역과 결제내역을 데이터베이스에 저장하시는 방법도 좋습니다. merchant_id 만 매 결제를 시도할 때마다, 새로운 값으로 지정되도록 해주시면 됩니다.

그런데, 결제를 시도하는 시점에 주문내역/결제금액 등을 정리하고 이를 유저로부터 확인을 받고 결제를 시도하게 될텐데요. 이러한 데이터를 저장하고 유효성 검사를 수행하고 다시 유저에게 보여주는 가장 간결한 방법은 데이터베이스와 모델을 활용하는 것입니다. // 웹은 stateless로서 상태를 어딘가에 필히 저장을 해야 합니다. 데이터베이스와 모델을 활용하지 않는다면, 대안으로 메모리/세션/쿠키, 혹은 다른 저장소(redis 등)가 있을 수 있는 데요. 이미 데이터베이스/모델이라는 좋은 선택지가 있는 데 다른 선택지가 어떤 장점이 있을 지는 잘 모르겠습니다.

결제가 실패한 건들에 대해서는 유저에게 굳이 노출할 필요는 없구요. 현재 진행 중인 주문/결제 건에 대해서만 노출하실 수 있구요. 결제가 실패한 건에 대해서는 선택적으로 유저에게 재결제를 요구할 수 있을 것이구요.

장바구니는 결제가 완료된 뒤에, 결제가 된 상품들에 대해서만 선택적으로 장바구니에서 삭제토록 로직을 추가해보셔도 좋을 듯 합니다. :-)

충분한 답변이 되었을 지 모르겠습니다. 살펴보시고 댓글 부탁드립니다.

좋은 질문과 깊은 고민을 해주셔서, 감사드립니다. 👍

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

자세한 답변 주셔서 감사합니다.

먼저 말씀하신대로 DB에 저장하는 방식이 좋을 것 같아요.

다만 만약 언급해주신 DB와 모델을 활용해서 진행한다면, 주문 DB는 결제창을 클릭하기 전에 생성해둬야할텐데

결제되지 않은 주문에 관한 데이터는 따로 제거하지 않아도 괜찮은지 의문이 들어서요.

오픈마켓을 예시로 들자면 주문페이지(제가 캡쳐해드린 이미지)에 접속할 때마다 주문 DB가 생성되는건데, 해당 DB를 일반적으로 정리하지 않고 그대로 두나요..?

제가 생각하기에 사용되지 않을 DB를 그대로 둔다는게 조금은 비효율(?)적인 것 같아서요.
물론 결제 도중에 실패한건은 데이터베이스에 남겨둘 필요가 있는데, 결제하려다가 브라우저를 닫거나 도중에 결제 취소를 누르고 상품을 추가하러 갔다가 다시 주문 및 결제를 시도하는 경우에는 일정 시간이 지난뒤에 삭제해주거나 해야하지 않을까? 하는 생각이 들어서 재차 질문드려봅니다.

만약에 정리가 필요하다면 말씀하신대로 stateless기 때문에 merchant_uid는 이미 사라진 뒤고, 관련 정보를 어떻게 정리할 것인가의 의문이 있어서요. 주기적으로 status에 따라서 처리하면 될것 같기도 합니다.

아니면 정리하지 않은채로 그대로 둬도 무방할 것 같긴하나, 이런식으로 이커머스 서비스에서 운영할 것 같진 않아서요. 뭐랄까 비합리적이라고 해야할까요..? 어찌보면 불필요한 데이터(결제될 가능성도 없고, 고객이 확인할 필요도 없는)를 계속 보관하는거니까요.

 

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

정답도 없고, 일반적이라는 것은 없습니다. 필요에 의해서 서비스를 구축할 뿐인거죠.

강의에서 다룬 코드는 하나의 예시일 뿐인 것이구요.

강의에서는 주문과 결제를 한 번에 생성했지만, 미결제 건에 대해서는 기존 주문에 대해서 결제만 다시 생성하시거나, 기존 결제 건에서 merchant_uid 만 변경해서 재활용하시는 방법도 좋습니다.

데이터베이스는 1차 저장소이고, 이를 데이터로서 활용하실 목적이라면 다른 데이터로 가공하신 후에 원본은 제거하시면 됩니다. 데이터로서 활용하실 목적이 없으시다면, 하루 1회 정도로 모아서 삭제하시면 됩니다.

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

감사합니다^^
말씀하신대로, 로직은 유연하게 짜고.. 불필요한 데이터라고 확실해지면 제거 배치를 돌리던, 향후 데이터가 많이 쌓였을때 별도의 데이터베이스를 구축하던 고려해봐야겠습니다.
제가 궁금증이 많은 편이라, 질문이 많아서 굉장한 인내심을 요구하게 되셨을것 같은데ㅜ 좀 죄송하네요.

많은 도움이 되었습니다.

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

깊은 고뇌의 다양한 질문 좋고, 감사드립니다. :-)

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

그렇게 생각해주셔서 감사합니다.

그럼 또.. 개발하다가 깊은 고뇌의 질문이 생기면 가지고 오겠습니다.

좋은 하루되세요^^

0

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

안녕하세요.

"관리차원에서는 결제가 정상적으로 완료되는 시점에서만 주문과 결제정보를 생성하는게 좋을 것 같다." 라고 하신 부분에 대해서, 왜 그러한 것인지를 제가 잘 가늠이 안 됩니다. 그렇게 생각하신 이유에 대해서 좀 더 설명해주실 수 있으실까요? :-)

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

제가 설명이 좀 짧았습니다.ㅎ

https://www.inflearn.com/community/questions/1188610

이분이 질문하신 내용도 포함되는 내용입이고 좀 더 자세히 설명하겠습니다.ㅎ 친절하게 답변주셔서 감사합니다.

  1. 장바구니에 상품이 담겨있는 상황에서 주문하기 버튼을 누르면

  2. order_new = 장바구니 상품 정보를 기준으로 주문 인스턴스가 생성

    1. 주문 인스턴스 생성 후 카트에 있는 상품이 삭제

  3. order_pay 뷰로 이동해서 결제를 시도.

    1. 실제 결제 유무와 관계 없이 payment 인스턴스는 생성되고, 결제창도 띄웁니다.

  4. 그래서 이미 결제 유무와 관계 없이 order와 payment 정보는 DB에 기록된 상태가 되고 order_detail로 리다이렉트

되는걸로 코드 로직을 이해했습니다.

 

오픈마켓에선 장바구니를 담고, 결제 할 때에는 아래와같이 주문하기 폼만 만들어주는 것 같아요.

아래 예시는 쿠팡입니다.

image.png


결제하기 버튼을 누르면 그때 결제 창이 뜨는데, 그때도 별다른 것은 안하고

실제 결제가 success 되었을 때

  1. 장바구니의 상품도 삭제하고 order정보와 payment정보도 생성하는 것 같습니다..

  2. 그렇지 않다면 현재 예제처럼 결제 창을 끈 경우에 장바구니가 비워져야되고, 어딘가에 order나 payment가 만들어져있을 것 같은데.. 그런식으론 안되어 있어보여요. 그리고 따로 redirect없이 주문하기 폼 페이지에 그대로 있습니다.

     

    - "고객입장"에서 주문하기 폼만 만들어주고, 결제하기 버튼을 누르고 결제가 완료 된 시점에, 주문과 결제정보를 생성되는게 다시 주문폼에서 결제를 눌러도되고, 결제 도중에 잊은 상품을 추가하기 위해서 장바구니로 이동해서 줄품을 추가하고 주문하기를 누른 뒤 결제를 하기도 편리할 것 같고,

    - "운영하는 사람" 입장에서는 현재는 장바구니에 담은 항목을 "주문하기" 누를 때마다 주문/결제 정보가 생성되버리면, 결제되지 않거나 주문되지 않을만한 내역들도 다수 추가될 가능성이 있어보이고, 결제 도중 창을 꺼버린 것들도 재결제 할 수 있도록 기능을 추가하고 관리해야한다는 부담도 있어보여서요. 그래서 관리 차원에서도 결제 후 주문된 건만 DB에 저장하는게 좋지 않나 싶어서 질문드렸습니다.

그런데 이 과정에서 로직상 구현하기 어려운 것이 있나 싶어서 여쭤본 질문이였습니다.

가장 중요한 것이 결제가 조작 없이 잘 된건가를 판단하는 부분 같은데.. uuid를 임시로 생성한 뒤에 세션에 주문 관련 정보를 저장 해두고 결제가 완료된 뒤에 결제 금액 검증 후 주문과 결제 인스턴스를 동시에 만들어주는 형태로하면 문제가 없지 않을까 싶어요.

혹시나 제가 놓친 부분이 있을까봐 여쭤봅니다.
내용이 길고 글로 표현하다보니.. 전달이 잘 안되는 부분이 있으면 말씀해주시면 댓글 드리겠습니다.

감사합니다^^

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

어제 댓글 남기고 조금 더 고민 해봤는데,

  1. 만약에 임시로 merchant_id를 생성하고 세션에 저장한 뒤에 결제가 완료되는 시점에서 주문내역과 결제내역을 생성하는 방식은

     

    - 결제 완료 시점에 merchant_id가 중복되서 결제가 제대로 처리되지 않을 가능성이 존재할 것 같고,

  2. 주문페이지에서 merchant_id와 함께 주문내역을 생성한 뒤에, 결제 완료 후 주문내역 업데이트 및 결제내역 생성하는 방법

     

    - 결제는 하지 않고 주문페이지를 들락날락하는 경우 계속해서 주문내역이 생성될텐데, 이 주문내역을 어떤식으로 관리하는지 의문이 있습니다.

 ------------- 추가 -----

결제 시도 시점에, merchant_id로 결제된 내역이 있는지 체크하는 로직이 있네요. 이러면 모델은 주문과 결제는 따로 두되 1번 방식이 좋아보이는데, 일반적인 쇼핑몰은 어떻게 구현되는지 궁금하네요.

0

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

주문 로직과 관련하여 이러한 질문은 실제 전자상거래 시스템 설계에서 중요한 고려 사항입니다. 주문 정보와 결제 정보 생성 시점에 따라 장단점이 존재하며, 아래 몇 가지 사항을 고려해볼 수 있습니다.

결제 시점에 주문 및 결제 정보 생성

장점:

  1. 정확한 데이터 관리: 결제가 완료된 주문만 저장하여 데이터의 정확성과 무결성을 보장할 수 있습니다. 관리적인 측면에서 취소된 주문이 DB에 불필요하게 남지 않아 효율적입니다.
  2. 간단한 프로세스: 결제 완료 후 데이터만 처리하므로 설계가 단순해질 수 있습니다.

단점:

  1. 사용자 경험(UX): 주문 후 결제 실패 시, 사용자가 다시 주문을 진행해야 할 수 있습니다. 사용자 경험이 다소 불편할 수 있습니다.
  2. 경쟁 요소: 결제 완료 후에만 재고를 차감하면, 품절 상태가 발생할 위험이 있습니다. 일부 사용자가 결제를 시도하는 동안 다른 사용자가 먼저 결제를 완료할 수 있습니다.

결제 시도 시 주문 정보 생성

장점:

  1. 유연한 주문 취소 및 환불 처리: 사용자가 결제 도중 취소할 수 있으며, 시스템은 대기 중인 주문 상태로 유지할 수 있습니다.
  2. 재고 관리 측면: 먼저 주문 정보를 생성하여 결제 시점까지 재고를 임시 보호할 수 있습니다.

단점:

  1. 데이터 복잡성: 결제 대기 중인 주문이나 실패한 결제 및 취소된 주문 데이터를 어떻게 관리할지가 중요합니다. 불필요한 데이터가 많아 관리가 복잡해질 수 있습니다.
  2. 시스템 복잡성 증가: 주문 상태를 여러 가지로 관리해야 하기 때문에 시스템이 복잡해질 수 있습니다.

유사한 문제에 대한 사례

  1. 결제 시스템에서의 주문 처리: 이 링크에서는 결제 처리가 어떻게 진행되는지에 대한 논의가 이루어졌습니다. 결제 흐름과 관련된 정보가 유용할 수 있습니다.
  2. 재고 관리 및 품절 처리: 주문 프로세스와 관련하여 재고 관리 방식에 대해 다룬 게시물입니다.

주문 생성 및 결제 처리시점 결정은 사업자의 모델과 고객 경험을 모두 만족시킬 균형점을 찾는 것이 중요합니다. 이를 기반으로 각 케이스에 맞는 방식을 선택하시면 됩니다.

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

inspireworld님의 프로필 이미지
inspireworld

작성한 질문수

질문하기