본문 바로가기

TIL

결제실패 시 재고 원상복구 시스템 만들어보기

과제에서 요구한 기능을 모두 만들고 추가적으로 만들어보고 싶은 기능이 있어서 만들어보았습니다.

 

지금 플로우에선

1. 고객이 물건을 주문 요청을 합니다.

2. 요청 들어온 주문이 실제로 남아있는지 확인합니다.

3. 주문을 생성(재고 반영) 을합니다.

4, 결제를 진행합니다 

 

이런 플로우를 가지고있는데, 여기서 저는 3번과 4번 순서를 고민을 했었는데, 여기서 만약 3번과 4번 사이에 문제가 발생하여서 뒤에 플로우가 망가진다면, 재고반영의 경우 누락이있다면 내부적으로 처리 할 수 있는 문제이지만, 고객에게 결제는 진행이 되었는데 주문이 생성되지 않아서 누락이된다면, 고객이 컴플레인 하기 전까지 내부적으로 어떤 문제가 있는지 파악 할 수 없을 것입니다.

그렇기 때문에 저런 플로우로 프로그램을 설계하였고, 

만약 고객이 중간 이탈, 결제 금액 부족 등의 사유로 결제가 실패했을때, 재고를 자동으롤 원상복구 시켜주는 시스템이 필요하다고 생각했습니다.

 

1. 먼저 일종의 로깅 기능을하는 구매 클래스를 만들어 줍니다. 각각의 고유한 아이디를 만들고, 제품 Id와 주문 갯수를 hash로 들고있습니다. 또한 해당 결제의 총 금액을 들고 있습니다.

상태는 3가지 상태만 주었습니다.

PENDING("결재 요청"),
COMPLETED("결재 완료"),
CANCEL("결제 취소");

이걸 이제 시스템에서 ArrayList로 사용해줄것입니다.

ArrayList<Purchase> purchase;

 

DB업데이트가 성공적으로 이루어졌으면, 

구매 객체를 만들고 로그를 하나 생성해주고,

고객이 하나라 getLast하는게 조금 짜치지만...

성공하면 상태를 업데이트 해줍니다.

purchase.getLast().completePurchase();

실패시 재고를 원상복구하는 시스템을 동작합니다. 그럼 이제 고객이 결제를 실패해도, 재고가 정상적으로 복구 되는것을 확인 할 수 있습니다,

 

추가 고려사항

작성하다보니 여러가지 추가적으로 고려해볼 사항들이 생각이났습니다. 

 

1. 재고반영, 주문, 결제, 다 다른 도매인으로 분리하면, 결제가 완료된 후 주문요청이 완료되었다면, 재고반영을 시키는 방식으로한다면, 이런 복구시스템에 리소스를 사용할 필요는 없지않을까? 하는 생각을했습니다.

 

2. 구매를 고객에서 진행하는게아닌, 구매클래스에서 진행하고 주문 클래스와 분리를 해야한다