diff --git a/README.md b/README.md
index 76bb2d6c0..b7a24e178 100644
--- a/README.md
+++ b/README.md
@@ -96,44 +96,85 @@ docker compose -p kitchenpos up -d
## 용어 사전
-| 컨텍스트 | 한글명 | 영문명 | 설명 |
-|--------|-----------------|------------------|---------------------------------------------------------------------------------------|
-| 공통 | 가격 | Price | 상품 또는 메뉴의 대가로 손님이 지불하는 금액. 한국 원 단위이며 0원 이상이다. |
-| 공통 | 비속어 | Profanity | 욕설이나 비하하는 말, 예절에 어긋나게 대상을 낮추거나 품위 없이 천한 말. |
-| 공통 | 손님 | Guest | 메뉴를 임의의 주문 유형으로 주문할 수 있는 사람. |
-| 공통 | 수량 | Quantity | 특정 유형은 가진 개체들의 수. 예) 메뉴 수량, 주문 수량. A 메뉴를 2개, B 메뉴를 3개 주문했다면 수량은 5개이다. |
-| 공통 | 종류 | Cardinality | 특정 유형을 가진 개체들의 고유한 가짓수. 예) 상품 종류, 메뉴 종류. A 메뉴를 2개, B 메뉴를 3개 주문했다면 종류는 2가지이다. |
-| 상품 | 상품 | Product | 실제로 손님에게 전달할 수 있는 음식, 음료 등의 물건. |
-| 메뉴 | 메뉴 | Menu | 하나 이상의 상품으로 구성된 실제로 손님에게 판매 가능한 단위. |
-| 메뉴 | (메뉴) 노출 | Display | 메뉴를 목록 또는 화면에 보여지게 함. |
-| 메뉴 | (메뉴) 숨김 | Hide | 메뉴를 목록 또는 화면에 보여지지 않게 함. |
-| 메뉴 | 메뉴 상품 | Menu product | 메뉴에 포함되는 상품의 정보로 상품의 식별자와 수량을 갖는다. |
-| 메뉴 그룹 | 메뉴 그룹 | Menu group | 메뉴의 집합으로 모든 메뉴는 하나의 메뉴 그룹에 속해야 한다. |
-| 주문 테이블 | 빈 테이블 | Empty table | 손님이 없는 주문 테이블. |
-| 주문 테이블 | 점유된 테이블 | Occupied table | 손님이 앉은 주문 테이블. |
-| 주문 테이블 | 주문 테이블 | Order table | 손님이 앉아서 메뉴를 주문할 수 있는 테이블. 주문 테이블은 손님에 의해 점유되어 있거나 비어 있다. |
-| 주문 공통 | (주문) 접수 (상태) | Accepted | 손님이 생성한 주문을 매장에서 확인한 상태. |
-| 주문 공통 | (주문) 접수 대기 (상태) | Waiting | 손님이 주문을 생성했지만 아직 매장에서 확인하지 않은 상태. |
-| 주문 공통 | 주문 | Order | 손님이 메뉴를 어떤 유형으로 전달받을지 지정하여 요구한 것. 주문 유형, 주문 항목, 주문 상태, 주문 시각, 배달 주소, 주문 테이블 정보를 포함한다. |
-| 주문 공통 | 주문 상태 | Order status | 하나의 주문이 처리되는 과정. 하나의 주문은 한 시점에 단 하나의 상태여야 한다(동시에 여러 상태일 수 없다). |
-| 주문 공통 | 주문 유형 | Order type | 주문에 포함된 메뉴들이 손님에게 전달되는 방법. 배달, 포장, 매장이 있다. |
-| 주문 공통 | 주문 항목 | Order line item | 주문의 일부분으로 하나의 메뉴와 그 수량, 그리고 가격으로 구성된다. 하나의 주문에는 한 개 이상의 주문 항목이 포함되어 있어야 한다. |
-| 매장 주문 | 매장 (주문) | Eat in | 주문 테이블을 점유한 손님에게 메뉴가 전달되는 주문 유형. |
-| 매장 주문 | 서빙 | Serving | 손님이 주문한 메뉴를 손님에게 손님이 앉아 있는 주문 테이블로 전달하는 행위. |
-| 매장 주문 | 서빙 완료 (상태) | Served | 서빙을 통해 메뉴를 손님에게 손님이 앉아 있는 주문 테이블로 전달 완료한 상태. |
-| 매장 주문 | (주문) 완료 (상태) | Completed | 주문 과정이 종결된 상태로 추가적인 작업이 필요하지 않음. 서빙이 완료된 상태여야 주문이 완료될 수 있다. |
-| 배달 주문 | 배달 (주문) | Delivery | 손님이 지정한 배달 주소로 배달 대행사를 통해 메뉴가 전달되는 주문 유형. |
-| 배달 주문 | 배달 대행사 | Delivery agency | 어떤 물건 또는 음식 등의 배달 업무를 대행해주는 사업자. |
-| 배달 주문 | 배달 완료 (상태) | Delivered | 배달 대행사의 배달원을 통해 손님의 주문 주소로 메뉴가 배달 완료된 상태. 배달 주문인 경우에만 나타날 수 있다. |
-| 배달 주문 | 배달 주소 | Delivery address | 손님이 메뉴를 전달 받고 싶어하는 위치를 주소로 나타낸 것. 배달 주문인 경우 반드시 있어야 한다. |
-| 배달 주문 | 배달중 (상태) | Delivering | 배달 대행사의 배달원을 통해 손님의 주문 주소로 메뉴가 배달되고 있는 상태. 배달 주문인 경우에만 나타날 수 있다. |
-| 배달 주문 | 서빙 | Serving | 손님이 주문한 배달 대행사의 배달원에게 전달하는 행위. |
-| 배달 주문 | 서빙 완료 (상태) | Served | 서빙을 통해 메뉴를 배달 대행사의 배달원에게 전달 완료한 상태. |
-| 배달 주문 | (주문) 완료 (상태) | Completed | 주문 과정이 종결된 상태로 추가적인 작업이 필요하지 않음. 배달이 완료된 상태여야 주문이 완료될 수 있다. |
-| 포장 주문 | 서빙 | Serving | 손님이 주문한 메뉴를 손님에게 직접 전달하는 행위. |
-| 포장 주문 | 서빙 완료 (상태) | Served | 서빙을 통해 메뉴를 손님에게 직접 전달 완료한 상태. |
-| 포장 주문 | (주문) 완료 (상태) | Completed | 주문 과정이 종결된 상태로 추가적인 작업이 필요하지 않음. 서빙이 완료된 상태여야 주문이 완료될 수 있다. |
-| 포장 주문 | 포장 (주문) | Takeout | 손님이 매장에 방문하여 메뉴를 직접 전달받지만 매장 내에서 주문 테이블을 점유하지는 않는 유형. |
+### 공통
+
+| 한글명 | 영문명 | 설명 |
+|-----|-------------|------------------------------------------------------------------------------|
+| 가격 | Price | 상품 또는 메뉴의 대가로 손님이 지불하는 금액. 한국 원 단위이며 0원 이상이다. |
+| 비속어 | Profanity | 욕설이나 비하하는 말, 예절에 어긋나게 대상을 낮추거나 품위 없이 천한 말. |
+| 손님 | Guest | 메뉴를 임의의 주문 유형으로 주문할 수 있는 사람. |
+| 수량 | Quantity | 특정 유형은 가진 개체들의 수. 예) 메뉴 수량, 주문 수량. A 메뉴를 2개, B 메뉴를 3개 주문했다면 수량은 5개이다. |
+| 종류 | Cardinality | 특정 유형을 가진 개체들의 고유한 가짓수. 예) 상품 종류, 메뉴 종류. A 메뉴를 2개, B 메뉴를 3개 주문했다면 종류는 2가지이다. |
+
+### 상품
+
+| 한글명 | 영문명 | 설명 |
+|-----|---------|---------------------------------|
+| 상품 | Product | 실제로 손님에게 전달할 수 있는 음식, 음료 등의 물건. |
+
+### 메뉴
+
+| 한글명 | 영문명 | 설명 |
+|----------|-----------------------|------------------------------------------|
+| 메뉴 | Menu | 하나 이상의 상품으로 구성된 실제로 손님에게 판매 가능한 단위. |
+| (메뉴) 노출 | Display | 메뉴를 목록 또는 화면에 보여지게 함. |
+| (메뉴) 숨김 | Hide | 메뉴를 목록 또는 화면에 보여지지 않게 함. |
+| 메뉴 상품 | Menu product | 메뉴에 포함되는 상품의 정보로 상품의 식별자와 메뉴 상품 수량을 갖는다. |
+| 메뉴 상품 수량 | Menu product quantity | 메뉴에 포함되는 상품의 수량. |
+| 소계 | Subtotal | 메뉴에 포함되는 각 상품의 개당 가격에 메뉴 상품 수량을 곱한 가격. |
+| 메뉴 그룹 | Menu group | 메뉴의 집합으로 모든 메뉴는 하나의 메뉴 그룹에 속해야 한다. |
+
+### 매장 주문
+
+| 한글명 | 영문명 | 설명 |
+|-----------------|-----------------|---------------------------------------------------------------------------------------|
+| 빈 테이블 | Empty table | 손님이 없는 주문 테이블. |
+| 점유된 테이블 | Occupied table | 손님이 앉은 주문 테이블. |
+| 주문 테이블 | Order table | 손님이 앉아서 메뉴를 주문할 수 있는 테이블. 주문 테이블은 손님에 의해 점유되어 있거나 비어 있다. |
+| (주문) 접수 (상태) | Accepted | 손님이 생성한 주문을 매장에서 확인한 상태. |
+| (주문) 접수 대기 (상태) | Waiting | 손님이 주문을 생성했지만 아직 매장에서 확인하지 않은 상태. |
+| 주문 | Order | 손님이 메뉴를 어떤 유형으로 전달받을지 지정하여 요구한 것. 주문 유형, 주문 항목, 주문 상태, 주문 시각, 배달 주소, 주문 테이블 정보를 포함한다. |
+| 주문 상태 | Order status | 하나의 주문이 처리되는 과정. 하나의 주문은 한 시점에 단 하나의 상태여야 한다(동시에 여러 상태일 수 없다). |
+| 주문 유형 | Order type | 주문에 포함된 메뉴들이 손님에게 전달되는 방법. 배달, 포장, 매장이 있다. |
+| 주문 항목 | Order line item | 주문의 일부분으로 하나의 메뉴와 그 수량, 그리고 가격으로 구성된다. 하나의 주문에는 한 개 이상의 주문 항목이 포함되어 있어야 한다. |
+| 매장 (주문) | Eat in | 주문 테이블을 점유한 손님에게 메뉴가 전달되는 주문 유형. |
+| 서빙 | Serving | 손님이 주문한 메뉴를 손님에게 손님이 앉아 있는 주문 테이블로 전달하는 행위. |
+| 서빙 완료 (상태) | Served | 서빙을 통해 메뉴를 손님에게 손님이 앉아 있는 주문 테이블로 전달 완료한 상태. |
+| (주문) 완료 (상태) | Completed | 주문 과정이 종결된 상태로 추가적인 작업이 필요하지 않음. 서빙이 완료된 상태여야 주문이 완료될 수 있다. |
+
+### 배달 주문
+
+| 한글명 | 영문명 | 설명 |
+|-----------------|------------------|---------------------------------------------------------------------------------------|
+| (주문) 접수 (상태) | Accepted | 손님이 생성한 주문을 매장에서 확인한 상태. |
+| (주문) 접수 대기 (상태) | Waiting | 손님이 주문을 생성했지만 아직 매장에서 확인하지 않은 상태. |
+| 주문 | Order | 손님이 메뉴를 어떤 유형으로 전달받을지 지정하여 요구한 것. 주문 유형, 주문 항목, 주문 상태, 주문 시각, 배달 주소, 주문 테이블 정보를 포함한다. |
+| 주문 상태 | Order status | 하나의 주문이 처리되는 과정. 하나의 주문은 한 시점에 단 하나의 상태여야 한다(동시에 여러 상태일 수 없다). |
+| 주문 유형 | Order type | 주문에 포함된 메뉴들이 손님에게 전달되는 방법. 배달, 포장, 매장이 있다. |
+| 주문 항목 | Order line item | 주문의 일부분으로 하나의 메뉴와 그 수량, 그리고 가격으로 구성된다. 하나의 주문에는 한 개 이상의 주문 항목이 포함되어 있어야 한다. |
+| 배달 (주문) | Delivery | 손님이 지정한 배달 주소로 배달 대행사를 통해 메뉴가 전달되는 주문 유형. |
+| 배달 대행사 | Delivery agency | 어떤 물건 또는 음식 등의 배달 업무를 대행해주는 사업자. |
+| 배달 완료 (상태) | Delivered | 배달 대행사의 배달원을 통해 손님의 주문 주소로 메뉴가 배달 완료된 상태. 배달 주문인 경우에만 나타날 수 있다. |
+| 배달 주소 | Delivery address | 손님이 메뉴를 전달 받고 싶어하는 위치를 주소로 나타낸 것. 배달 주문인 경우 반드시 있어야 한다. |
+| 배달중 (상태) | Delivering | 배달 대행사의 배달원을 통해 손님의 주문 주소로 메뉴가 배달되고 있는 상태. 배달 주문인 경우에만 나타날 수 있다. |
+| 서빙 | Serving | 손님이 주문한 배달 대행사의 배달원에게 전달하는 행위. |
+| 서빙 완료 (상태) | Served | 서빙을 통해 메뉴를 배달 대행사의 배달원에게 전달 완료한 상태. |
+| (주문) 완료 (상태) | Completed | 주문 과정이 종결된 상태로 추가적인 작업이 필요하지 않음. 배달이 완료된 상태여야 주문이 완료될 수 있다. |
+
+### 포장 주문
+
+| 한글명 | 영문명 | 설명 |
+|-----------------|-----------------|---------------------------------------------------------------------------------------|
+| (주문) 접수 (상태) | Accepted | 손님이 생성한 주문을 매장에서 확인한 상태. |
+| (주문) 접수 대기 (상태) | Waiting | 손님이 주문을 생성했지만 아직 매장에서 확인하지 않은 상태. |
+| 주문 | Order | 손님이 메뉴를 어떤 유형으로 전달받을지 지정하여 요구한 것. 주문 유형, 주문 항목, 주문 상태, 주문 시각, 배달 주소, 주문 테이블 정보를 포함한다. |
+| 주문 상태 | Order status | 하나의 주문이 처리되는 과정. 하나의 주문은 한 시점에 단 하나의 상태여야 한다(동시에 여러 상태일 수 없다). |
+| 주문 유형 | Order type | 주문에 포함된 메뉴들이 손님에게 전달되는 방법. 배달, 포장, 매장이 있다. |
+| 주문 항목 | Order line item | 주문의 일부분으로 하나의 메뉴와 그 수량, 그리고 가격으로 구성된다. 하나의 주문에는 한 개 이상의 주문 항목이 포함되어 있어야 한다. |
+| 서빙 | Serving | 손님이 주문한 메뉴를 손님에게 직접 전달하는 행위. |
+| 서빙 완료 (상태) | Served | 서빙을 통해 메뉴를 손님에게 직접 전달 완료한 상태. |
+| (주문) 완료 (상태) | Completed | 주문 과정이 종결된 상태로 추가적인 작업이 필요하지 않음. 서빙이 완료된 상태여야 주문이 완료될 수 있다. |
+| 포장 (주문) | Takeout | 손님이 매장에 방문하여 메뉴를 직접 전달받지만 매장 내에서 주문 테이블을 점유하지는 않는 유형. |
## 모델링
@@ -155,19 +196,24 @@ docker compose -p kitchenpos up -d
* `Menu`는 하나의 `MenuGroup`을 갖는다(`Menu`는 하나의 `MenuGroup`에 속한다).
* `Menu`는 노출 여부 상태를 갖는다.
* `Menu`는 `Price`를 갖는다.
- * `Menu`의 `Price`는 메뉴 가격 정책을 따라야 한다.
+ * `Menu`의 `Price`를 변경할 수 있다.
+ * `Menu`의 `Price`는 메뉴 노출 정책을 따라야 한다.
+ * `Menu`의 `Price`는 메뉴 노출 정책을 위반하도록 변경할 수 없다.
* `Menu`는 `Menu`에 포함되는 하나 이상의 `MenuProduct`를 갖는다.
#### 메뉴 그룹
* `MenuGroup`은 `Name`을 갖는다.
-*
#### 메뉴 상품
* `MenuProduct`는 `Product`의 식별자를 갖는다.
-* `MenuProduct`는 상품의 수량을 갖는다.
- * 상품의 수량은 `1` 이상이다.
+* `MenuProduct`는 `Product`의 개당 `Price`를 갖는다.
+* `MenuProduct`는 `MenuProductQuantity`를 갖는다.
+
+##### 메뉴 상품 수량
+
+* `MenuProductQuantity`은 `1` 이상이다.
#### 메뉴 노출 정책
diff --git a/src/main/java/kitchenpos/common/price/Price.java b/src/main/java/kitchenpos/common/price/Price.java
index a716d2122..542ae3939 100644
--- a/src/main/java/kitchenpos/common/price/Price.java
+++ b/src/main/java/kitchenpos/common/price/Price.java
@@ -8,7 +8,7 @@
*
가격은 음수일 수 없다.
*
*/
-public class Price {
+public class Price implements Comparable {
public final BigDecimal value;
@@ -30,6 +30,23 @@ public Price(double value) {
this(BigDecimal.valueOf(value));
}
+ public Price add(Price augend) {
+ return new Price(this.value.add(augend.value));
+ }
+
+ public Price multiply(BigDecimal multiplicand) {
+ return new Price(this.value.multiply(multiplicand));
+ }
+
+ public Price multiply(long multiplicand) {
+ return this.multiply(BigDecimal.valueOf(multiplicand));
+ }
+
+ @Override
+ public int compareTo(Price o) {
+ return this.value.compareTo(o.value);
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) {
diff --git a/src/main/java/kitchenpos/menu/api/MenuGroupRestController.java b/src/main/java/kitchenpos/menu/api/MenuGroupRestController.java
index 7d719de59..3de01c8e1 100644
--- a/src/main/java/kitchenpos/menu/api/MenuGroupRestController.java
+++ b/src/main/java/kitchenpos/menu/api/MenuGroupRestController.java
@@ -3,7 +3,8 @@
import java.net.URI;
import java.util.List;
import kitchenpos.menu.application.MenuGroupService;
-import kitchenpos.menu.domain.MenuGroup;
+import kitchenpos.menu.tobe.application.dto.CreateMenuGroupCommand;
+import kitchenpos.menu.tobe.domain.entity.MenuGroup;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@@ -21,9 +22,9 @@ public MenuGroupRestController(final MenuGroupService menuGroupService) {
}
@PostMapping
- public ResponseEntity create(@RequestBody final MenuGroup request) {
+ public ResponseEntity create(@RequestBody final CreateMenuGroupCommand request) {
final MenuGroup response = menuGroupService.create(request);
- return ResponseEntity.created(URI.create("/api/menu-groups/" + response.getId()))
+ return ResponseEntity.created(URI.create("/api/menu-groups/" + response.id))
.body(response);
}
diff --git a/src/main/java/kitchenpos/menu/api/MenuRestController.java b/src/main/java/kitchenpos/menu/api/MenuRestController.java
index 754fa4142..77bb702e9 100644
--- a/src/main/java/kitchenpos/menu/api/MenuRestController.java
+++ b/src/main/java/kitchenpos/menu/api/MenuRestController.java
@@ -4,7 +4,9 @@
import java.util.List;
import java.util.UUID;
import kitchenpos.menu.application.MenuService;
-import kitchenpos.menu.domain.Menu;
+import kitchenpos.menu.tobe.application.dto.ChangeMenuPriceCommand;
+import kitchenpos.menu.tobe.application.dto.CreateMenuCommand;
+import kitchenpos.menu.tobe.domain.entity.Menu;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@@ -17,6 +19,7 @@
@RequestMapping("/api/menus")
@RestController
public class MenuRestController {
+
private final MenuService menuService;
public MenuRestController(final MenuService menuService) {
@@ -24,15 +27,22 @@ public MenuRestController(final MenuService menuService) {
}
@PostMapping
- public ResponseEntity