cd docker
docker compose -p kitchenpos up -d
-
각 상품은 상품명과 가격을 필수로 가진다.
- 상품의 가격은 비어있지 않고, 0원 이상이어야 한다.
- 상품명은 비어있거나 욕설을 포함할 수 없다. 욕설의 포함 여부는 외부에 요청해서 검증한다.
- 상품의 가격은 비어있지 않고, 0원 이상이어야 한다.
- 상품명은 비어있거나 욕설을 포함하지 않아야한다..
- 변경하려는 가격은 0원 이상이어야 한다.
- 상품이 속해있는 메뉴 가격과 메뉴에 속해있는 모든 상품들의 가격 합계를 비교하여, 만약 메뉴의 가격이 속해있는 상품들의 총 합계 가격보다 높을 경우 자동으로 메뉴를 숨김 상태로 설정한다.
-
각 메뉴는 메뉴명, 가격, 그리고 노출 여부을 필수로 가진다.
- 메뉴명은 비어있거나 욕설을 포함할 수 없다. 욕설의 포함 여부는 외부에 요청해서 검증한다.
- 각 메뉴의 가격은 비어있지 않고, 0원 이상이어야 한다.
- 메뉴의 가격은 현재 메뉴에 포함된 상품들의 총합 가격보다 같거나 낮아야 한다.
- 메뉴 등록, 가격 변경 그리고 노출로 메뉴 변경 시, 요청 가격은 현재 메뉴에 포함된 상품들의 총합 가격보다 같거나 낮아야 한다.
-
각 메뉴는 소속된 메뉴 그룹의 ID를 참조한다.
- 메뉴명이 비어있지 않으며 욕설을 포함하지 않아야 한다.
- 생성하려는 메뉴의 가격은 0원 이상이어야 한다.
- 생성하려는 메뉴의 가격이 메뉴에 포함된 상품들의 총합 가격보다 같거나 낮아야 한다.
- 메뉴를 생성할 때는 먼저 메뉴에 해당하는 메뉴 그룹이 존재해야 한다.
- 메뉴에 속한 상품의 갯수가 0개 미만일 경우 생성할 수 없다.
- 메뉴의 새로운 가격이 비어있지 않고, 0원 이상일 때에만 변경 가능하다.
- 변경 하고자 하는 메뉴 가격이 현재 메뉴에 포함된 상품들의 총합 가격보다 같거나 낮아야 한다.
- 메뉴의 가격이 현재 메뉴에 포함된 상품들의 총합 가격보다 같거나 낮은 경우에만 메뉴를 노출 상태로 변경할 수 있다.
- 메뉴를 숨김 상태로 변경할 때는 메뉴 노출 때와 달리 상품들의 총합 가격을 검증하지 않는다.
- 메뉴 상품은 상품 ID와 메뉴 ID를 필수로 가진다.
- 각 메뉴 상품은 수량 정보를 포함한다.
-
각 메뉴 그룹은 메뉴 그룹명을 필수로 가진다.
- 메뉴 그룹명은 비어있을 수 없다.
- 메뉴 그룹명이 비어있을 때는 생성할 수 없다.
-
주문은 선택적으로 배달 주소를 가질 수 있다.
-
각 주문은 주문 시간을 기록한다.
-
주문은 주문 방법을 가진다.
- 주문 방법은
DELIVERY, TAKEOUT, EAT_IN
중 하나이다.
- 주문 방법은
-
각 주문은 현재의 진행 상태를 나타낸다.
- 진행 상태는
WAITING, ACCEPTED, SERVED, DELIVERING, DELIVERED, COMPLETED
중 하나이다. - 주문 진행 상태는 주문 방법에 따라 플로우와 진행 상태가 달라진다.
- 배달 주문(
DELIVERY
)은WAITING
상태에서 시작하여,ACCEPTED
,SERVER
,DELIVERING
,DELIVERED
를 거쳐COMPLETED
로 마무리된다. - 테이크 아웃(
TAKEOUT
)은WAITING
상태에서 시작하여,ACCEPTED
,SERVER
단계를 거쳐 직접 고객에게 제공된 후COMPLETED
로 마무리된다. - 매장 내 식사(
EAT_IN
)은WAITING
상태에서 시작하여,ACCEPTED
,SERVER
단계를 거쳐 모든 서비스가 제공된 후COMPLETED
로 마무리된다.
- 진행 상태는
-
주문은 선택적으로 주문 테이블의 ID를 가질 수 있다.
- 주문이 주문 테이블의 ID를 가지는 경우는 주문 방법이
EAT_IN
즉 매장 내 식사일 경우일 때이다.
- 주문 생성 시 주문 방법이 지정되어 있어야 한다.
- 주문 내역은 비어있을 수 없다.
- 매장 내 식사(
EAT_IN
)를 제외한 모든 주문 타입에서는 주문한 메뉴의 수량이 0 이상이어야 한다. - 각 메뉴 항목은 메뉴가 노출 상태이어야 하며, 메뉴 가격이 주문내역 항목 가격과 일치해야 한다.
- 배달 주소는 배달 주문(
Delivery
) 시 필수이다. - 매장 내 식사(
EAT_IN
)의 경우, 해당 주문 테이블이 사용 중이어야 한다.
- 주문은
WAITING
상태에서만 수락할 수 있다. - 배달 주문은 배달 요청이 가능해야 하며, 주문 금액과 배달 주소가 필요하다.
- 주문 배달의 경우 라이더를 외부 제품을 사용해서 호출한다.
- 주문은
ACCEPTED
상태에서만 제공할 수 있다. - 주문 상태를
SERVED
로 변경한다.
- 배달 주문은
SERVED
상태와 주문 방법이DELIVERY
일 경우에만 배달을 시작할 수 있다. - 주문 상태를
DELIVERING
으로 변경한다.
- 주문은
DELIVERING
상태에서만 배달 완료로 처리할 수 있다. - 주문 상태를
DELIVERED
로 변경한다.
- 배달 주문은
DELIVERED
상태에서만 주문 완료로 처리할 수 있다. - 테이크아웃 또는 매장 내 식사는
SERVED
상태에서만 주문 완료로 처리할 수 있다. - 매장 내 식사의 경우 주문이 완료되면 주문 테이블을 치운다.
- 테이블을 치울 때는 해당 테이블의 모든 주문이 완료된 상태여야만 가능하다.
- 주문 상태를
COMPLETED
로 변경한다.
- 주문이 주문 테이블의 ID를 가지는 경우는 주문 방법이
-
각 주문 테이블은 테이블의 이름을 필수로 가진다.
- 테이블의 이름은 비어있을 수 없다.
-
각 테이블은 현재 테이블의 사용 여부를 나타내는 상태값을 필수로 가진다.
- 테이블은 처음에는 사용 중이지 않은 상태(false)로 생성된다.
- 손님이 앉으면 상태가 사용 중 상태(true)로 변경된다.
-
각 테이블은 앉아 있는 손님 수를 필수로 기록한다.
- 초기에는 0명으로 설정된다.
- 손님 수는 0명 이상이어야 하며, 테이블이 비어있을 때(false)는 수정할 수 없다.
- 테이블의 이름은 비어있을 수 없다.
- 테이블은 처음에는 착석한 인원 0명, 그리고 사용 중이지 않은 상태(false)로 생성된다.
- 테이블에 착석하면 테이블을 사용 중 상태(true)로 변경한다.
- 주문이 완료된 상태(
COMPLETED
)가 아니라면 테이블을 치울 수 없다. - 테이블을 치우면 착석한 인원 0명, 그리고 사용 중이지 않은 상태(false)로 변경한다.
- 테이블에 착석하는 인원은 0명 이상이어야 한다.
- 테이블이 사용 중 상태(true)가 아니라면 변경할 수 없다.
- 각 주문 내역 항목(주문 내역)은 메뉴 ID와 연결되어 어떤 메뉴가 주문되었는지를 식별한다.
- 각 주문 내역 항목(주문 내역)은 주문 ID를 참조하여 해당 주문 항목이 속한 주문을 식별한다.
한글명 | 영문명 | 설명 |
---|---|---|
비속어 | profanity | 키친포스에서 사용할 수 없는 단어들을 의미한다. |
손님 | guest | 주문을 하는 사람을 의미한다. |
사용자 | user | 키친포스를 사용하는 사람을 의미한다. 여기서는 사장님이 된다. |
가격 정책 | price policy | 키친포스에서 사용하는 가격의 규칙을 의미한다. |
한글명 | 영문명 | 설명 |
---|---|---|
상품 | product | 음식을 뜻한다. e.g. 탕후루, 마라탕 |
상품 가격 | price | 상품의 가격으로 0원 이상이다. |
상품명 | name | 상품의 이름으로 비속어를 포함할 수 없다. |
한글명 | 영문명 | 설명 |
---|---|---|
메뉴그룹 | menu group | 여러 메뉴들을 하나의 그룹으로 묶은 것을 의미한다. e.g. 이번 달 추천 메뉴 |
메뉴그룹명 | menu group name | 메뉴 그룹의 이름으로 비속어를 포함할 수 없다. |
한글명 | 영문명 | 설명 |
---|---|---|
메뉴 | menu | 메뉴 그룹에 속하고, 한개 이상의 상품을 포함하고 있어야 한다. e.g. 후라이드 치킨 세트 |
메뉴명 | menu name | 메뉴의 이름으로 비속어를 포함할 수 없다. |
메뉴상품 | menu product | 하나의 메뉴에 포함된 상품과 상품 수량들을 의미한다. e.g. 치킨 1개 + 콜라 500ml 1개 |
노출 상태 | displayed | 메뉴의 숨김/노출 상태를 의미한다.(메뉴가 숨김 상태일때 손님은 주문할 수 없다.) |
메뉴상품의 수량 | quantity | 메뉴에 포함된 상품의 개수를 의미한다. |
메뉴 가격 | price | 메뉴의 가격으로 0원 이상이다. |
숨김 메뉴 | hidden state | 숨겨진 메뉴를 의미한다. |
노출 메뉴 | visible state | 노출된 메뉴를 의미한다. |
한글명 | 영문명 | 설명 |
---|---|---|
주문 항목 | order line item | 주문한 메뉴를 의미한다. |
주문 종류 | order type | 주문 종류를 의미한다. |
배달 | delivery | 주문 종류에 속하며 배달로 처리되는 주문을 의미한다. |
포장 | takeout | 주문 종류에 속하며 테이크아웃으로 처리되는 주문을 의미한다. |
매장 주문 | eat in | 주문 종류에 속하며 매장 내 식사로 처리되는 주문을 의미한다. |
주문 상태 | order status | 주문의 진행 상태를 의미한다. |
주문 접수 중 | waiting | 주문이 접수되었으나 아직 처리되지 않은 상태를 의미한다. |
주문 수락 | accepted | 주문이 확인되어 상품을 준비 중인 상태를 의미한다. |
준비 완료 | served | 상품이 준비가 완료되어 고객에 제공될 수 있는 상태를 의미한다. |
배달 중 | delivering | 상품이 배달 중인 상태를 의미한다.(주문 종류가 배달 일 때만 존재한다.) |
배달 완료 | delivered | 상품이 배달 완료가 된 상태를 의미한다.(주문 종류가 배달 일 때만 존재한다.) |
주문 완료 | completed | 주문이 전부 완료된 상태를 의미한다. |
배달 주소 | delivery address | 배달 주문지를 의미한다. e.g. 서울특별시 … 강남구 |
배달 담당자 | delivery rider | 손님에게 상품을 전달하는 역할을 맡은 외부 대행자를 의미한다. |
- 매장 주문
- 주문 접수 중 -> 주문 수락 -> 준비 완료 -> 주문 완료
- 포장
- 주문 접수 중 -> 주문 수락 -> 준비 완료 -> 주문 완료
- 배달
- 주문 접수 중 -> 주문 수락 -> 준비 완료 -> 배달 중 -> 배달 완료 -> 주문 완료
한글명 | 영문명 | 설명 |
---|---|---|
주문 테이블 | order table | 손님이 주문을 하는 테이블을 의미한다. e.g. 1번 테이블, 2번 테이블 |
주문 테이블명 | order table name | 주문 테이블의 이름으로 비속어를 포함할 수 없다. |
테이블 사용 상태 | occupied | 손님의 테이블 사용 상태를 의미한다. |
테이블 사용 인원 | number of guests | 해당 테이블을 이용중인 손님의 수를 의미한다. |
테이블에 앉음 | sit | 테이블에 손님이 앉는다(테이블 사용 여부를 사용으로 변경). |
테이블을 치움 | clear | 테이블에서 손님이 떠난다(테이블 사용 여부를 미 사용으로 변경, 테이블 사용 인원을 0으로 변경). |
테이블 인원 수 변경 | change number of guests | 테이블에 앉은 손님 수를 변경한다(손님의 수는 0 이상이고 테이블을 사용 중일 때만 변경할 수 있다). |
테이블 사용 중 | occupied state | 손님이 테이블을 사용하고 있음을 의미한다. |
테이블 미사용 중 | vacant state | 아무 손님도 해당 테이블을 사용하고 있지 않음을 의미한다. |
sequenceDiagram
actor User as 사용자
participant Product as 상품
participant ProfanityCheck as 비속어 검증
User ->> Product: 상품 등록 요청
Product ->> ProfanityCheck: 상품명 비속어 검증
ProfanityCheck -->> Product: 검증 결과
Product ->> Product: 상품 가격 검증
Product ->> User: 상품 등록 완료
- 상품의 가격은 0원 이상이어야 한다.
- 상품의 이름은 비워 둘 수 없다.
- 상품의 이름에는 비속어가 포함될 수 없다.
sequenceDiagram
actor User as 사용자
participant MenuGroup as 메뉴그룹
User ->> MenuGroup: 메뉴 그룹 등록 요청
MenuGroup ->> MenuGroup: 메뉴 그룹명 검증
MenuGroup ->> User: 메뉴 그룹 등록 완료
- 메뉴 그룹의 이름은 비워 둘 수 없다.
sequenceDiagram
actor User as 사용자
participant Menu as 메뉴
participant Product as 상품
participant MenuGroup as 메뉴 그룹
participant ProfanityCheck as 비속어 검증
User ->> Menu: 메뉴 등록 요청
Menu ->> ProfanityCheck: 메뉴명 비속어 검증
ProfanityCheck -->> Menu: 검증 결과
Menu ->> Menu: 메뉴 가격 정책 검증
Menu ->> Product: 메뉴에 포함된 상품 및 가격 검증
Product -->> Menu: 검증 완료
Menu ->> MenuGroup: 메뉴 그룹 존재 확인
MenuGroup -->> Menu: 메뉴 그룹 확인 완료
Menu ->> User: 메뉴 등록 완료
- 메뉴명 정책
- 메뉴의 이름은 비워둘 수 없다.
- 메뉴의 이름에는 비속어가 포함될 수 없다.
- 비속어 포함 여부는 외부 비속어 검증 서비스에 요청하여 검증한다.
- 메뉴 가격 정책
- 메뉴의 가격은 0원 이상이어야 한다.
- 메뉴의 가격이 현재 메뉴에 포함된 상품들의 총합 가격보다 같거나 낮아야 한다.
- 메뉴의 가격이 메뉴에 속한 상품 금액의 합보다 높을 경우 메뉴를 숨긴다.
- 메뉴에 포함된 상품 정책
- 메뉴에 포함된 상품의 수량은 0 이상이어야 한다.
- 메뉴에 포함된 상품의 가격은 가격 정책을 지켜야 한다.
- 메뉴에 포함된 상품의 가격은 메뉴의 가격보다 크거나 같아야 한다.
- 메뉴에 포함돤 상품의 갯수는 실제 등록된 상품와 일치해야 한다.
- 메뉴 그룹 정책
- 메뉴는 특정 메뉴 그룹에 속해야 한다.
- 메뉴 그룹이 존재하지 않으면 메뉴를 등록할 수 없다.
sequenceDiagram
actor User as 사용자
participant Product as 상품
participant Menu as 메뉴
User ->> Product: 상품 가격 변경 요청
Product ->> Product: 가격 정책 검증
Product ->> User: 상품 가격 변경 완료
Product -->> Menu: 상품 가격 변경 완료
Menu ->> Menu: 관련 메뉴 가격 정책 검증
alt 가격이 높을 경우
Menu ->> Menu: 메뉴 숨김 처리
end
- 상품 가격 정책
- 변경하려는 가격은 0원 이상이어야 한다.
- 변경하려는 가격이 비어있으면 안 된다.
- 관련 메뉴 가격 정책
- 상품이 속해있는 메뉴의 가격과 메뉴에 속해있는 모든 상품들의 가격 합계를 비교한다.
- 만약 메뉴의 가격이 속해있는 상품들의 총 합계 가격보다 높을 경우, 자동으로 메뉴를 숨김 상태로 설정한다.
sequenceDiagram
actor User as 사용자
participant Menu as 메뉴
User ->> Menu: 메뉴 가격 변경 요청
Menu ->> Menu: 가격 변경 정책 검증
Menu ->> User: 메뉴 가격 변경 완료
- 변경하려는 가격은 0원 이상이어야 한다.
- 변경하려는 메뉴 가격이 현재 메뉴에 포함된 상품들의 총합 가격보다 같거나 낮아야 한다.
sequenceDiagram
actor User as 사용자
participant Menu as 메뉴
User ->> Menu: 메뉴 노출 요청
Menu ->> Menu: 메뉴 노출 정책 검증
Menu ->> User: 메뉴 노출 완료
User ->> Menu: 메뉴 숨김 요청
Menu ->> User: 메뉴 숨김 완료
- 메뉴의 가격은 0원 이상이어야 한다.
- 메뉴의 가격이 현재 메뉴에 포함된 상품들의 총합 가격보다 같거나 낮아야 한다.
- 메뉴에 포함된 상품들의 총합 가격을 검증한다.
- 상품 금액의 합이 메뉴의 가격보다 크거나 같아야 한다.
sequenceDiagram
actor Guest as 손님
participant Order as 주문
participant Menu as 메뉴
Guest ->> Order: 배달 주문 요청
Order ->> Menu: 메뉴 검증
Menu -->> Order: 메뉴 확인 완료
Order ->> Order: 배달 주소 검증
Order ->> Guest: 주문 접수 완료
- 메뉴 검증
- 메뉴가 등록된 메뉴인지 확인한다.
- 숨겨진 메뉴는 주문할 수 없다.
- 주문한 메뉴의 가격이 실제 메뉴 가격과 일치해야 한다.
- 배달 주소 검증
- 배달 주소는 비워 둘 수 없다.
sequenceDiagram
actor Guest as 사용자
participant Order as 주문
participant DeliveryRider as 배달 담당자
Guest ->> Order: 배달 주문 수락 요청
Order ->> Order: 주문 수락 정책 검증
Order ->> DeliveryRider: 배달 담당자 호출
DeliveryRider -->> Order: 배달 담당자 호출 완료
Order ->> Guest: 주문 수락 완료
- 주문 상태 검증
- 주문 접수 중인 주문만 주문 수락 할 수 있다.
- 배달 담당자 호출
- 외부 서비스를 이용하여 배달 담당자를 호출한다.
sequenceDiagram
actor Guest as 사용자
participant Order as 주문
Guest ->> Order: 배달 준비 완료 요청
Order ->> Order: 배달 준비 완료 정책 검증
Order ->> Guest: 배달 준비 완료
- 주문 수락된 주문만 준비 완료 변경할 수 있다.
sequenceDiagram
actor Guest as 사용자
participant Order as 주문
Guest ->> Order: 배달 시작 요청
Order ->> Order: 배달 시작 요청 정책 검증
Order ->> Guest: 배달 시작
- 준비 완료인 주문만 배달 시작 요청할 수 있다.
sequenceDiagram
actor Guest as 사용자
participant Order as 주문
Guest ->> Order: 배달 완료 요청
Order ->> Order: 배달 완료 요청 정책 검증
Order ->> Guest: 배달 완료
- 배달 중인 주문만 배달 완료 요청할 수 있다.
sequenceDiagram
actor Guest as 사용자
participant Order as 사용자
Guest ->> Order: 배달 주문 완료 요청
Order ->> Order: 주문 완료 정책 검증
Order ->> Guest: 주문 완료
- 배달 완료된 주문만 주문 완료할 수 있다.
sequenceDiagram
actor Guest as 사용자
participant Order as 주문
participant Menu as 메뉴
Guest ->> Order: 포장 주문 요청
Order ->> Menu: 메뉴 검증
Menu -->> Order: 메뉴 확인 완료
Order ->> Order: 주문 요청 정책 검증
Order ->> Guest: 주문 접수 완료
- 메뉴 정책
- 메뉴가 없으면 주문할 수 없다.
- 숨겨진 메뉴는 주문할 수 없다.
- 주문한 메뉴의 가격은 실제 메뉴 가격과 일치해야 한다.
- 포장 주문 요청 정책
- 1개 이상의 등록된 메뉴로 포장 주문을 할 수 있다.
sequenceDiagram
actor Guest as 사용자
participant Order as 주문
Guest ->> Order: 포장 주문 수락 요청
Order ->> Order: 주문 수락 정책 검증
Order ->> Guest: 주문 수락 완료
- 주문 수락 중인 주문만 주문 수락 할 수 있다.
sequenceDiagram
actor Guest as 사용자
participant Order as 주문
Guest ->> Order: 포장 준비 완료 요청
Order ->> Order: 주문 준비 완료 정책 검증
Order ->> Guest: 포장 준비 완료
- 주문 수락된 주문만 준비완료 변경할 수 있다.
sequenceDiagram
actor Guest as 사용자
participant Order as 주문
Guest ->> Order: 포장 주문 완료 요청
Order ->> Order: 주문 완료 정책 검증
Order ->> Guest: 주문 완료
- 준비 완료된 주문만 주문 완료할 수 있다.
sequenceDiagram
actor Guest as 사용자
participant OrderTable as 주문 테이블
participant Order as 주문
participant Menu as 메뉴
Guest ->> Order: 매장 주문 요청
Order ->> OrderTable: 테이블 사용 중 확인
OrderTable -->> Order: 테이블 사용 중 확인 완료
Order ->> Order: 주문 항목 수량 정책 검증
Order ->> Menu: 메뉴 검증
Menu -->> Order: 메뉴 확인 완료
Order ->> Guest: 주문 접수 완료
- 메뉴 검증 정책
- 1개 이상의 등록된 메뉴로 매장 주문을 할 수 있다.
- 메뉴가 없으면 주문할 수 없다.
- 숨겨진 메뉴는 주문할 수 없다.
- 주문한 메뉴의 가격은 실제 메뉴 가격과 일치해야 한다.
- 테이블 사용 상태 정책
- 테이블을 사용중이지 않으면 주문할 수 없다.
- 주문 항목 수량 정책
- 매장 주문은 주문 항목의 수량이 0 미만일 수 있다.
sequenceDiagram
actor Guest as 사용자
participant Order as 주문
Guest ->> Order: 주문 수락 요청
Order ->> Order: 주문 수락 검증
Order ->> Guest: 주문 수락
- 주문 접수중인 주문만 주문 수락 할 수 있다.
sequenceDiagram
actor Guest as 사용자
participant Order as 주문
Guest ->> Order: 매장 식사 주문 준비 완료 요청
Order ->> Order: 주문 준비 완료 검증
Order ->> Guest: 주문 준비 완료
- 주문 수락된 주문만 준비완료 변경할 수 있다.
sequenceDiagram
actor Guest as 사용자
participant Order as 주문
Guest ->> Order: 매장 식사 주문 완료 요청
Order ->> Order: 주문 완료 정책 검증
Order ->> Guest: 주문 완료
- 준비 완료된 주문만 주문 완료할 수 있다.
sequenceDiagram
actor Guest as 손님
participant OrderTable as 주문 테이블
Guest ->> OrderTable: 테이블에 앉음 요청
OrderTable ->> OrderTable: 테이블 상태 검증
OrderTable ->> Guest: 테이블에 앉음 완료
- 테이블 상태 정책
- 테이블을 사용 중이지 않을 때만 손님이 앉을 수 있다.
- 테이블의 사용 상태를 확인하여, 비어 있는 테이블인 경우에만 손님의 앉음 요청을 수락한다.
sequenceDiagram
actor Guest as 사용자
participant OrderTable as 주문 테이블
participant Order as 주문
Guest ->> OrderTable: 테이블 치움 요청
OrderTable ->> Order: 주문 완료 상태 확인
Order -->> OrderTable: 모든 주문 완료 상태 확인
OrderTable ->> Guest: 테이블 치움 완료
- 주문 완료 상태 정책
- 테이블을 치우기 전에 해당 테이블의 모든 주문이 완료된 상태인지 확인한다.
- 주문 테이블이 모든 주문 완료 상태일 때만 테이블을 치울 수 있다.
- 테이블의 모든 주문이 완료된 상태를 확인한 후, 테이블 치움 요청을 수락한다.