Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

step2 미션 제출합니다. #400

Open
wants to merge 1 commit into
base: ksy90101
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
272 changes: 272 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -255,3 +255,275 @@ docker compose -p kitchenpos up -d
| 배달을 완료했다. | complete delivery | 배달기사가 주문한 메뉴를 손님에게 전달을 완료했다. |

## 모델링

### 상품(Product)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

모델링 또한 컨텍스트별로 잘 분리해주셨네요. 👍💯


#### 상태
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

모델링을 속성과 상태로 분리해서 잘 작성해주셨네요!! 🤩👍👍


- 상품명(name)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

용어 사전에서 정의했던 영어 명을 그대로 사용해보면 어떨까요? 🙂

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

모델링의 용어들을 모두 한글명으로 작성해주셨는데, 영문명으로 변경하거나 혹은 영문명과 한글명을 같이 표현한다면
모델링 문서를보면서 실제로 코드로 옮기는 작업이 조금 더 쉽지 않을까요? 🙂

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사실 이게 조금 고민이였는데, 용어 사전에서는 상품명이지만, 실제 모델에서의 해당 부분은 name (이름) 이 되는거 같아요.
사실 저희는 상품명(product name)이 있고 name은 이름이라고 생각하고 있었는데
혹시 이런 경우에는 좀 어떻게 해야 할지 난감한거 같습니다.

아울러 모델링의 용어들을 모두 한글명으로 작성해주셨는데, 영문명으로 변경하거나 혹은 영문명과 한글명을 같이 표현한다면 이게 어떤 의미인지 좀더 설명이 가능할까요?

Copy link

@Rok93 Rok93 May 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제가 조금 헷갈리게 코멘트를 달아둔 것 같네요. 👀 🙏

예를 들자면 아래와 같이 정의하신 영문명 용어를 같이 표현해주면 나중에 모델링 문서를 코드로 옮기기가 더 쉬울 것 같다는 이야기였어요. 🙂

AS IS

  • 상품을 등록할 수 있다.

TO BE

  • 상품(product)를 등록(create)할 수 있다.

- 상품명은 필수값이다.
- 상품명은 비속어를 포함할 수 없다.
- 가격(price)
- 가격은 필수값이다.
- 가격은 0원보다 작을 수 없다.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사소하지만 이런 케이스는 부정보다는 긍정으로 작성하는게 조금 더 잘 읽힐 것 같아요. 🙂

Suggested change
- 가격은 0원보다 작을 수 없다.
- 가격은 0원 이상이어야한다.


#### 행위

- 상품을 등록할 수 있다.
- PurgomalumClient를 통해 비속어 검증을 한다.
- 상품 가격을 변경할 수 있다.
- 메뉴의 가격이 메뉴에 속한 상품 가격의 합보다 클 경우 메뉴는 숨겨진다.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

용어사전에서는 미노출한다 혹은 숨김 메뉴와 같은 용어를 사용하셨는데 여기서는 숨겨진다와 같은 용어를 쓰고있어요.

메뉴를 '미노출하면' '숨김 메뉴'가 된다고 볼 수 있을 것 같은데, 이 부분도 용어를 통일시켜보면 어떨까요? 🤔

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

또한 사소할 수 있지만 용어 사전으로 정의한 용어라면 (백틱)을 사용하여 한눈에 알아볼 수 있도록 표시해주는 것도 문서를 조금 더 읽기 쉽게 만들어줄 수 있을 것 같네요. 🙂

- 상품을 조회할 수 있다.

### 메뉴 그룹(MenuGroup)

#### 상태

- 이름(name)
- 메뉴 그룹 이름은 필수값이다.
- 메뉴 그룹 이름은 비어있을 수 없다.

#### 행위

- 메뉴 그룹을 등록할 수 있다.
- 메뉴 그룹을 조회할 수 있다.

### 메뉴(Menu)

#### 상태

- 이름(name)
- 상품명은 필수값이다.
- 상품명은 비속어를 포함할 수 없다.
- 가격(price)
- 가격은 필수값이다.
- 가격은 0원 이상이어야 한다.
- 메뉴 그룹(menuGroup)
- 메뉴 그룹은 필수값이다.
- 노출 상태(displayed)
- 노출 상태는 필수값이다.
- 메뉴 상품(menuProducts)
- 메뉴에 속한 상품은 1개 이상이어야 한다.

#### 행위

