Skip to content

Commit 94685fd

Browse files
Add domain modeling
1 parent b66c703 commit 94685fd

File tree

1 file changed

+193
-17
lines changed

1 file changed

+193
-17
lines changed

README.md

+193-17
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,3 @@
1-
# 키친포스
2-
3-
## 퀵 스타트
4-
5-
```sh
6-
cd docker
7-
docker compose -p kitchenpos up -d
8-
```
9-
10-
## 요구 사항
11-
121
### 상품
132

143
- 상품을 등록할 수 있다.
@@ -96,27 +85,214 @@ docker compose -p kitchenpos up -d
9685

9786
## 용어 사전
9887

88+
### 상품
89+
9990
| 한글명 | 영문명 | 설명 |
10091
| --- | --- | --- |
101-
| [상품] |
10292
| 상품 | Product | 메뉴를 구성하는 기본 단위. 가격을 가지며 0원 이상이어야 함 |
10393
| 상품 가격 | Product Price | 상품의 가격. 0원 이상이어야 하며, 변경 시 연관된 메뉴의 노출 여부에 영향을 줌 |
104-
| [메뉴 그룹] |
94+
95+
### 메뉴 그룹
96+
97+
| 한글명 | 영문명 | 설명 |
98+
| --- | --- | --- |
10599
| 메뉴 그룹 | Menu Group | 메뉴들을 분류하는 카테고리. 각 메뉴는 반드시 하나의 메뉴 그룹에 속함 |
106-
| [메뉴] |
100+
101+
### 메뉴
102+
103+
| 한글명 | 영문명 | 설명 |
104+
| --- | --- | --- |
107105
| 메뉴 | Menu | 1개 이상의 상품으로 구성된 판매 단위. 가격은 구성 상품들의 가격 합보다 크거나 같아야 함 |
106+
| 메뉴 상품 | MenuProduct | 메뉴를 구성하는 개별 단위로, 하나의 등록된 상품(Product)과 해당 상품의 수량(및 필요 시 추가 정보)을 포함한다. |
108107
| 메뉴 노출 상태 | Menu Display Status | 메뉴의 노출/숨김 상태. 상품 가격 합보다 메뉴 가격이 높으면 숨김 처리됨 |
109-
| [주문 테이블] |
108+
109+
### 주문 테이블
110+
111+
| 한글명 | 영문명 | 설명 |
112+
| --- | --- | --- |
110113
| 주문 테이블 | Order Table | 매장 내 주문이 발생하는 테이블. 빈 테이블 여부와 손님 수 정보를 가짐 |
111114
| 빈 테이블 | Empty Table | 현재 주문이 없는 상태의 주문 테이블 |
112115
| 손님 수 | Guest Count | 주문 테이블에 방문한 손님의 수. 0명 이상이어야 하며 빈 테이블은 변경 불가 |
113-
| [주문] |
116+
117+
### 주문
118+
119+
| 한글명 | 영문명 | 설명 |
120+
| --- | --- | --- |
114121
| 주문 | Order | 고객이 요청한 메뉴들의 집합. 배달/포장/매장 등의 주문 유형을 가짐 |
115-
| 주문 항목 | Order Item | 주문에 포함된 개별 메뉴와 그 수량 |
122+
| 주문 항목 | Order Item | 주문 시점의 메뉴 정보(가격, 이름 등)와 수량을 포함하는 주문 구성 항목 |
116123
| 주문 유형 | Order Type | 배달/포장/매장으로 구분되는 주문의 종류 |
117124
| 주문 상태 | Order Status | 접수 대기/접수/서빙/배달 중/배달 완료/완료 등 주문의 처리 단계 |
118125
| 배달 주문 | Delivery Order | 배달 주소가 필수이며, 배달 대행사를 통해 배달되는 주문 유형 |
119126
| 포장 주문 | Takeout Order | 매장에서 포장되어 고객이 직접 수령하는 주문 유형 |
120127
| 매장 주문 | Eat-in Order | 매장 내 주문 테이블에서 이루어지는 주문 유형 |
121128

