Skip to content

kanado5385-k/convenience-store-application

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

목차 📑

  • 애플리케이션 소개
  • 기능 목록
  • Use Case 시나리오
  • MVC 구조
  • 폴더 및 파일 구조 시각화

애플리케이션 소개 📖

개요

간단한 펀의점 애플리케이션입니다. 사용자가 재고를 확인하고 구매할 상품과 수량을 입력할 수 있습니다.
사용자가 특정 상품에 적용되는 프로모션 할인을 받을 수 있고, 멤버십 회원이라면 할인도 받을 수 있습니다.
구매가 끝나면 영수증을 조회하고, 추가 구매도 가능합니다.

추가 설명

  • 구매할 상품과 수량 입력
    • 반드시 정해진 형식에 맞게 입력해야한다.
    • 같은 상품을 두번 입력하면 한개로 묶음.
  • 프로모션 할인
    • 프로모션 기간에만 할인 적용된다.
    • N개 구매 시 1개 무료 증정 형태의 1+1 또는 2+1 프로모션 제공된다(동일 상품 중복 적용 불가).
    • 프로모션 재고가 우선 사용되며, 부족 시 일반 재고 사용된다.
    • 부족한 수량이 있을 시 추가 구매로 혜택 가능 안내 받는다.
    • 프로모션 재고 부족 시 일부 수량 정가 결제 안내 받는다.
  • 멤버십 할인 요약
    • 프로모션 미적용 금액의 30% 할인 (최대 8,000원).
    • 프로모션 적용 후 남은 금액에 대해 멤버십 할인 적용된다.
  • 영수증이 포함할 내용
    • 구매 상품 내역: 상품명, 수량, 가격
    • 증정 상품 내역: 무료 증정된 상품 목록
    • 금액 정보: 총구매액, 행사할인, 멤버십할인, 내실돈
  • 추가 구매
    • 업데이트된 재고로 추가 구매 가능하다.
    • 재고에 있는 모든 상품들의 수량이 0일 경우에 강제 종료된다.

기능 목록 📝

  1. 편의점 소개와 재고 현황을 조회
  2. 구매할 상품과 수량을 입력
    • 예외처리: 입력 형식(하이픈, 대괄호, 쉼표)이 다를 경우
    • 예외처리: 상품 또는 수량을 빈문자열 또는 null 값으로 입력할 경우
    • 예외처리: 재고에 없는 상품은 입력할 경우
    • 예외처리: 구매 수량이 재고 수량을 초과할 경우
    • 예외처리: 수량이 자연수가 아닐 경우
    • 예외처리: 수량이 0인 상품을 입력할 경우
    • 예외처리: Y/N 입력 과정에서 "Y" 또는 "N" 중에 아닌 값이 입력될 경우
    • 추가기능: 같은 상품을 두번 입력하면 한개로 묶음
  3. 특정 상품에 대해 프로모션 혜택을 받는다
  4. 멤버십 회원이면 할인을 받는다
    • 예외처리: Y/N 입력 과정에서 "Y" 또는 "N" 중에 아닌 값이 입력될 경우
  5. 구매 후에, 구매 내역과 산출한 금액을 영수증으로 조회
  6. 업데이트된 재고로 한번 더 구매할건지 입력
    • 추가기능: 재고에 있는 모든 상품들의 수량이 0일 경우에 강제 종료됨

Use Case 시나리오 🧮

기본 흐름

단계 편의점 애플리케이션
1 시스템이 편의점 소개와 재고 현황을 디스플레이한다.
2 사용자가 구매할 상품과 수량을 입력한다.
3 시스템이 상품 재고를 확인하고, 모든 상품이 구매 가능함을 확인한다.
4 시스템이 상품에 적용 가능한 프로모션 혜택이 있는지 확인한다.
5 사용자가 멤버십 회원 여부를 입력한다.
6 시스템이 상품 가격, 수량, 프로모션 혜택, 멤버십 할인을 반영하여 총 구매 금액을 계산한다.
7 시스템이 최종 결제 금액을 영수증 형식으로 디스플레이한다.
8 시스템이 구매 완료 후 재고 상태를 업데이트한다.
9 사용자가 추가 구매를 할지 여부를 입력한다.

대체 흐름 - 프로모션 상품을 구매할 경우

단계 시스템 반응
4a 오늘 날짜가 프로모션 기간 내에 포함되는지 확인한다.
4a1 적용 가능한 프로모션 혜택 중 하나만 적용한다.
4a2 사용자가 프로모션 적용을 위한 최소 수량보다 적게 선택한 경우, 추가 수량을 가져올 시 혜택을 받을 수 있음을 안내한다.
4a3 재고가 부족하여 프로모션 적용이 불가능할 경우, 정가로 해당 상품을 구매할 것인지 사용자에게 확인한다.

대체 흐름 - 사용자가 멤버십 회원일 경우

단계 시스템 반응
5b 프로모션 할인이 적용된 상품이 있는지 확인한다.
5b1 프로모션 할인이 적용된 금액을 제외한 남은 금액에 멤버십 할인 30%를 적용한다.

대체 흐름 - 추가 기능

