spring_2기[본캠프]/과제

[과제] 결제 시스템 Day1

minwoo95 2026. 2. 4. 21:27

오늘 과제 발제를 시작으로 팀원들이 모여 과제 요구사항을 정리할려고 하였으나, 

 

4명중 2명의 컨디션 난조로 2명이서 시퀀스 다이어그램과 간단하게 정리 먼저 진행 하였다.

 

내용이 많아서 우선,

결제를 성공할때와 환불을 할때 2가지의 경우로 시퀀스 다이어그램으로 작성하고

그외 단순 조회 사항들은 디테일 요구사항을 정리하여 역할 분담을 진행하기로 결정하였다.

 

아직 아래 요구사항은 시간부족으로 완벽히 정리는 하지 못하였다.

 

요구사항

  • 상품 (조회 중심 상품 생성/수정/삭제는 없음)
  1. 상품 목록 조회 (결제 가능한 상품 목록을 조회) (상태에 따라 바뀜)
  2. 상품 단건 조회 (결제 화면/결제 요청 구성에 필요한 상품 상세 정보를 조회)

 

엔티티 : 상품 (ID, 상품명, 판매가, 재고, 설명, 상태, 카테고리)



  • 주문 (주문 수정/삭제 제외)
  1. 주문 생성 (장바구니 테이블 별도로 만들지 X) - 주문 생성 시점에 주문 상태는 결제 대기
  2. 주문 상세 조회 (주문 정보 + 주문 상품 + 결제 상태 + 포인트 사용/적립 요약)
  3. 주문 상태 관리
  • 결제 대기 : 주문은 생성되었지만 결제가 아직 이루어지지 않음
  • 주문 완료 : 결제가 성공적으로 완료되어 주문 확정
  • 환불 : 결제 금액이 환불된 상태

 

엔티티 : 주문 (ID, 사용자ID, 주문번호, 주문 총액, 상태, 주문일), 주문 상품 (ID, 주문ID, 상품ID, 상품명, 상품가격, 수량)





2.인증 기능 요구사항

-Spring Security + JWT로 보호된 API에 인증/인가를 구현

(결제/환불/포인트/구독 등 권한이나 소유권을 판단하여 접근 할수 있도록)

1.별도의 공통 패키지에 Spring Security / JWT를 구현

2.회원가입

-중복 이메일 불가

-패스워드 8자 이상

-이름,전화번호,이메일은 필수

-회원가입 실패시 실패이유 응답

-회원가입 성공시 성공 응답

3.로그인

-이메일+패스워드로 로그인 시도

-로그인 실패시 실패 응답

-로그인 성공시 성공 응답

4.토큰발급

-로그인이 성공하였다면, 토큰을 발급

-이후 인증인가에 해당 토큰을 활용

-토큰(사용자 ID,발행시간,만료시간)<-튜터님 질문

 

엔티티 :  User(이름,전화번호,이메일)

 

내 주문/내 결제/내 포인트과 같은 기능은 소유권 기반/처리가 가능 해야한다.

 

 

 

3.PortOne 기반 일반 결제 기능 구현

핵심 요구사항

1.PG사 -> KG이니시스 + 토스페이먼츠

2.외부PG사 기본 카드 결제 흐름 완성하고나서 -> 복합결제(포인트,맴버십,구독 )구현

3.주문과 결제의 역할분리

4.서버가 결제 확정,취소,재고반영 최종 책임자

 

KG이니시스 일반/정기결제 V2 결제 모듈 기반의 카드 결제 흐름만 구현

->부분 환불 제외 전액환불만 구현

 

전체결제 흐름<-튜터님 트랜젝션을 어떤 조건을 고려하여 나누면좋을지

결제시작->주문생성->결제진행->결제창 호출직후 결제시도 시작기록->결제 결과 전달




 

유스케이스

 

회원가입

로그인

인증/인가

 

사용자가 결제를 할때

트랜젝션1[주문생성->(transaction) 재고 확인 및 차감 (transaction 종료)]=>장바구니 상품을 담았다 

트랜젝션2[결제 API 호출->(transaction)] =>결제하기 버튼을 눌렀다

트렌젝션3[주문 상태를 COMPLETED로 변경 (transaction)]=>서버에서 주문상태를 결제완료로 변경->DB에 반영한다

 

실패시 : 트랜젝션4[재고를 +1 시켜 되돌리는 것으로 마무리]

 

이유: 결제 성공, 재고 확인 및 차감 실패시 결제 성공은 외부 서비스 호출하므로 롤백이 불가능. 외부 서비스가 트랜잭션안에 포함이 안되므로 트랜잭션이 짧아서 성능상 유리?



사용자가 환불을 할때




상품목록

내등급조회

등급정책조회

주문내역조회

주문내역상세조회



1차 플로우->2차 플로우간 필요한 기능 정리 및 디테일 요구사항->3차 시퀀스다이어그램

 

인증/인가

토큰(사용자 ID,발행시간,만료시간)<-튜터님 질문(누구인지 식별만 가능하면된다)

토큰에 맴버쉽을넣어 맴버쉽 조회에 활용하고 결제는 디비 접근으로 사용

 

상품

-

 

주문

-

 

결제

 

환불

1.결제가 완료인 상태만 환불이 가능

2.결제시 사용된 포인트는 복구 적립된 포인트는 취소

3.총결제 금액에 따른 맴버쉽 등급을 갱신

4.주문상태 환불

5.결제상태 환불 완료

환불 테이블[내역 작성]

 

 

주문내역조회->환불요청->PG사 결제취소 확인->해당 주문내역과 연관된 적립 포인트를 취소 및 사용포인트 반환



포인트

1.사용자,주문 pk를 가진 포인트 내역 테이블 생성 별도관리

2.결제가 성공하였을때, 포인트 적립을 확정->주문pk랑 포인트내역을 기록

3.환불시 해당 주문내역과 매칭되는 포인트 기록을 -마이너스 하는것

4.결제시에 포인트 만료일자가 설정되어야 한다.(만료시 포인트 소멸

맴버십

1.총결제금액 기준 맴버쉽 등급 결정

2.등급별 포인트 적립 % 차등 설정

3.내 현제 등급 조회

4.등급 정책 조회

 

 

 

튜터님 피드백  : 맞다 틀리다의 내용보다는 사용자에게 어떻게 서비스를 제공할지와 어떻게 플로우를 계획하냐의 따라 간결하게 나아갈수 있는지, 외부 API 사용시 어떤값이 필수값인지, 트랜젝션 분리를 어떻게 할지에 대해 집중해라 라고 피드백을 주셨다.

 

우선, 내일 팀원이 모이는데로 팀명부터 차근차근 정리하여 작성한 시퀀스다이어그램에는 포인트 내용도 추가하여 완성하고,

 

환불시에 대한 로직을 완성해야겠다.

 

내일부터 화이팅! ㅠㅠ