Skip to content

Commit 2988fac

Browse files
Add domain modeling
1 parent b66c703 commit 2988fac

File tree

1 file changed

+193
-6
lines changed

1 file changed

+193
-6
lines changed

README.md

+193-6
Original file line numberDiff line numberDiff line change
@@ -96,27 +96,214 @@ docker compose -p kitchenpos up -d
9696

9797
## 용어 사전
9898

99+
### 상품
100+
99101
| 한글명 | 영문명 | 설명 |
100102
| --- | --- | --- |
101-
| [상품] |
102103
| 상품 | Product | 메뉴를 구성하는 기본 단위. 가격을 가지며 0원 이상이어야 함 |
103104
| 상품 가격 | Product Price | 상품의 가격. 0원 이상이어야 하며, 변경 시 연관된 메뉴의 노출 여부에 영향을 줌 |
104-
| [메뉴 그룹] |
105+
106+
### 메뉴 그룹
107+
108+
| 한글명 | 영문명 | 설명 |
109+
| --- | --- | --- |
105110
| 메뉴 그룹 | Menu Group | 메뉴들을 분류하는 카테고리. 각 메뉴는 반드시 하나의 메뉴 그룹에 속함 |
106-
| [메뉴] |
111+
112+
### 메뉴
113+
114+
| 한글명 | 영문명 | 설명 |
115+
| --- | --- | --- |
107116
| 메뉴 | Menu | 1개 이상의 상품으로 구성된 판매 단위. 가격은 구성 상품들의 가격 합보다 크거나 같아야 함 |
117+
| 메뉴 상품 | MenuProduct | 메뉴를 구성하는 개별 단위로, 하나의 등록된 상품(Product)과 해당 상품의 수량(및 필요 시 추가 정보)을 포함한다. |
108118
| 메뉴 노출 상태 | Menu Display Status | 메뉴의 노출/숨김 상태. 상품 가격 합보다 메뉴 가격이 높으면 숨김 처리됨 |
109-
| [주문 테이블] |
119+
120+
### 주문 테이블
121+
122+
| 한글명 | 영문명 | 설명 |
123+
| --- | --- | --- |
110124
| 주문 테이블 | Order Table | 매장 내 주문이 발생하는 테이블. 빈 테이블 여부와 손님 수 정보를 가짐 |
111125
| 빈 테이블 | Empty Table | 현재 주문이 없는 상태의 주문 테이블 |
112126
| 손님 수 | Guest Count | 주문 테이블에 방문한 손님의 수. 0명 이상이어야 하며 빈 테이블은 변경 불가 |
113-
| [주문] |
127+
128+
### 주문
129+
130+
| 한글명 | 영문명 | 설명 |
131+
| --- | --- | --- |
114132
| 주문 | Order | 고객이 요청한 메뉴들의 집합. 배달/포장/매장 등의 주문 유형을 가짐 |
115-
| 주문 항목 | Order Item | 주문에 포함된 개별 메뉴와 그 수량 |
133+
| 주문 항목 | Order Item | 주문 시점의 메뉴 정보(가격, 이름 등)와 수량을 포함하는 주문 구성 항목 |
116134
| 주문 유형 | Order Type | 배달/포장/매장으로 구분되는 주문의 종류 |
117135
| 주문 상태 | Order Status | 접수 대기/접수/서빙/배달 중/배달 완료/완료 등 주문의 처리 단계 |
118136
| 배달 주문 | Delivery Order | 배달 주소가 필수이며, 배달 대행사를 통해 배달되는 주문 유형 |
119137
| 포장 주문 | Takeout Order | 매장에서 포장되어 고객이 직접 수령하는 주문 유형 |
120138
| 매장 주문 | Eat-in Order | 매장 내 주문 테이블에서 이루어지는 주문 유형 |
121139

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

0 commit comments

Comments
 (0)