inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Hướng dẫn hoàn hảo về các mẫu thiết kế microservice

pg사가 있다고 가정하면

78

goyangee

26 câu hỏi đã được viết

0

 안녕하세요.

강의를 보고 있는 개발자입니다.


질문이 있어 문의드립니다.


만약 pg사 연동이 들어간다고 가정하면 어떤 식으로 사가를 구성해야할까요?

주문서버, 결제서버, 재고서버가 있다고 가정하면


대략적인 결제 흐름이 대부분 아래와 같을텐데

  1. 장바구니에서 구매하기 누르면 주문서페이지로 감

  2. 주문서 페이지에서 쿠폰 등을 선택하고 결제하기를 누르면 pg결제창이 뜸

  3. pg결제를 하면 결제 승인 api를 서버가 호출


아래와 같이 해도 되나요.

  1. 장바구니에서 구매하기 누르면 주문서버에 주문서를 생성

  2. 주문서페이지에서 결제하기 누르면 주문서를 검증하고 임시결제 생성 및 pg사 url 생성 (주문서버 -> 결제서버 -> pg사 동기식으로 호출 해야할 거 같음)

  3. pg결제가 승인되면 결제서버의 결제 승인 api 호출 (임시결제를 결제완결상태로 만들고 pg사의 승인 api 호출)

  4. 결제 완료되면 결제 완료 이벤트 발행하여 재고 줄인다.



    제가 생각하기에 pg사 결제 url 만드는 2번이 주문서버 -> 결제서버 동기식으로 호출하는게 맞는게 아닌가 싶어서 저렇게 했는데 혹시나 비동기로 할수 있는 방법이 있을까요?


아니면 제가 생각한 방식말고 다른 방식이 있을까요?

강의에서는 pg사 관련된 내용이 안나와 궁금하여 질문드립니다.

java spring-cloud 디자인-패턴 msa patterns

Câu trả lời 2

0

Dowon Lee

안녕하세요, 이도원입니다.

답변이 늦어 죄송합니다. 지금이라도 문의하신 내용에 대한 추가 답변이 되었으면 하는 마음에 글 남깁니다.
말씀하신 내용은 PG 결제 처리부분에 있어 전체적인 방향은 맞습니다. 다만 PG 연동이 들어가는 경우에는 Saga를 단순히 “결제 완료 → 재고 차감”으로 보기보다는, 주문·재고·결제의 상태를 각각 관리하고 실패 시 보상할 수 있도록 구성하는 것이 좋습니다.

우선 질문하신 2번의 주문서버 → 결제서버 호출은 동기식으로 처리해도 전혀 문제가 없습니다.

사용자가 결제하기 버튼을 누른 뒤 PG 결제창을 바로 받아야 하기 때문에,

Client → 주문서버 → 결제서버 → PG 결제 준비 API

구간은 일반적인 Request/Response 흐름으로 보는 것이 자연스럽습니다. 결제를 시작하기 전에는 동기 요청 흐름을 처리하시고, 그 이후에는 아래와 같이 Saga 처리를 위한 일관성 관리가 중요합니다.
예를 들어,

1. 주문 생성
   주문 상태 = PENDING

2. 재고 예약
   재고 서버에서 실제 차감보다는 RESERVED 상태로 일정 시간 확보

3. 결제 준비
   주문 서버 → 결제 서버 동기 호출

   결제 서버:
   - Payment 생성
   - 상태 = READY
   - PG 결제 준비 API 호출
   - paymentId / redirectUrl 반환

4. 사용자가 PG에서 결제

5. PG 결제 인증 완료
   PG → callback/redirect → 서버

6. 결제 서버가 PG 승인 API 호출

7. 승인 성공
   Payment = PAID
   PaymentCompleted 이벤트 발행

8. 주문 서버
   PaymentCompleted 수신
   Order = PAID 또는 COMPLETED

9. 재고 서버
   예약된 재고를 실제 판매 확정
   RESERVED → CONFIRMED

위 예시와 같은 흐름으로, Saga 관점에서는 실패 시 보상 트랜잭션도 같이 설계해야 합니다.

