Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Step2 #514

Open
wants to merge 3 commits into
base: reversalspring
Choose a base branch
from
Open

Step2 #514

Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
161 changes: 149 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,3 @@
# 키친포스

## 퀵 스타트

```sh
cd docker
docker compose -p kitchenpos up -d
```

## 요구 사항

### 상품

- 상품을 등록할 수 있다.
Expand Down Expand Up @@ -158,4 +147,152 @@ docker compose -p kitchenpos up -d
PENDING → ACCEPTED → PREPARING → DELIVERING → DELIVERED → COMPLETED

※ 모든 상태에서 CANCELLED로 변경될 수 있음
## 모델링
## 모델링

### 도메인 모델

```mermaid
classDiagram
Comment on lines +153 to +155

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

class 다이어그램으로 잘 작성해 주셨습니다. 👍
다만 생각하시는 모델링은 누구를 위함이고 목적은 무엇일까요?

제가 생각하는 모델링은 제품(문제 해결을 위한)을 만드는 모든 구성원이 이해할 수 있는 모델을 만드는 과정이라고 생각해요. 그렇기 때문에 저희 같은 개발자가 이해해기는 class 다이어그램이 좋을 수도 있습니다. 다만 다른 직군들은 이해할 수 있을까요? 이를 이해하기 위해 별도의 번역 과정이 필요하지 않을지 고민해 보시면 좋을 것 같아요. 어떤 산출물이 모든 구성원이 보고 바로 이해할 수 있을까요?

class Product {
UUID id
String name
BigDecimal price

register()
updatePrice()
validatePrice()
validateName()
}

class MenuGroup {
UUID id
String name

register()
validateName()
}

class Menu {
UUID id
String name
BigDecimal price
boolean displayed
UUID menuGroupId
List~MenuProduct~ products

register()
updatePrice()
display()
hide()
validatePrice()
validateName()
validateProducts()
}

class MenuProduct {
Long seq
Long quantity
UUID productId
UUID menuId
}

class Order {
UUID id
OrderType type
OrderStatus status
List~OrderLineItem~ items
String deliveryAddress
LocalDateTime orderDateTime
UUID tableId

create()
accept()
serve()
deliver()
complete()
validateType()
validateItems()
validateAddress()
}

class OrderLineItem {
Long seq
Long quantity
BigDecimal price
OrderLineItemMenu menu
}

class OrderLineItemMenu {
Long seq
String name
BigDecimal price
UUID menuId
}

class RestaurantTable {
UUID id
String name
int numberOfGuests
boolean occupied

register()
occupy()
release()
updateNumberOfGuests()
validateName()
validateNumberOfGuests()
}

%% 관계 정의
Menu "*" --> "1" MenuGroup
Menu "1" <-- "*" MenuProduct
MenuProduct "*" --> "1" Product
Order "*" --> "1" RestaurantTable
Order "1" *-- "*" OrderLineItem
OrderLineItem "1" *-- "1" OrderLineItemMenu
```

### 주요 도메인 규칙

1. 상품(Product)
- 가격은 0원 이상이어야 함
- 이름은 비속어를 포함할 수 없음

2. 메뉴(Menu)
- 최소 1개 이상의 상품으로 구성
- 가격은 구성 상품들의 총 가격 이상이어야 함
- 상품 가격 총합보다 메뉴 가격이 높으면 숨김 처리

3. 주문(Order)
- 배달/포장/매장 주문 유형 구분
- 배달 주문은 주소 필수
- 매장 주문은 테이블 지정 필수
- 주문 상태는 정해진 흐름대로만 변경 가능

4. 테이블(RestaurantTable)
- 사용중인 테이블만 주문 가능
- 주문이 완료되지 않은 테이블은 사용 해제 불가
- 빈 테이블은 손님 수 변경 불가

### 핵심 비즈니스 흐름

1. 메뉴 관리
```mermaid
stateDiagram-v2
[*] --> 메뉴등록
메뉴등록 --> 메뉴노출: 가격 검증 통과
메뉴노출 --> 메뉴숨김: 가격 규칙 위반
메뉴숨김 --> 메뉴노출: 가격 수정
```

2. 주문 처리
```mermaid
stateDiagram-v2
[*] --> 대기중
대기중 --> 접수됨: 주문접수
접수됨 --> 전달됨: 음식준비완료
전달됨 --> 배달중: 배달주문
전달됨 --> 완료됨: 매장/포장주문
배달중 --> 배달됨
배달됨 --> 완료됨
```