- 메뉴를 등록할 수 있다.
- PurgomalumClient를 통해 비속어 검증을 한다.
- 메뉴에 속한 상품 중에 존재하지 않는 상품이 있으면 등록할 수 없다.
- 가격은 메뉴 상품 가격의 합보다 작거나 같아야 한다.
- 메뉴 가격을 변경할 수 있다.
- 가격은 메뉴 상품 가격의 합보다 작거나 같아야 한다.
- 메뉴를 노출할 수 있다.
- 가격은 메뉴 상품 가격의 합보다 작거나 같아야 한다.
- 메뉴를 미노출할 수 있다.
- 메뉴를 조회할 수 있다.

### 메뉴 상품(MenuProduct)

#### 상태

- 상품(product)
- 상품은 필수값이다.
- 수량(quantity)
- 수량은 필수값이다.
- 수량은 0 보다 커야 한다.

### 주문 테이블(OrderTable)

#### 상태

- 이름(name)
- 주문 테이블 이름은 필수값이다.
- 주문 테이블 이름은 비어있을 수 없다.
- 손님 수(numberOfGuests)
- 손님 수는 0명 이상이어야 한다.
- 착석 여부(occupied)

#### 행위

- 주문 테이블을 등록할 수 있다.
- 손님 수는 0명으로 설정된다.
- 착석 여부는 미착석으로 설정된다.
- 주문 테이블에 착석할 수 있다.
- 존재하지 않는 주문 테이블에 착석할 수 없다.
- 주문 테이블을 치울 수 있다.
- 존재하지 않는 주문 테이블에 착석할 수 없다.
- 완료되지 않은 주문이 있는 주문 테이블은 치울 수 없다.
- 손님 수는 0명으로 설정된다.
- 주문 테이블의 손님 수를 변경할 수 있다.
- 존재하지 않는 주문 테이블에 착석할 수 없다.
- 미착석인 주문 테이블의 손님 수를 변경할 수 없다.
- 주문 테이블을 조회할 수 있다.

### 주문 내역(OrderLineItem)

#### 상태

- 메뉴(menu)
- 메뉴는 필수값이다.
- 수량(quantity)
- 수량은 필수값이다.
- 포장하기와 배달하기의 주문 내역 수량은 0 이상이여야 한다.
- 가격(price)

### 주문(Order)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

용어 사전처럼 주문 유형별로 컨텍스트를 분리해서 모델링해보면 어떨까요? 🙂


#### 상태

- 주문 유형(type)
- 주문 유형은 필수값이다.
- 주문 상태(status)
- 주문 시간(orderDateTime)
- 주문 내역(orderLineItems)
- 주문 내역은 필수값이다.
- 주문 내역은 1개 이상이여야 한다.
- 배달 주소(deliveryAddress)
- 배달하기 주문인 경우에는 핋수값이다.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오타인 것 같아요. 👀

Suggested change
- 배달하기 주문인 경우에는 핋수값이다.
- 배달하기 주문인 경우에는 필수값이다.

- 배달하기 주문인 경우에는 비어있을 수 없다.
- 주문 테이블(orderTable)
- 먹고가기인 경우 주문 테이블은 필수값이다.

#### 행위

- 주문을 할 수 있다.
- 존재하지 않는 메뉴는 주문할 수 없다.
- 먹고가기인 경우 존재하지 않은 주문 테이블에 주문할 수 없다.
- 포장하기와 배달하기의 주문 내역 수량은 0 이상이여야 한다.
- 주문 내역의 속해있는 메뉴가 존재하지 않으면 주문할 수 없다.
- 메뉴가 미노출인 경우 주문할 수 없다.
- 메뉴 상태는 대기중으로 설정된다.
- 주문 시간은 현재 시간으로 설정된다.
- 주문 테이블이 미착석인 경우 주문할 수 없다.
- 주문을 수락할 수 있다.
- 존재하지 않는 주문은 수락할 수 없다.
- 주문 상태가 대기중인 주문만 수락할 수 있다.
- 배달하기 주문인 경우 배달 기사에 배달을 요청할 수 있다.
- KitchenridersClient를 통해 배달을 요청한다.
- 주문 상태를 수락으로 변경한다.
- 주문을 서빙할 수 있다.
- 존재하지 않는 주문은 서빙할 수 없다.
- 수락된 주문만 서빙할 수 있다.
- 주문 상태를 서빙으로 변경한다.
- 배달을 시작할 수 있다.
- 존재하지 않는 주문은 배달할 수 없다.
- 배달하기 주문이 경우에만 배달할 수 있다.
- 서빙된 주문만 배달할 수 있다.
- 주문 상태를 배달중으로 변경한다.
- 배달을 완료할 수 있다.
- 존재하지 않는 주문은 배달을 완료할 수 없다.
- 배달중인 주문만 배달할 수 있다.
- 주문 상태를 배달완료로 변경한다.
- 주문을 완료할 수 있다.
- 존재하지 않는 주문은 주문을 완료할 수 없다.
- 배달하기 주문의 경우 배달 완료된 주문만 완료할 수 있다.
- 포장하기 및 먹고가기 주문의 경우 서빙된 주문만 완료할 수 있다.
- 주문 상태를 주문완료로 변경한다.
- 먹고가기 주문인 경우 해당 주문 테이블의 모든 주문이 완료된 경우에만 테이블을 치울 수 있다.
- 주문을 조회할 수 있다.

