다양한 할인으로 발생한 사용자들의 대량 주문 트래픽에 대해 안정적인 서비스를 제공하는 경험을 해보고자 시작한 쿠폰/세일 중심 프로젝트입니다.
사이버 먼데이는 연휴가 끝난 후 일상생활에 복귀한 소비자들에게 온라인으로 물건을 구매하도록 독려한 데서 나왔습니다. 이 서비스는 월요일에 몰려드는 사용자들에 앞서 주문에 대해 빠르고 정확한 피드백을 받도록 안정적인 서비스를 제공하는 것이 목표입니다.
- 홈 화면에서 회원가입 버튼을 누른다
- 카카오로 가입할 수 있도록 버튼 목록이 보인다
- 카카오로 로그인 버튼을 클릭한다
- 클릭한 뒤 나오는 인증 화면을 통해 소셜 로그인 인증을 마친다
- 회원 가입이 완료되면 자동으로 로그인 처리되고 홈으로 이동한다
- 홈에서 로그인 버튼을 누른다
- 로그인 버튼을 클릭하면 카카오, 네이버, 구글로 로그인할 수 있도록 각각의 버튼 목록이 보인다
- 본인이 가입한 소셜 로그인 버튼을 클릭한다
- 소셜 로그인 인증 후 로그인한다
- 로그인 처리되고 홈으로 이동한다
- 앱 화면 오른쪽 위에 있는 마이 페이지 버튼을 클릭한다
- 인증된 아이디, 적립금, 다운로드했던 쿠폰들, "주문내역" 메뉴를 확인한다
- 앱 화면 오른쪽 위에 있는 마이 페이지 버튼을 클릭한다
- "회원탈퇴" 버튼을 눌러 서비스를 탈퇴한다
- 홈 화면으로 들어간다
- 브랜드별로 전시된 상품들이 보여진다
- 진열된 상품들 중 하나를 클릭하여 상세 화면으로 들어간다
- 상세 화면에서는 해당 상품의 가격/재고/쿠폰 정보를 확인할 수 있다
- 기본 가격은 정가로 표시된다
- 만약 상품의 재고가 없다면 장바구니/구매하기 대신 "품절"이라는 비활성화된 버튼을 볼 수 있다
- 홈에서 원하는 상품을 클릭하여 상세 화면으로 들어간다
- 만약 상품의 재고가 없다면 품절로 보인다
- 품절 상태의 상품일 시 장바구니 담기에 실패한다
- 상품 상세 화면에서 "장바구니 담기" 버튼을 클릭한다
- 원하는 개수만큼 추가한 뒤 담기 버튼을 클릭한다
- "물건이 장바구니에 담겼습니다." 라는 안내가 뜨고, 장바구니 화면으로 들어갈 수 있는 링크가 뜬다
- 링크를 클릭하여 장바구니 화면으로 들어간다
- 장바구니에 담긴 물건을 선택해서 "장바구니에서 삭제" 버튼을 클릭한다
- 홈 화면에서 마이페이지 옆에 있는 장바구니 버튼을 클릭하여 장바구니 화면으로 들어간다
- 장바구니에 담긴 물건을 확인한다
- 취소하고자 하는 물건을 선택해서 "장바구니에서 삭제" 버튼을 클릭한다
- 홈에서 상품을 클릭해 상품 상세 화면으로 들어간다
- 상품 상세 화면에서 발급된 쿠폰을 다운로드한다
- 만약 해당 쿠폰을 이미 다운로드 받았거나 다운로드받으면 다운로드 버튼이 비활성화되며, 사용할 때까지 쿠폰을 다운로드 받을 수 없게 된다
- 브랜드 전용 쿠폰을 계정당 최대 1개 받을 수 있다
- 쿠폰을 사용했다면 다시 새로 받을 수 있다
- 홈에서 보이는 브랜드 목록 중 한 곳으로 들어간다
- 들어가면 브랜드 소개 페이지 화면과 함께 다운로드 받을 수 있도록 브랜드 전용 쿠폰이 보인다
- 브랜드 전용 쿠폰을 다운로드 받는다
- 만약 해당 쿠폰을 이미 다운로드 받았거나 다운로드받으면 다운로드 버튼이 비활성화되며, 사용할 때까지 쿠폰을 다운로드 받을 수 없게 된다
- 브랜드 전용 쿠폰을 계정당 최대 1개 받을 수 있다
- 쿠폰을 사용했다면 다시 새로 받을 수 있다
- 홈에서 일정 기간에 나오는 프로모션 소개 페이지로 들어간다
- 끝난 프로모션은 "해당 프로모션은 종료됐습니다"라고 안내를 받는다
- 끝난 프로모션은 쿠폰을 다운로드할 수 없다
- 프로모션 소개 아래에는 쿠폰을 다운받을 수 있는 버튼이 보인다
- 만약 이미 다운로드 받은 쿠폰이라면 버튼은 비활성화된다
- 쿠폰의 전체 수량이 모두 소진된 경우에는 버튼이 "소진됨" 상태로 표시된다
- 쿠폰을 다운로드 받는다
- 프로모션 쿠폰의 수량은 한정적이어서, 다 소진되면 쿠폰을 못 받을 수 있다
- 프로모션 쿠폰을 다운받으려 할 때 순간 쿠폰이 소진되었다면 "쿠폰이 소진되었습니다"라는 안내창이 보이며, 쿠폰이 다운로드되지 않는다
- 쿠폰 다운로드 버튼은 "소진됨" 상태로 표시된다
- 쿠폰이 다운로드되면 "쿠폰을 성공적으로 받았습니다"라는 안내창이 보인다
- 홈에서 원하는 상품의 상세 화면으로 들어간다
- "구매하기" 버튼을 누른다
- 원하는 개수만큼 수량을 선택한다
- "주문하기" 버튼을 눌러 주문 화면으로 들어간다
- "주문하기" 버튼을 누르면 재고를 확인하고, 재고가 충분하면 주문 화면으로 이동하며 해당 수량이 5분간 예약된다
- 재고가 충분하지 않다면 "상품의 재고가 부족합니다"는 안내와 함께 상품 상세 화면으로 리다이렉트 된다
- 주문 화면 진입 후 5분 내 결제가 완료되지 않으면 주문 진행이 취소된다
- 주문 진행이 취소되면 예약이 해제되고 상품 상세 화면으로 이동하며, 예약된 수량은 다시 구매 가능 상태가 된다
- "주문하기" 버튼을 누르면 재고를 확인하고, 재고가 충분하면 주문 화면으로 이동하며 해당 수량이 5분간 예약된다
- 주문 화면에서 배송 정보를 입력한다
- 주문 전체에 적용할 쿠폰 1개를 선택해 적용한다
- 프로모션, 브랜드별 쿠폰을 종합하여 최대 1개만 선택할 수 있다
- 다른 쿠폰을 선택해서 적용할 쿠폰을 바꿀 수 있다
- 적립금을 사용하여 총구매 가격을 낮춘다
- 적립금은 5천 원부터 사용할 수 있다
- 적립금은 쿠폰 적용 후 최종 결제금액의 10%까지만 사용할 수 있다
- 10% 이상을 넘기는 금액이면 "적립금은 최대 총 금액의 10%까지만 적용 가능합니다"는 안내가 나온다
- 이 안내가 나오면 적립금을 다시 적용해야 한다
- 적립금은 최대 적용하기 버튼을 누르면 최종 결제금액의 10%까지 할인한 금액이 계산되어 화면에 적용된다
- 결제 방법을 선택하고 '결제하기'를 누르면 결제 화면으로 이동하여 결제를 진행한다
- 결제 방법에는 카드 결제, 퀵계좌이체 중 하나를 고를 수 있다
- 결제를 완료하고 결제 완료 화면으로 넘어간다
- 결제에 사용했던 쿠폰, 적립금이 사용된다
- 결제한 총금액의 5%만큼 적립금이 쌓인다
- 마이 페이지 주문내역에 해당 주문 정보와 함께 "주문완료"상태의 데이터가 쌓인다
- 장바구니 버튼을 클릭해 장바구니로 들어간다
- 장바구니에 담긴 물건의 개수를 원하는 만큼 조절한다
- 장바구니에서 원하는 물건을 선택한다
- "주문하기" 버튼을 클릭하여 주문 화면으로 들어간다
- "주문하기" 버튼을 누르면 재고를 확인하고, 재고가 충분하면 주문 화면으로 이동하며 해당 수량이 5분간 예약된다
- 재고가 충분하지 않다면 "상품의 재고가 부족합니다"라는 안내와 함께 상품 상세 화면으로 리다이렉트 된다
- 주문 화면 진입 후 5분 내 결제가 완료되지 않으면 주문 진행이 취소된다
- 주문 진행이 취소되면 예약이 해제되고 장바구니 화면으로 이동하며, 예약된 수량은 다시 구매 가능 상태가 된다
- "주문하기" 버튼을 누르면 재고를 확인하고, 재고가 충분하면 주문 화면으로 이동하며 해당 수량이 5분간 예약된다
- 주문 화면에서 배송 정보를 입력한다
- 주문 전체에 적용할 쿠폰 1개를 선택해 적용한다
- 프로모션, 브랜드별 쿠폰을 종합하여 최대 1개만 선택할 수 있다
- 다른 쿠폰을 선택해서 적용할 쿠폰을 바꿀 수 있다
- 적립금을 사용하여 총구매 가격을 낮춘다
- 적립금은 5천 원부터 사용할 수 있다
- 적립금은 쿠폰 적용 후 최종 결제금액의 10%까지만 사용할 수 있다
- 10% 이상을 넘기는 금액이면 "적립금은 최대 총 금액의 10%까지만 적용 가능합니다"는 안내가 나온다
- 이 안내가 나오면 적립금을 다시 적용해야 한다
- 적립금은 최대 적용하기 버튼을 누르면 최종 결제금액의 10%까지 할인한 금액이 계산되어 화면에 적용된다
- 결제 방법을 선택하고 '결제하기'를 누르면 결제 화면으로 이동하여 결제를 진행한다
- 결제 방법에는 카드 결제, 퀵계좌이체 중 하나를 고를 수 있다
- 결제를 완료하고 결제 완료 화면으로 넘어간다
- 결제에 사용했던 쿠폰, 적립금이 사용된다
- 결제한 총금액의 5%만큼 적립금이 쌓인다
- 마이 페이지 주문내역에 해당 주문 정보와 함께 "주문완료"상태의 데이터가 쌓인다
- 마이페이지로 이동한다
- 마이페이지에서 "주문내역" 버튼을 눌러 주문 내역 화면으로 이동한다
- 주문 완료/취소된 내역들이 보인다
- 마이 페이지로 이동한다
- 마이페이지에서 "주문내역" 버튼을 눌러 주문 내역 화면으로 이동한다
- 취소하길 원하는 주문 내역을 "주문취소" 버튼을 클릭하여 주문을 취소한다
- 주문 취소는 "주문완료" 상태에서만 가능하다
- 해당 주문 내역 상태는 "주문취소"로 변경된 것을 확인한다
- 해당 결제 금액도 결제했던 계좌로 반환되며, 사용했던 적립금과 쿠폰도 다시 반환된다
케이스마다 필요한 기능들을 중복을 허용한 패턴으로 분류했습니다. 약간의 체크리스트 형식으로 봐도 되겠습니다.
우선순위는 이 기능 구조도의 전역을 기준으로 우선순위를 매겨, 케이스마다 중복되는 번호가 나타납니다.
| CASE | 대분류 | 기능 | 우선순위 |
|---|---|---|---|
| 1 | 회원 | 소셜로그인 인증 | 1 |
| - | - | 인증 후 회원가입 처리 | 2 |
| - | - | 로그인 처리 | 3 |
| - | 프로모션 | 프로모션 목록 조회 | 4 |
| - | 브랜드 | 브랜드 목록 조회 | 7 |
| - | - | 브랜드 목록별 상품 조회 | 8 |
| 2 | 회원 | 소셜로그인 인증 | 1 |
| - | - | 로그인 처리 | 3 |
| 3 | 회원 | 인증된 아이디 조회 | 17 |
| - | - | 적립금 조회 | 18 |
| - | - | 소지한 쿠폰 조회 | 19 |
| 4 | 회원 | 인증된 아이디 조회 | 17 |
| - | - | 적립금 조회 | 18 |
| - | 쿠폰 | 프로모션 쿠폰 조회 | 34 |
| - | 쿠폰 | 브랜드 쿠폰 조회 | 19 |
| - | 회원 | 아이디 삭제(soft delete) | 40 |
| 5 | 프로모션 | 프로모션 목록 조회 | 4 |
| - | 브랜드 | 브랜드 목록 조회 | 7 |
| - | - | 브랜드 목록별 상품 조회 | 8 |
| - | 상품 | 상품 정보 조회 | 9 |
| - | 쿠폰 | 브랜드 쿠폰 정보 조회 | 6 |
| 6-1 | 상품 | 상품 정보 조회 | 9 |
| - | 쿠폰 | 브랜드 쿠폰 정보 조회 | 6 |
| - | 장바구니 | 장바구니에 상품 추가 | 27 |
| - | - | 장바구니 상품 조회 | 26 |
| - | - | 장바구니 상품 수량 변경 | 29 |
| - | - | 장바구니 상품 삭제 | 28 |
| 6-2 | 장바구니 | 장바구니에 상품 추가 | 27 |
| - | - | 장바구니 상품 조회 | 26 |
| - | - | 장바구니 상품 수량 변경 | 29 |
| - | - | 장바구니 상품 삭제 | 28 |
| 7-1 | 상품 | 상품 정보 조회 | 9 |
| - | 쿠폰 | 브랜드 쿠폰 정보 조회 | 6 |
| - | - | 브랜드 쿠폰 수량 검증 | 24 |
| - | - | 브랜드 쿠폰 다운로드 | 23 |
| 7-2 | 브랜드 | 브랜드 정보 조회 | 5 |
| - | - | 브랜드 목록별 상품 조회 | 8 |
| - | 쿠폰 | 브랜드 쿠폰 정보 조회 | 6 |
| - | - | 브랜드 쿠폰 수량 검증 | 24 |
| - | - | 브랜드 쿠폰 다운로드 | 23 |
| 7-3 | 프로모션 | 프로모션 정보 조회 | 34 |
| - | - | 프로모션 기간 검증 | 35 |
| - | 쿠폰 | 프로모션 쿠폰 정보 조회 | 38 |
| - | - | 프로모션 쿠폰 수량 검증 | 37 |
| - | - | 프로모션 쿠폰 다운로드 | 39 |
| 8-1 | 상품 | 상품 정보 조회 | 9 |
| - | 쿠폰 | 브랜드 쿠폰 정보 조회 | 6 |
| - | 주문 | 상품 재고 예약 | 10 |
| - | - | 예약 시간 검증 | 11 |
| - | - | 상품 예약 취소 | 12 |
| - | 쿠폰 | 사용가능 쿠폰 조회 | 22 |
| - | 회원 | 사용가능 적립금 조회 | 13 |
| - | 결제 | 결제 처리 | 14 |
| - | 쿠폰 | 쿠폰 사용 | 25 |
| - | 회원 | 적립금 사용 | 21 |
| - | - | 주문 완료 데이터 추가 | 15 |
| - | - | 적립금 적립 | 36 |
| 8-2 | 장바구니 | 장바구니 상품 조회 | 26 |
| - | - | 장바구니 상품 수량 변경 | 29 |
| - | 주문 | 상품 재고 예약 | 10 |
| - | - | 예약 시간 검증 | 11 |
| - | - | 상품 예약 취소 | 12 |
| - | 쿠폰 | 사용가능 쿠폰 조회 | 22 |
| - | 회원 | 사용가능 적립금 조회 | 13 |
| - | 결제 | 결제 처리 | 14 |
| - | 쿠폰 | 쿠폰 사용 | 25 |
| - | 회원 | 적립금 사용 | 21 |
| - | - | 주문 완료 데이터 추가 | 15 |
| - | - | 적립금 적립 | 36 |
| 9 | 회원 | 인증된 아이디 조회 | 17 |
| - | - | 적립금 조회 | 18 |
| - | - | 소지한 쿠폰 조회 | 19 |
| - | 주문 | 주문내역 조회 | 20 |
| 10 | 회원 | 인증된 아이디 조회 | 17 |
| - | - | 적립금 조회 | 18 |
| - | - | 소지한 쿠폰 조회 | 19 |
| - | 주문 | 주문내역 조회 | 20 |
| - | - | 주문 취소 | 30 |
| - | 결제 | 결제 취소 | 31 |
| - | 회원 | 쿠폰 반환 | 32 |
| - | - | 적립금 반환 | 33 |
- JDK 21
- Spring Boot 3.3.5
- Redis
- Kafka
- MySQL 8.4.7














