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

inspireworld님의 프로필 이미지
inspireworld

작성한 질문수

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

포트원 결제내역 검증 및 payment_detail 뷰를 통한 결제내역 조회

결제 기능을 비동기적으로 처리할 필요는 없나요..?

작성

·

98

0

제가 예전에 webpush를 테스트할 때 request에 따른 응답이 느린 경우에 django app 서버가 멈춰버리는 경험을 한적이 있습니다..

 

이 경우에 결제도 마찬가지로 포트원 쪽에서 응답이 느려지는 특별한 상황이 생기면, django 결제 단계에서 응답이 오지 않는 문제 때문에, 다른 기능도 작동하지 않는 상황이 발생할 것 같습니다.

두가지 더 나은 방법이 있는데

  1. 결제를 비동기적으로 처리하는 경우는 없나요..?

  2. 아니면 webhook을 통해서 처리하면 결제 검증을 반대로 webhook으로 온 데이터를 django 내부 데이터와 비교하는 형태로 처리하는 건 어떨까요?

답변 3

1

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

살펴보니, 어떤 분이 iamport 라이브러리의 async 버전을 공개해두신 것이 있네요. :-)

관련 이슈 : https://github.com/iamport/iamport-rest-client-python/issues/56
저장소 : https://github.com/rumbarum/iamport-async-rest-client-python

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

굉장히 친절하신 강사님, 감사합니다^^
오늘도 좋은 하루되세요 :)

0

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

안녕하세요.

  1. 말씀하신 대로 sync 함수 내에서 직접적으로 api 호출을 할 경우, i/o blocking이 될 수 있습니다. 비동기 처리가 필요합니다.

  2. 아래의 포트원 공식문서에서도 가이드하듯이, 안전한 검증을 위해서는 결제 시점에 맞춰 우리가 결제건을 직접 조회하는 방식이 꼭 필요합니다.
    관련 문서 : https://developers.portone.io/opi/ko/integration/webhook/readme-v1?v=v2

image.png

비동기 호출을 위해

  1. 결제를 처리하는 View 등와 portone api 호출을 async 방식으로 호출하실 수도 있겠구요. (async view 함수) 이때에는 장고 프로젝트를 WSGI 방식이 아닌 ASGI 방식의 구동이 필요하구요. daphne[channels] 라이브러리 설정이 필요합니다. iamport python 라이브러리에서는 현재 async 방식을 지원하지 않으니 async 호출은 httpx 라이브러리 등의 async를 지원하는 라이브러리를 활용한 호출이 필요합니다.

     

  2. 혹은 celery 등의 worker 라이브러리를 통해, portone api 호출을 View 호출이 아닌 별도의 프로세스를 통해 처리하시는 방법도 있습니다. 이때에는 iamport python 라이브러리를 그대로 쓰셔도 됩니다.

살펴보시고 댓글 부탁드립니다. 화이팅입니다. :-)

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

감사합니다ㅎㅎ
친절하신 답변에 정말 많은 도움 되고 있습니다.
추가적인 궁금한게 생겼습니다.
django 앱서버를 띄울 때 워커를 많이 띄워두면, 동기적으로 처리하더라도 i/o blocking을 조금이라도 완화할 수 있나요?

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

프로세스를 많이 띄워두더라도 근본적인 I/O 블로킹 이슈는 그대로입니다. 다만 말씀하신 대로 그 수를 늘리면 동시에 처리할 수 있는 요청의 수가 증가하기 때문에, 서비스마다 다르겠지만 동시에 결제가 발생할 확률은 낮을 것이기에, 약간의 I/O 블로킹이 발생하더라도 유저는 큰 불편이 없을 수도 있습니다.

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

감사합니다..ㅎ

데모때까진 워커를 좀 늘려서 sync로, 장기적으론 celery로 구현하는 형태로 해봐야겠습니다.

celery를 구축해두면 스케쥴링이나 여러모로 이점이 많더라구요.ㅎ

비동기를 사용하려면 client에서 일정 시간마다 pull로 상태를 확인하거나, 서버에서 sse, websock을 사용해야 하지 않나요?

양방향 통신이 필요 없다면 SSE로 구현하면 좋을거 같은데... sse나 websock은 asgi를 써야해서 celery를 사용하더라도 iamport python를 사용할 수 없지 않을까란 생각이 듭니다.

혹 이 외 다른 방법이 또 있을까요?

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

@bluebamus : View 요청을 처리할 때, 포트원 API 요청 시에 blocking i/o가 발생하는 부분에 대한 질문이라서요. 클라이언트 단에서 polling/sse/websocket을 처리하는 부분은 별개의 이슈인 듯 합니다. :-)

celery를 활용해 별도 프로세스로 처리하면, celery worker 내에서는 blocking i/o가 발생하더라도 View 단에는 영향을 끼치지 않습니다.

--

의견 주시면, 같이 토론해보시죠. :-)

0

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

결제 기능을 Django에서 처리할 때, 비동기 처리를 고려하는 것은 매우 중요한 요소입니다. 질문하신 두 방법 모두 실무에서 고려할 수 있는 접근 방법이므로, 각각의 방법에 대해 간단히 설명드리겠습니다.

  1. 결제를 비동기적으로 처리하는 경우:

    • Django에서 결제 처리를 비동기적으로 구현하면, 서버의 다른 요청들이 블록되지 않고 동시에 처리될 수 있습니다. 이를 위해 Celery와 같은 비동기 작업 큐를 사용하여 백그라운드에서 결제를 처리하는 방법이 있습니다. 이 방식은 결제 처리 시간이 길어질 수 있는 경우 서버의 전체 응답 속도를 개선하는 데 도움을 줍니다.
  2. Webhook을 통한 처리:

    • Webhook은 외부 서비스가 특정 이벤트가 발생할 때마다 서버로 HTTP 요청을 보내는 방법입니다. 포트원 등 결제 대행사로부터 직접적으로 결제 결과를 받는 방식으로, 결제 후의 검증 및 데이터 처리를 자동화할 수 있습니다. 이를 통해 Django와 외부 API 간의 직접적인 통신 대신 이벤트 주도적인 처리를 할 수 있어 시스템이 더 유연해지고 확장성이 좋아질 수 있습니다.

추가로 도움이 될 수 있는 답변 확인하기:

  • 포트원 결제 payment_detail 이전 과정 문제: 이 사례에서는 장고와 포트원 결제 API 연동 시의 문제와 해결 방법들이 논의되었습니다. 관련 코드를 참고하여 비동기 처리나 webhook 설정을 검토할 수 있을 것입니다.

웹 개발에서 비동기 처리 방식 및 webhook 연동은 서비스 안정성과 확장성에서 매우 중요한 요소이므로, 실전 환경에서 이러한 기술들을 적용해 보시길 권장드립니다.

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

inspireworld님의 프로필 이미지
inspireworld

작성한 질문수

질문하기