추가로, Saga라고 해서 모든 서비스 호출을 비동기 이벤트로 만들어야 하는 것은 아닙니다.

2번의 주문서버 → 결제서버 동기 호출은 잘못된 것이 아니고 오히려 적절하다고 볼 수 있습니다.


추가 문의사항 있으시면 다시 글 남겨 주세요.

감사합니다.


0

communityai8509

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

김재연님께서 마이크로서비스 아키텍처에서 PG사 연동을 구성하는 방법에 대해 문의해주셨습니다. 제공해주신 결제 흐름 및 아키텍처는 전형적인 결제 시스템의 동작이라 할 수 있습니다. 아래 내용은 귀하의 질문에 대한 제안입니다.

  1. 동기 vs 비동기 호출: 주문서버에서 결제서버로 PG사의 URL을 생성하는 과정에서 동기 호출을 사용하는 것이 일반적입니다. 동기 호출은 결제 요청 완료 후 즉시 응답을 기다리므로 처리 결과를 바로 확인할 수 있습니다. 그러나, 비동기 호출을 사용하여 더 나은 확장성과 성능을 제공할 수도 있습니다. 예를 들어, 주문서버에서 결제 요청을 메시지 큐에 넣고, 결제서버가 이를 비동기로 처리하여 결과를 이벤트로 발행할 수 있습니다.

  2. 비동기 처리를 위한 방법: 비동기 방식으로 결제 프로세스를 처리하고자 한다면, 메시징 시스템(예: Kafka, RabbitMQ 등)을 사용할 수 있습니다. 이렇게 하면 결제서버는 주문서버로부터 비동기 메시지를 받고 처리하게 됩니다. 결제 승인 후에는 이벤트를 발행하여 다른 서비스(예: 재고 서버)가 이를 구독하고 적절히 반응할 수 있습니다.

  3. 다른 고려 사항: 현재의 흐름에서 추가로 고려할 사항은 데이터를 일관성 있게 유지하기 위한 방법입니다. 예를 들어, SAGA 패턴을 사용하여 트랜잭션 간의 일관성을 유지하거나, 이벤트 소싱을 도입하여 상태 변화와 이벤트를 기록할 수 있습니다.

이러한 방식을 통해 진행하시면 확장 가능하고 유지보수하기 용이한 시스템을 구축하실 수 있을 것입니다. 프로토타입으로 구현 후 부하 테스트 등을 통해 최적의 아키텍처를 찾아보시는 것을 추천드립니다. 추가적인 설명이 필요한 경우, 구체적인 샘플 코드나 가이드를 검토해 보시길 바랍니다. 더 많은 정보는 Spring Boot 문서에서도 찾으실 수 있습니다.

도움이 되셨길 바랍니다. 감사합니다.

배열 포인터 출력 표시

0

26

1

포인터 증감 또는 값 증감

0

24

1

배열 포인터 함수 관련

0

26

1

EmailSender 관련 문의

0

24

1

실기 이론 통합 요약본 버전

0

28

1

업캐스팅 3번 문제 예시

0

34

2

구글드라이브 접속 불가

0

38

2

2024년2회15~20

0

36

1

낙관적락 질문있습니다.

0

43

1

push pop 설명 되어있는 강의가 몇강인가요?

0

47

1

댓글순서부여방식

0

43

1

유비쿼터스 언어와 class name

0

40

1

movablePageCount와 pageSize 상수

0

36

1

읽기 모델을 조회 최적화하여 성능 향상 하는 방법

0

128

2

Orders에 테이블의 용도

0

109

2

MSA 아키텍쳐 프로젝트 구성 방식

0

165

2

마이크로서비스와 모듈러 아키텍처 선택 질문

0

126

2

섹션 2 - 12강 강의 제목 관련 질문있습니다.

0

109

1

실습 환경 구축에 대한 질문

0

106

2

k8s 를 고려한 개발은 어떻게 진행하나요?

0

147

2

gPRC 와 서비스 디스커버리에 대해 질문드립니다.

0

140

2

일부 강의가 재생이 되지 않습니다

0

162

2

https://github.com/joneconsulting/eshop 소스

0

198

2

강의 pdf교재는 별도로 없나요?

0

187

1