FruitMix는 다양한 과일 원료를 조합하여 고객 맞춤형 주스를 생산·납품하는 시스템입니다.
카페나 레스토랑 등의 클라이언트가 원하는 과일 조합을 주문하면,
관리자는 손쉽게 재고를 관리하고, 새로운 믹스 메뉴를 생성할 수 있습니다.
이 프로젝트는 소프트웨어공학의 8단계 구현 절차를 기반으로
요구분석부터 테스트까지 전 과정을 실제 개발 흐름에 맞춰 시각화하였습니다.
- 프로젝트 주제: 맞춤형 과일주스 납품 관리 시스템
- 목표: 납품 효율 향상, 주문 자동화, 재료 조합 기능 확장
- 핵심 아이디어:
- 고객별 맞춤 조합 주스 제공
- 원재료 관리 및 자동 납품 일정 확인
- 디자인 패턴 기반의 유연한 시스템 구조
| 구분 | 설명 |
|---|---|
| FR-1 | 새로운 과일(원재료)을 등록할 수 있어야 한다. |
| FR-2 | 다양한 과일을 혼합하여 맞춤형 주스를 생성할 수 있어야 한다. |
| FR-3 | 고객(카페, 레스토랑)의 주문을 등록하고 관리해야 한다. |
| FR-4 | 주문 변경 시 관리자에게 자동 알림이 전송되어야 한다. |
| FR-5 | 각 조합별 원가와 판매가를 계산할 수 있어야 한다. |
- 유연성: 새로운 과일이 추가되어도 기존 코드 수정이 최소화되어야 함.
- 재사용성: 조합 로직을 다른 프로젝트에서도 활용 가능하도록 모듈화.
- 확장성: 납품, 재고, 고객 관리 모듈이 독립적으로 동작해야 함.
Fruit (추상 클래스) ├─ Mango ├─ Orange ├─ Banana
Juice (추상 클래스) └─ CustomJuice ├─ addFruit(Fruit) ├─ calculatePrice() ├─ getDescription()
Client ├─ name ├─ orderList ├─ notify()
OrderManager ├─ createOrder() ├─ updateOrder() ├─ notifyClient()
yaml 코드 복사
- Actor: Manager, Client
- Use Cases: 주문 등록, 재료 추가, 믹스 생성, 알림 수신, 납품 확인
- Client → OrderManager: 주문 생성 요청
- OrderManager → JuiceFactory: 주스 조합 생성
- JuiceFactory → Fruit: 원재료 객체 생성
- OrderManager → Client: 주문 완료 알림
| 원칙 | 적용 예시 |
|---|---|
| SRP | Fruit 클래스는 과일 속성만, Juice는 조합 로직만 담당 |
| OCP | 새로운 과일을 추가해도 기존 코드 수정 없이 확장 가능 |
| LSP | Fruit을 상속받은 모든 과일 클래스가 동일하게 동작 |
| ISP | 관리자 / 고객 인터페이스를 분리 |
| DIP | 상위 모듈이 Fruit 추상 클래스에 의존하도록 설계 |
- 구조: MVC 패턴 기반
- Model:
Fruit,Juice,Order,Client - View: 콘솔 / GUI 주문 인터페이스
- Controller:
OrderManager(주문 및 납품 관리)
- Model:
- 데이터 관리: JSON 파일 기반 (주문 내역 및 재고 저장)
- 기술 스택: Python 3.x / UML 모델링 도구 (StarUML)
| 패턴 | 적용 목적 | 적용 예시 |
|---|---|---|
| Factory Pattern | 과일 객체 생성을 단순화 | FruitFactory.createFruit("Mango") |
| Decorator Pattern | 주스에 과일을 점진적으로 추가 | CustomJuice(base).addFruit(Mango()).addFruit(Banana()) |
| Observer Pattern | 주문 변경 시 관리자에게 자동 알림 | Client.notify() 호출 트리거 |
class Fruit:
def __init__(self, name, price):
self.name = name
self.price = price
class Juice:
def __init__(self):
self.ingredients = []
def addFruit(self, fruit):
self.ingredients.append(fruit)
def calculatePrice(self):
return sum(f.price for f in self.ingredients)
def describe(self):
names = [f.name for f in self.ingredients]
return f"Custom Juice with {' + '.join(names)}"
# 예시 실행
juice = Juice()
juice.addFruit(Fruit("Mango", 2.5))
juice.addFruit(Fruit("Orange", 1.5))
print(juice.describe()) # Custom Juice with Mango + Orange
print(juice.calculatePrice()) # 4.0