조건 단계 시스템 반응
같은 상품이 두 번 입력된 경우 2j 동일한 상품을 하나로 묶어 처리하고 다음 단계로 진행한다.
재고에 있는 모든 상품의 수량이 0인 경우 6k 추가 구매 여부를 묻지 않고 애플리케이션을 강제 종료한다.

예외 흐름

조건 단계 시스템 반응
입력 형식(하이픈, 대괄호, 쉼표)이 다를 경우 2c 예외 안내 메시지와 함께 사용자에게 구매할 상품과 수량 입력을 다시 요청한다.
입력된 상품 또는 수량을 빈 문자열 또는 null 값으로 입력할 경우 2d 예외 안내 메시지와 함께 사용자에게 구매할 상품과 수량 입력을 다시 요청한다.
재고에 없는 상품을 입력할 경우 2e 예외 안내 메시지와 함께 사용자에게 구매할 상품과 수량 입력을 다시 요청한다.
입력된 구매 수량이 재고 수량을 초과할 경우 2f 예외 안내 메시지와 함께 사용자에게 구매할 상품과 수량 입력을 다시 요청한다.
입력된 수량이 자연수가 아닐 경우 2g 예외 안내 메시지와 함께 사용자에게 구매할 상품과 수량 입력을 다시 요청한다.
입력된 상품의 수량이 0일 경우 2h 예외 안내 메시지와 함께 사용자에게 구매할 상품과 수량 입력을 다시 요청한다.
Y/N 입력 과정에서 "Y" 또는 "N" 중에 아닌 값이 입력될 경우 4n, 5m 예외 안내 메시지와 함께 사용자에게 입력을 다시 요청한다.

MVC 구조 💡

🔵 Model

  • ProductFileReader

    • 파일에서 상품 정보를 읽어오는 클래스.
  • ProductFileWriter

    • 상품 정보를 파일에 기록하는 클래스.
  • PromotionFileReader

    • 파일에서 프로모션 정보를 읽어오는 클래스.

🟢 Controller

  • StoreController
    • 애플리케이션의 전반적인 흐름을 제어하는 클래스.

🟡 View

🔽 Input

  • InputView

    • 사용자로부터 입력을 받는 메인 클래스.
  • InputViewOfPromotionIssue

    • 프로모션 관련 추가 입력을 처리하는 클래스.

🔽 Output

  • ExceptionOutputView

    • 예외 상황에 대한 메시지를 출력하는 클래스.
  • OutputView

    • 일반적인 결과 출력을 처리하는 클래스.

🟤 Service

  • ReceiptService
    • 영수증DTO 생성 처리하는 서비스.

🔴 Domain

  • Buying

    • 구매 정보를 관리하는 클래스.
  • Order

    • 주문 정보를 관리하는 클래스.
  • Receipt

    • 영수증 데이터를 관리하는 클래스.

🔽 inventory

  • Product

    • 개별 상품 정보를 관리하는 클래스.
  • Inventory

    • 재고 정보를 관리하는 클래스.
  • InventoryManager

    • 재고 관련 로직을 처리하는 클래스.

🔽 promotion

  • Promotion

    • 프로모션 정보를 관리하는 클래스.
  • PromotionPolicy

    • 프로모션 정책을 정의하는 클래스.
  • PromotionProcessor

    • 프로모션 적용 로직을 처리하는 클래스.
  • PromotionValidator

    • 프로모션 유효성 검사를 수행하는 클래스.
  • UserInteractionHandler

    • 사용자와의 상호작용을 담당하는 클래스.

🟣 DTO

  • ReceiptDTO
    • 영수증 데이터를 전달하기 위한 DTO.

🟢 Factory

  • DomainFactory

    • 도메인 객체를 생성하는 팩토리 클래스.
  • ModelFactory

    • 모델 객체를 생성하는 팩토리 클래스.
  • ProductFactory

    • Product 객체 생성을 담당하는 팩토리 클래스.
  • PromotionFactory

    • Promotion 객체 생성을 담당하는 팩토리 클래스.
  • ViewFactory

    • 뷰 객체를 생성하는 팩토리 클래스.

🟠 Enums

🔽 Constants

  • AnswerConstants

    • 답장 종류 관련 상수를 관리하는 클래스.
  • CommonConstants

    • 공통적으로 사용되는 상수를 관리하는 클래스.
  • FilePathConstants

    • 파일 경로 관련 상수를 관리하는 클래스.

🔽 Messages

  • ErrorMessage

    • 에러 메시지를 관리하는 enum.
  • IOMessage

    • 입출력 메시지를 관리하는 enum.
  • SystemMessage

    • 시스템 메시지를 관리하는 인터페이스.
  • BuyingStatus

    • 구매 상태를 나타내는 enum.

Utilities

  • Parser

    • 문자열을 파싱하여 필요한 형식으로 변환하는 유틸리티 클래스.
  • Splitter

    • 문자열을 특정 구분자로 나누는 유틸리티 클래스.
  • Validator

    • 유효성 검사를 수행하는 유틸리티 클래스.

🔵 Config

  • AppConfig
    • 애플리케이션 시작 시에 필요한 객체 생성하는 클래스.

폴더 및 파일 구조 시각화 🌲

store_tree

About

순수 자바 코드로 구현한 간단한 펀의점 애플리케이션

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages