시나리오
작은 상점의 재고를 콘솔에서 관리하는 프로그램을 만들어라. 사용자는 콘솔 메뉴를 통해 상품을 등록/수정/삭제하고, 입고/출고로 수량을 조정하며, 검색과 정렬, 간단한 통계(총 재고 수량, 총 재고 금액)를 확인할 수 있어야 한다. 프로그램은 MVC 패턴을 따라 Model-View-Controller로 역할을 분리해야 한다.
기능 요구사항
1) 상품 도메인
- id: 문자열 (고윳값, 예시) P-001)
- name: 문자열 (중복 가능하지만 빈 문자열은 불가능하다. 최대 50자까지 허용이다)
- price: 정수(원단위며, 0이상이다)
- quantity: 정수 (0이상이다)
- category: 문자열 ("음료", "과자", "문구" 등)
제약사항
- id는 중복이 불가능하다.
- price와 quantity는 0이상이다.
2) 메뉴(콘솔)
- 메인 메뉴
[1] 상품 등록
[2] 상품 수정
[3] 상품 삭제
[4] 입고 (수량 증가)
[5] 출고 (수량 감소)
[6] 목록 보기 (정렬/필터 포함)
[7] 검색 (이름/카테고리/가격범위)
[8] 통계 (총 수량/총 금액/카테고리별 합계)
[9] 저장 및 종료
선택:
- 사용자는 번호를 입력해 기능을 수행한다.
3) 세부 동작
[1] 상품 등록
• 입력: id, name, price, quantity, category
• 검증: id 중복 시 에러, 필수값 누락 시 에러, 숫자 범위 검증
• 성공 시 등록 및 메시지 출력
[2] 상품 수정
• 입력: id
• 존재 시 개별 필드 수정(Enter로 스킵 가능): name, price, quantity, category
• 검증 동일
[3] 상품 삭제
• 입력: id
• 존재 시 삭제, 없으면 에러
[4] 입고
• 입력: id, amount
• amount > 0 검증, 수량 증가
[5] 출고
• 입력: id, amount
• amount > 0 검증, 재고 부족 시 에러(quantity - amount < 0 불가)
[6] 목록 보기
• 정렬 옵션: id | name | price | quantity (오름차순 기본, 뒤에 desc 입력 시 내림차순)
• 필터 옵션(선택): category=문구 처럼 하나만 적용 (없어도 됨)
• 표 형태로 출력
[7] 검색
• 이름 포함 검색: 키워드 포함(대소문자 구분 X)
• 카테고리 정확 일치
• 가격 범위: minPrice, maxPrice 입력 (빈 값은 무제한)
• 결과 표 출력
[8] 통계
• 총 재고 수량: 모든 quantity 합
• 총 재고 금액: Σ(price * quantity)
• 카테고리별 합계: 수량/금액
[9] 저장 및 종료
• 현재 재고 목록을 data/inventory.json에 저장하고 종료
• 다음 실행 시 해당 파일을 로드해 이어서 사용
4) 입출력 예시
예시 1-상품 등록 성공
-------------------------------
[1] 상품 등록
ID: P-001
이름: 콜라 500ml
가격(원): 1500
수량: 10
카테고리: 음료
→ 등록 성공: P-001 (콜라 500ml)
-------------------------------
예시 2-출고 실패(재고 부족)
-------------------------------
[5] 출고
ID: P-001
출고 수량: 20
[에러] 재고 부족: 현재 수량 10, 요청 수량 20
-------------------------------
예시 3-목록 보기(정렬 + 필터)
-------------------------------
[6] 목록 보기
정렬 기준(id|name|price|quantity): price
내림차순(desc) 또는 Enter: desc
필터(예: category=음료) 또는 Enter: category=음료
ID NAME PRICE QTY CATEGORY
P-005 제로콜라 500ml 1800 15 음료
P-001 콜라 500ml 1500 10 음료
총 2개
-------------------------------
예시 4-검색(이름 + 가격 범위)
-------------------------------
[7] 검색
이름 키워드(Enter=건너뜀): 콜라
카테고리(Enter=건너뜀):
최소 가격(Enter=무제한): 1000
최대 가격(Enter=무제한): 1600
ID NAME PRICE QTY CATEGORY
P-001 콜라 500ml 1500 10 음료
총 1개
-------------------------------
예시 5-통계
-------------------------------
[8] 통계
총 수량: 100
총 금액: 153,000원
[카테고리별]
- 음료: 수량 40, 금액 60,000원
- 과자: 수량 30, 금액 45,000원
- 문구: 수량 30, 금액 48,000원
-------------------------------
제약사항
• 아키텍처: MVC 패턴 준수
• Model: Product, Inventory(Repository 역할 포함 가능), InventoryService(선택)
• View: 콘솔 입출력 전담(ConsoleView)
• Controller: 메뉴 흐름/명령 분기(InventoryController)
• 데이터 영속성: JSON 파일(data/inventory.json) 로드/저장
• 에러 처리: 사용자 입력 검증(필수값/범위/중복 등)과 예외 메시지 표준화
• 정렬/검색: 정렬 기준과 검색 조건을 명확히 분리, 불변 데이터 복사 후 가공
• 테스트: Model과 Service 레이어에 대한 단위 테스트(등록/수정/입고/출고/검색)
'Js' 카테고리의 다른 글
| Js / JavaScript 문법 / difference between strict equality and loose equality (1) | 2025.01.12 |
|---|---|
| JS / javascript / Promise (3) | 2024.12.30 |
| Js / javascript 문법 / async/await 비동기 처리 키워드 (3) | 2024.12.30 |
| 단축평가(short circuit) (3) | 2023.05.03 |
| 데이터 타입 (3) | 2023.01.04 |