```mermaid
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mermaid 활용한 도식화 👍💯

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

용어 사전처럼 주문 유형별로 컨텍스트를 분리해서 모델링해보면 어떨까요? 🙂

위의 피드백을 반영한다면 이 부분도 변경이 필요하겠네요! 👀

classDiagram
MenuGroup "1" --> "*" Menu
Menu "1" <-- "*" MenuProduct
MenuProduct "1" <-- "*" Product
Order "1" --> "*" OrderLineItem
OrderTable "1" --> "*" Order
OrderLineItem "1" <-- "*" Menu
OrderStatus -- Order
OrderType -- Order

class Product {
UUID id
String name // 상품명
BigDecimal price // 가격
}
class MenuGroup {
UUID id
String name // 이름
}
class Menu {
UUID id
String name // 이름
BigDecimal price // 가격
MenuGroup menuGroup // 메뉴 그룹
boolean displayed // 노출 상태
List~MenuProduct~ menuProducts // 메뉴상품
}
class MenuProduct {
Long seq
Product product // 상품
long quantity // 수량
}
class OrderTable {
UUID id
String name // 이름
int numberOfGuests // 손님 수
boolean occupied // 착석 여부
}
class OrderLineItem {
UUID id
Menu menu // 메뉴
long quantity // 수량
BigDecimal price // 가격
}
class Order {
UUID id
OrderType type // 주문 유형
OrderStatus status // 주문 상태
LocalDateTime orderDateTime // 주문 시간
List~OrderLineItem~ orderLineItems // 주문 내역
String deliveryAddress // 배달 주소
OrderTable orderTable // 주문 테이블
}
class OrderStatus {
<<enumeration>>
WAITING // 대기중
ACCEPTED // 수락
SERVED // 서빙
DELIVERING // 배달중
DELIVERED // 배달 완료
COMPLETED // 완료
}
class OrderType {
<<enumeration>>
EAT_IN // 먹고가기
TAKEOUT // 포장하기
DELIVERY // 배달하기
}
```

## 정책
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

정책을 따로 정리해주셨군요? 👍

단지 조금 고민해볼 부분은 주문 유형별로 컨텍스트를 분리해서 속성, 행위를 모델링했다면
정책으로 정리한 요소들은 각 컨텍스트의 속성에서 다룰 수 있었을 것 같다고 생각하는데, 세윤님은 어떻게 생각하시나요? 🙂


### 배달하기

1. (손님) 배달하기 주문을 한다. - 대기중
2. (사장님) 배달하기 주문을 수락한다. - 수락
3. (사장님) 배달 기사에게 배달을 요청한다.
4. (사장님) 메뉴를 완성하여, 배달 기사가 배달할 수 있도록 메뉴를 놔둔다. - 서빙
5. (배달 기사) 배달을 시작한다. - 배달중
6. (배달 기사) 배달을 완료한다. - 배달완료
7. (사장님) 주문을 완료한다. - 주문완료

### 포장하기

1. (손님) 포장하기 주문을 한다. - 대기중
2. (사장님) 포장하기 주문을 수락한다. - 수락
3. (사장님) 메뉴를 완성하여 손님이 가져갈 수 있도록 메뉴를 놔둔다. - 서빙
4. (사장님) 손님이 메뉴를 가져가고 주문을 완료한다. - 주문완료

### 먹고가기

1. (손님) 비어있는 주문 테이블에 착석한다.
2. (사장님) 주문 테이블의 손님수를 설정한다.
3. (손님) 먹고가기 주문을 한다. - 대기중
4. (사장님) 먹고가기 주문을 수락한다. - 수락
5. (사장님) 메뉴를 완성한다. - 서빙
6. (사장님) 손님에게 메뉴를 직접 가져다 드리고 주문을 완료한다. - 주문완료
7. (사장님) 해당 주문테이블에 모든 주문이 완료되면 주문 테이블을 치운다.

### 메뉴 생성

1. (사장님) 상품을 등록한다.
2. (사장님) 메뉴 그룹을 등록한다.
3. (사장님) 메뉴 상품을 설정한다.
4. (사장님) 메뉴를 등록한다.