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