@@ -96,27 +96,214 @@ docker compose -p kitchenpos up -d
96
96
97
97
## 용어 사전
98
98
99
+ ### 상품
100
+
99
101
| 한글명 | 영문명 | 설명 |
100
102
| --- | --- | --- |
101
- | [ 상품] |
102
103
| 상품 | Product | 메뉴를 구성하는 기본 단위. 가격을 가지며 0원 이상이어야 함 |
103
104
| 상품 가격 | Product Price | 상품의 가격. 0원 이상이어야 하며, 변경 시 연관된 메뉴의 노출 여부에 영향을 줌 |
104
- | [ 메뉴 그룹] |
105
+
106
+ ### 메뉴 그룹
107
+
108
+ | 한글명 | 영문명 | 설명 |
109
+ | --- | --- | --- |
105
110
| 메뉴 그룹 | Menu Group | 메뉴들을 분류하는 카테고리. 각 메뉴는 반드시 하나의 메뉴 그룹에 속함 |
106
- | [ 메뉴] |
111
+
112
+ ### 메뉴
113
+
114
+ | 한글명 | 영문명 | 설명 |
115
+ | --- | --- | --- |
107
116
| 메뉴 | Menu | 1개 이상의 상품으로 구성된 판매 단위. 가격은 구성 상품들의 가격 합보다 크거나 같아야 함 |
117
+ | 메뉴 상품 | MenuProduct | 메뉴를 구성하는 개별 단위로, 하나의 등록된 상품(Product)과 해당 상품의 수량(및 필요 시 추가 정보)을 포함한다. |
108
118
| 메뉴 노출 상태 | Menu Display Status | 메뉴의 노출/숨김 상태. 상품 가격 합보다 메뉴 가격이 높으면 숨김 처리됨 |
109
- | [ 주문 테이블] |
119
+
120
+ ### 주문 테이블
121
+
122
+ | 한글명 | 영문명 | 설명 |
123
+ | --- | --- | --- |
110
124
| 주문 테이블 | Order Table | 매장 내 주문이 발생하는 테이블. 빈 테이블 여부와 손님 수 정보를 가짐 |
111
125
| 빈 테이블 | Empty Table | 현재 주문이 없는 상태의 주문 테이블 |
112
126
| 손님 수 | Guest Count | 주문 테이블에 방문한 손님의 수. 0명 이상이어야 하며 빈 테이블은 변경 불가 |
113
- | [ 주문] |
127
+
128
+ ### 주문
129
+
130
+ | 한글명 | 영문명 | 설명 |
131
+ | --- | --- | --- |
114
132
| 주문 | Order | 고객이 요청한 메뉴들의 집합. 배달/포장/매장 등의 주문 유형을 가짐 |
115
- | 주문 항목 | Order Item | 주문에 포함된 개별 메뉴와 그 수량 |
133
+ | 주문 항목 | Order Item | 주문 시점의 메뉴 정보(가격, 이름 등)와 수량을 포함하는 주문 구성 항목 |
116
134
| 주문 유형 | Order Type | 배달/포장/매장으로 구분되는 주문의 종류 |
117
135
| 주문 상태 | Order Status | 접수 대기/접수/서빙/배달 중/배달 완료/완료 등 주문의 처리 단계 |
118
136
| 배달 주문 | Delivery Order | 배달 주소가 필수이며, 배달 대행사를 통해 배달되는 주문 유형 |
119
137
| 포장 주문 | Takeout Order | 매장에서 포장되어 고객이 직접 수령하는 주문 유형 |
120
138
| 매장 주문 | Eat-in Order | 매장 내 주문 테이블에서 이루어지는 주문 유형 |
121
139
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로 변경될 수 있음
122
161
## 모델링
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