ReadMe 작성

최길중·2026년 1월 22일

[Spring 3기] CH 2 커머스 과제

작성자: 최길중


설계 과정(구현 순서)

이 프로젝트는 "메인화면(카테고리 선택) → 상품 선택/수량 입력 → 장바구니 확인 → 주문 확정" 흐름을 기준으로
필요 기능부터 역순으로 쌓는 방식으로 설계했습니다.


1. 도메인(데이터) 설계

Product

  • 목표: “상품”이 가져야 할 최소 정보 정의
  • 필드: id, productName, price, description, inventory
  • 핵심: 재고 변경이 필요하므로 setInventory() 제공

Category

  • 목표: 카테고리 안에 상품들을 묶어서 관리
  • 필드: id, name, List<Product> products
  • 기능: addProduct()로 카테고리에 상품 등록

Customer

  • 목표: 고객의 누적 구매금액 기반 등급 시스템 구현
  • 필드: totalAmount
  • 핵심: 등급은 저장하지 않고 getRating()에서 실시간 계산(계산형 메서드)

2. 장바구니 설계(수량 표현 방식 결정)

shoppingBasket

  • 구조: List<Product> 기반 장바구니
  • 수량 표현: 같은 Product 객체를 quantity만큼 리스트에 반복 저장
  • 필요 기능 정의
    • addShoppingBasket(product, quantity) : 수량만큼 add
    • getOverLab() : 장바구니에서 중복 제거된 상품 목록(한 종류씩만)
    • getCount(product) : 특정 상품이 장바구니에 몇 개 담겼는지 카운트
    • printBasketItems() : 상품별로 묶어서 수량 출력
    • getTotalPrice() : (가격 × 수량) 합산
    • Basketclear() : 주문 확정 후 장바구니 초기화

3. 시스템(흐름) 설계

CommerceSystem

  • 역할: 입력/출력/분기(메인 → 카테고리 → 장바구니)를 담당하는 컨트롤러
  • 핵심 흐름(3단 구성)
    • 메인 화면: printMain() + 카테고리 선택 + 장바구니 메뉴
    • 카테고리 화면: categoryProduct()에서 상품 선택/수량 입력/장바구니 담기
    • 장바구니 화면: 내역/총액 출력 + 주문 확정

4. 주문 확정 처리 설계(처리 순서 고정)

주문 확정은 아래 3가지 처리가 반드시 필요하다고 판단해 순서를 고정했습니다.

  1. 총 주문금액을 고객 누적 금액에 반영
    • customer.addOrderAmount(total)
  2. 장바구니 수량 기준으로 상품 재고 차감
    • systemDeductStock()
  3. 주문 완료 후 장바구니 비우기
    • basket.Basketclear()

5. 예외/검증 설계(입력 안정성)

  • 없는 카테고리 번호 입력 방지: categoryId()에서 null 처리
  • 없는 상품 번호 입력 방지: 상품 탐색 후 null 처리
  • 재고보다 많은 수량 입력 방지: 수량 입력 루프에서 재입력 처리

6. 테스트 관점(콘솔 시나리오)

  • 카테고리 선택 → 상품 선택 → 수량 입력 → 장바구니 확인 → 주문 확정
  • 주문 확정 후 메인으로 돌아왔을 때 등급 출력이 누적 금액 기준으로 변경되는지 확인
  • 주문 확정 후 해당 상품 재고가 감소했는지 카테고리 화면에서 확인

7. 등급별 할인율 적용(결제 전 등급 기준)

할인 정책

  • BRONZE: 0%
  • SILVER: 5%
  • GOLD: 10%
  • PLATINUM: 15%

적용 방식

  • 고객 등급은 totalAmount(누적 구매금액)을 기준으로 getRating()에서 실시간 산정합니다.
  • 할인율도 동일 기준으로 getDiscountRate() / getDiscountPercent()에서 계산합니다.
  • 주문 확정 시 결제 전 등급을 먼저 스냅샷으로 고정한 뒤, 해당 등급의 할인율로 할인 금액을 계산합니다.
  • 이후 결제가 완료되면 addOrderAmount()로 누적 금액이 증가하며, 변경된 등급은 다음 주문부터 적용됩니다.

할인 금액 계산(예시)

  • 할인 후 금액 = 할인 전 총액 × (1 - 할인율)
  • 소수점 처리를 위해 Math.round()로 반올림하여 정수 금액으로 출력합니다.

한 줄 요약

최길중의 커머스 시스템: 카테고리별 상품 선택 → 장바구니 담기 → 주문 확정(누적금액/등급 반영 + 재고 차감)

profile
개발자가 되고 싶어요

0개의 댓글