129+
### 주문 상태
130+
131+
| 주문 상태 | Order Status | 설명 |
132+
|---------|--------------|------|
133+
| 접수 대기 | PENDING | 고객이 주문을 완료했으나, 매장에서 아직 접수하지 않은 상태 |
134+
| 접수 | ACCEPTED | 매장에서 주문을 확인하고 접수한 상태 |
135+
| 준비 중 | PREPARING | 주문한 음식을 조리/준비하고 있는 상태 |
136+
| 서빙 중 | SERVING | (매장 내 주문) 음식이 준비되어 테이블로 서빙되는 중 |
137+
| 배달 중 | DELIVERING | (배달 주문) 배달원이 음식을 배달하는 중 |
138+
| 배달 완료 | DELIVERED | (배달 주문) 배달이 완료된 상태 |
139+
| 완료 | COMPLETED | 주문이 최종적으로 완료된 상태 |
140+
| 취소 | CANCELLED | 주문이 취소된 상태 |
141+
142+
주문 상태 흐름:
143+
1. 매장 내 주문:
144+
PENDING → ACCEPTED → PREPARING → SERVING → COMPLETED
145+
146+
2. 배달 주문:
147+
PENDING → ACCEPTED → PREPARING → DELIVERING → DELIVERED → COMPLETED
148+
149+
※ 모든 상태에서 CANCELLED로 변경될 수 있음
122150
## 모델링
151+
152+
### 도메인 모델
153+
154+
```mermaid
155+
classDiagram
156+
class Product {
157+
UUID id
158+
String name
159+
BigDecimal price
160+
161+
register()
162+
updatePrice()
163+
validatePrice()
164+
validateName()
165+
}
166+
167+
class MenuGroup {
168+
UUID id
169+
String name
170+
171+
register()
172+
validateName()
173+
}
174+
175+
class Menu {
176+
UUID id
177+
String name
178+
BigDecimal price
179+
boolean displayed
180+
UUID menuGroupId
181+
List~MenuProduct~ products
182+
183+
register()
184+
updatePrice()
185+
display()
186+
hide()
187+
validatePrice()
188+
validateName()
189+
validateProducts()
190+
}
191+
192+
class MenuProduct {
193+
Long seq
194+
Long quantity
195+
UUID productId
196+
UUID menuId
197+
}
198+
199+
class Order {
200+
UUID id
201+
OrderType type
202+
OrderStatus status
203+
List~OrderLineItem~ items
204+
String deliveryAddress
205+
LocalDateTime orderDateTime
206+
UUID tableId
207+
208+
create()
209+
accept()
210+
serve()
211+
deliver()
212+
complete()
213+
validateType()
214+
validateItems()
215+
validateAddress()
216+
}
217+
218+
class OrderLineItem {
219+
Long seq
220+
Long quantity
221+
BigDecimal price
222+
OrderLineItemMenu menu
223+
}
224+
225+
class OrderLineItemMenu {
226+
Long seq
227+
String name
228+
BigDecimal price
229+
UUID menuId
230+
}
231+
232+
class RestaurantTable {
233+
UUID id
234+
String name
235+
int numberOfGuests
236+
boolean occupied
237+
238+
register()
239+
occupy()
240+
release()
241+
updateNumberOfGuests()
242+
validateName()
243+
validateNumberOfGuests()
244+
}
245+
246+
%% 관계 정의
247+
Menu "*" --> "1" MenuGroup
248+
Menu "1" <-- "*" MenuProduct
249+
MenuProduct "*" --> "1" Product
250+
Order "*" --> "1" RestaurantTable
251+
Order "1" *-- "*" OrderLineItem
252+
OrderLineItem "1" *-- "1" OrderLineItemMenu
253+
```
254+
255+
### 주요 도메인 규칙
256+
257+
1. 상품(Product)
258+
- 가격은 0원 이상이어야 함
259+
- 이름은 비속어를 포함할 수 없음
260+
261+
2. 메뉴(Menu)
262+
- 최소 1개 이상의 상품으로 구성
263+
- 가격은 구성 상품들의 총 가격 이상이어야 함
264+
- 상품 가격 총합보다 메뉴 가격이 높으면 숨김 처리
265+
266+
3. 주문(Order)
267+
- 배달/포장/매장 주문 유형 구분
268+
- 배달 주문은 주소 필수
269+
- 매장 주문은 테이블 지정 필수
270+
- 주문 상태는 정해진 흐름대로만 변경 가능
271+
272+
4. 테이블(RestaurantTable)
273+
- 사용중인 테이블만 주문 가능
274+
- 주문이 완료되지 않은 테이블은 사용 해제 불가
275+
- 빈 테이블은 손님 수 변경 불가
276+
277+
### 핵심 비즈니스 흐름
278+
279+
1. 메뉴 관리
280+
```mermaid
281+
stateDiagram-v2
282+
[*] --> 메뉴등록
283+
메뉴등록 --> 메뉴노출: 가격 검증 통과
284+
메뉴노출 --> 메뉴숨김: 가격 규칙 위반
285+
메뉴숨김 --> 메뉴노출: 가격 수정
286+
```
287+
288+
2. 주문 처리
289+
```mermaid
290+
stateDiagram-v2
291+
[*] --> 대기중
292+
대기중 --> 접수됨: 주문접수
293+
접수됨 --> 전달됨: 음식준비완료
294+
전달됨 --> 배달중: 배달주문
295+
전달됨 --> 완료됨: 매장/포장주문
296+
배달중 --> 배달됨
297+
배달됨 --> 완료됨
298+
```

0 commit comments

Comments
 (0)