[구현 & 테스트] 구매 관련 기능 백엔드 구현

Terry Ahn·2023년 6월 9일
0

시작하며,

실제로 동작하는 화면을 캡쳐해서 넣고싶었지만 서버 대여가 만료되어서 당장 sql문도 백업안해두어서 사진을 첨부할수가 없습니다. 미안합니다 ㅠㅠ 크흡... 꼭 로컬 환경에서도 돌릴수 있게 백업을 잘해둡시다...


구매 관련 기능 조건들 정리하기

  • 해당 티켓을 이미 구매했다면 중복구매 ❌
  • 정원을 초과해서 구매가 이루어지면 안됨 ❌
  • 결제 과정중에 있다면 해당 티켓에 대해 새로운 구매 불가능 ❌
  • 사용자 경험을 위해 남은 티켓수 보다 더 많은 결제 인원이 발생하지 않아야함 ❌

    ex
    정원이 5명인 모임의 티켓이 4장 팔렸고 마지막 1장을 누군가 구매중이라면 새로운 구매가 일어나지 못하고 "다른 사용자가 결제 진행중입니다." 라는 문구가 나오게 해야함. 영화 티켓 예매할때 해당 좌석이 선점되는 것처럼 구현하고 싶었다.

  • 결제가 성공한다면 모임 주최자(판매자)에게 결제 금액이 전달되어야함. ✅
  • 결제가 성공한다면 해당 모임의 멤버에 등록되고 해당 모임의 정원에 카운트 되어야함 ✅
  • 결제가 성공했다면 해당 티켓을 발급 받고 더이상 구매를 진행하지 못해야함. 구매버튼이 구매완료 라고 문구가 바뀌고 비활성화✅

해결방법

구매 과정을 ORDER 테이블에 기록하기.
주문번호에 주문자, 주문한 모임 을 담기.
티켓번호에 주문자, 주문한 모임 을 담기.

주문자 = 회원 번호, 주문한 모임 = 모임번호

OrderDo

ORDER table

주문번호주문자 회원 번호모임 번호주문 일자주문 상태주문 가격대금 수령 상태
yymmdd/moimNum(8자리)/userIdNum(8자리)userIdNummoimNumyymmdd:hhmmss"결제 진행중", "결제 완료", "결제 취소"orderPrice"수령", "미수령"

백엔드 로직

주문이 가능한지 판별하기

  1. 정원이 다 찾는지 판별하기/ moim 정보를 db에서 조회해서 정원 - 참가한 멤버 수 비교 하기
  2. 아니라면, order 테이블에서 주문상태가 결제 진행중인 주문 목록의 수를 불러와서 남은 정원수와 비교하기

주문 진행하기

  1. 구매 버튼을 누르면 orderDo 주문객체가 생성된다. [주문 번호]주문 날짜 + 구매하려는 모임번호 + 구매자의 회원 번호 이다.
    주문상태는 결제 진행중 이다.

  2. order 테이블에서 [주문번호] 를 통해 구매하려는 모임번호 + 사용자 회원 번호 조합이 일치하는 행이 있는지 검색해서 중복검사를 진행한다. 중복이 있다면 주문상태가 결제 취소 로 바뀌고 종료된다.

  3. 중복이 없다면 orderDo를 order테이블에 저장한다.

  4. 모달로 아임포트 결제 api가 실행.

case 1)주문 취소

  1. 주문 상태가 결제 취소 이면 order 테이블에서 해당 행을 삭제한다.
  2. 만약 모달 화면을 벗어나면 주문 상태가 결제 취소로 바뀐다.
  3. 결제 취소 버튼을 누르면 주문 상태가 결제 취소로 바뀜.

case 2)결제 완료

  1. 결제가 완료되면 주문 상태가 결제 완료로 바뀐다.
  2. ticketDo가 생성되어 ticket 테이블에 등록.
  3. 대금 테이블에 모임 주최자의 대금 수령 금액이 업데이트됨.

결제 관련 코드

누르시면 해당 코드 깃허브 페이지로 이동합니다.

데이터 클래스
OrderDo
TicketDo
ReceiptDo

서비스 클래스
OrderService
TicketService
ReceiptService

컨트롤러 클래스
TicketController
BuyPageController

매퍼 인터페이스 클래스
OrderMapper.java / interface
TicketMapper.java / interface
ReceiptMapper.java / interface

매퍼 마이바티스 파일
OrderMapper.xml
TicketMapper.xml
ReceiptMapper.xml


마치며,

오늘 글은 정말 쓰면서 아쉬웠습니다. 구현한 이미지를 꼭 캡쳐해서 넣고싶었는데... 설명도 좀 아쉬웠던것 같네요
구매 기능을 db에 상태를 등록하고 조회를 통해 구현했지만 개인적으로는 좋은 방법 같진 않습니다. 자잘한 db연결이 너무 많아서 db에 부담도 많고 접속이 많을 수록 돈을 많이 낸다고 합니다. ! db 연결을 최소화해서 해당 기능들을 구현할 수 있도록 더 고민을 해봐야할거같네요

profile
Just Code It!

0개의 댓글