- 애플리케이션 소개
- 기능 목록
- Use Case 시나리오
- MVC 구조
- 폴더 및 파일 구조 시각화
간단한 펀의점 애플리케이션입니다. 사용자가 재고를 확인하고 구매할 상품과 수량을 입력할 수 있습니다.
사용자가 특정 상품에 적용되는 프로모션 할인을 받을 수 있고, 멤버십 회원이라면 할인도 받을 수 있습니다.
구매가 끝나면 영수증을 조회하고, 추가 구매도 가능합니다.
- 구매할 상품과 수량 입력
- 반드시 정해진 형식에 맞게 입력해야한다.
- 같은 상품을 두번 입력하면 한개로 묶음.
- 프로모션 할인
- 프로모션 기간에만 할인 적용된다.
- N개 구매 시 1개 무료 증정 형태의 1+1 또는 2+1 프로모션 제공된다(동일 상품 중복 적용 불가).
- 프로모션 재고가 우선 사용되며, 부족 시 일반 재고 사용된다.
- 부족한 수량이 있을 시 추가 구매로 혜택 가능 안내 받는다.
- 프로모션 재고 부족 시 일부 수량 정가 결제 안내 받는다.
- 멤버십 할인 요약
- 프로모션 미적용 금액의 30% 할인 (최대 8,000원).
- 프로모션 적용 후 남은 금액에 대해 멤버십 할인 적용된다.
- 영수증이 포함할 내용
- 구매 상품 내역: 상품명, 수량, 가격
- 증정 상품 내역: 무료 증정된 상품 목록
- 금액 정보: 총구매액, 행사할인, 멤버십할인, 내실돈
- 추가 구매
- 업데이트된 재고로 추가 구매 가능하다.
- 재고에 있는 모든 상품들의 수량이 0일 경우에 강제 종료된다.
- 편의점 소개와 재고 현황을 조회
- 구매할 상품과 수량을 입력
- 예외처리: 입력 형식(하이픈, 대괄호, 쉼표)이 다를 경우
- 예외처리: 상품 또는 수량을 빈문자열 또는 null 값으로 입력할 경우
- 예외처리: 재고에 없는 상품은 입력할 경우
- 예외처리: 구매 수량이 재고 수량을 초과할 경우
- 예외처리: 수량이 자연수가 아닐 경우
- 예외처리: 수량이 0인 상품을 입력할 경우
- 예외처리: Y/N 입력 과정에서 "Y" 또는 "N" 중에 아닌 값이 입력될 경우
- 추가기능: 같은 상품을 두번 입력하면 한개로 묶음
- 특정 상품에 대해 프로모션 혜택을 받는다
- 멤버십 회원이면 할인을 받는다
- 예외처리: Y/N 입력 과정에서 "Y" 또는 "N" 중에 아닌 값이 입력될 경우
- 구매 후에, 구매 내역과 산출한 금액을 영수증으로 조회
- 업데이트된 재고로 한번 더 구매할건지 입력
- 추가기능: 재고에 있는 모든 상품들의 수량이 0일 경우에 강제 종료됨
| 단계 | 편의점 애플리케이션 |
|---|---|
| 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 | 예외 안내 메시지와 함께 사용자에게 입력을 다시 요청한다. |
-
ProductFileReader
- 파일에서 상품 정보를 읽어오는 클래스.
-
ProductFileWriter
- 상품 정보를 파일에 기록하는 클래스.
-
PromotionFileReader
- 파일에서 프로모션 정보를 읽어오는 클래스.
- StoreController
- 애플리케이션의 전반적인 흐름을 제어하는 클래스.
-
InputView
- 사용자로부터 입력을 받는 메인 클래스.
-
InputViewOfPromotionIssue
- 프로모션 관련 추가 입력을 처리하는 클래스.
-
ExceptionOutputView
- 예외 상황에 대한 메시지를 출력하는 클래스.
-
OutputView
- 일반적인 결과 출력을 처리하는 클래스.
- ReceiptService
- 영수증DTO 생성 처리하는 서비스.
-
Buying
- 구매 정보를 관리하는 클래스.
-
Order
- 주문 정보를 관리하는 클래스.
-
Receipt
- 영수증 데이터를 관리하는 클래스.
-
Product
- 개별 상품 정보를 관리하는 클래스.
-
Inventory
- 재고 정보를 관리하는 클래스.
-
InventoryManager
- 재고 관련 로직을 처리하는 클래스.
-
Promotion
- 프로모션 정보를 관리하는 클래스.
-
PromotionPolicy
- 프로모션 정책을 정의하는 클래스.
-
PromotionProcessor
- 프로모션 적용 로직을 처리하는 클래스.
-
PromotionValidator
- 프로모션 유효성 검사를 수행하는 클래스.
-
UserInteractionHandler
- 사용자와의 상호작용을 담당하는 클래스.
- ReceiptDTO
- 영수증 데이터를 전달하기 위한 DTO.
-
DomainFactory
- 도메인 객체를 생성하는 팩토리 클래스.
-
ModelFactory
- 모델 객체를 생성하는 팩토리 클래스.
-
ProductFactory
Product객체 생성을 담당하는 팩토리 클래스.
-
PromotionFactory
Promotion객체 생성을 담당하는 팩토리 클래스.
-
ViewFactory
- 뷰 객체를 생성하는 팩토리 클래스.
-
AnswerConstants
- 답장 종류 관련 상수를 관리하는 클래스.
-
CommonConstants
- 공통적으로 사용되는 상수를 관리하는 클래스.
-
FilePathConstants
- 파일 경로 관련 상수를 관리하는 클래스.
-
ErrorMessage
- 에러 메시지를 관리하는 enum.
-
IOMessage
- 입출력 메시지를 관리하는 enum.
-
SystemMessage
- 시스템 메시지를 관리하는 인터페이스.
-
BuyingStatus
- 구매 상태를 나타내는 enum.
-
Parser
- 문자열을 파싱하여 필요한 형식으로 변환하는 유틸리티 클래스.
-
Splitter
- 문자열을 특정 구분자로 나누는 유틸리티 클래스.
-
Validator
- 유효성 검사를 수행하는 유틸리티 클래스.
- AppConfig
- 애플리케이션 시작 시에 필요한 객체 생성하는 클래스.