- 상품 및 프로모션 정보 로드
- products.md와 promotions.md 파일에서 상품 및 프로모션 정보를 불러온다.
- 상품 정보에는 상품명, 가격, 일반 재고, 프로모션 여부 등을 포함한다.
- 프로모션 정보에는 프로모션 기간, 적용 상품, 할인 정책(N+1) 등을 포함한다.
- 상품 및 프로모션 목록 출력
- 상품 및 프로모션 정보를 사용자가 쉽게 확인할 수 있도록 정렬하여 출력한다.
- 프로모션이 적용되지 않는 상품은 "재고 없음" 또는 일반 재고 정보만 출력한다.
- 프로모션 적용 가능 상품은 프로모션 조건과 함께 출력한다.
- 상품 선택 및 수량 입력 처리
- 사용자가 구매하려는 상품명과 수량을 입력받아 파싱한다.
- 입력 형식 검증 후, 잘못된 입력 형식이면 오류 메시지를 출력하고 다시 입력을 받는다.
- 구매 가능 여부 확인
- 각 상품의 재고가 충분한지 확인하고, 재고가 부족할 경우 오류 메시지를 출력한다.
- 프로모션 상품의 경우, 프로모션 재고가 부족하면 사용자에게 안내하고 선택을 받는다.
- 프로모션 혜택을 받기 위해 추가 수량이 필요한 경우 안내 메시지를 출력한다.
- 결제 금액 계산
- 각 상품의 가격과 수량을 바탕으로 총 구매액을 계산한다.
- 프로모션이 적용되는 상품에 대해 N+1 할인 혜택을 반영하여 금액을 계산한다.
- 멤버십 사용자를 위해 프로모션 미적용 금액의 30% 할인을 적용하되, 최대 8,000원까지 제한한다.
- 영수증 생성 및 출력
- 구매 상품의 목록, 각 상품의 수량과 가격을 영수증 형태로 출력한다.
- 증정된 상품 목록을 영수증에 추가한다.
- 총 구매액, 프로모션 할인, 멤버십 할인, 최종 결제 금액을 영수증에 요약한다.
- 영수증의 각 항목을 보기 좋게 정렬하여 출력한다.
- 추가 구매 처리
- 사용자가 추가 구매를 원하는지 여부를 입력받는다.
- 추가 구매 시 최신 재고 상태를 반영하여 상품 목록을 다시 출력한다.
- 종료 선택 시 프로그램을 종료한다.
- 에러 처리
- 상품 목록에 없는 상품을 입력한 경우, 오류 메시지를 출력하고 다시 입력을 받는다.
- 재고 수량을 초과하여 구매하려는 경우 오류 메시지를 출력하고 다시 입력을 받는다.
- 기타 잘못된 입력이 발생할 경우 오류 메시지를 출력하고 재입력을 받는다.
- 단위 테스트 작성
- 각 기능 단위별로 Jest 테스트 코드를 작성하여 올바르게 동작하는지 확인한다.
- 특히 금액 계산, 프로모션 및 멤버십 할인 적용 로직에 대한 테스트를 중점적으로 작성한다.