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

2단계 - 요구 사항 정리 #820

Open
wants to merge 6 commits into
base: wishoon
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
101 changes: 99 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,107 @@ docker compose -p kitchenpos up -d

## 요구 사항

### 상품 (판매되는 상품)

- [ ] 상품은 '상품명', '상품 가격' 정보를 가진다.
- [ ] 상품의 '상품명'은 필수값이며 공백을 허용하지 않는다.
- [ ] 상품의 '상품명'은 비속어를 허용하지 않는다.
- [ ] 상품의 '상품 가격'은 0 이상이여야 한다.

- [ ] 상품은 주어진 정보를 기반으로 '상품'을 생성할 수 있다.
- [ ] 상품은 '상품명', '상품 가격' 정보를 기반으로 상품을 생성할 수 있다.

- [ ] 상품은 주어진 정보를 기반으로 '상품'을 수정할 수 있다.
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.

상품 수정 시 메뉴에 영향이 가게 됩니다!

제가 상품 쪽에 요구사항을 적지 않고 메뉴 쪽에 요구사항을 작성한 이유는 상품이 메뉴의 도메인을 알 필요가 없다고 생각해서 입니다. 상품은 정보를 변경할 뿐, 변경된 이벤트를 바탕으로 메뉴가 변경이 되는 것이 더 자연스러운 흐름이라고 생각하게 되어 메뉴 쪽에 요구사항을 작성했습니다

image

- [ ] '상품명'을 변경할 수 있다.
- [ ] '상품 가격'을 변경할 수 있다.

### 메뉴 그룹 (현재 판매되는 메뉴의 상위 집합)

- [ ] 메뉴 그룹은 '메뉴 그룹명' 정보를 가진다.
Copy link

Choose a reason for hiding this comment

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

메뉴 그룹이라는게 어떤건지 가볍게 설명이나 예시를 추가해줘도 좋을 것 같아요. 😃

- [ ] 메뉴 그룹의 '메뉴 그룹명'은 필수값이며 공백을 허용하지 않는다.

- [ ] 메뉴 그룹은 주어진 정보를 기반으로 '메뉴 그룹'을 생성할 수 있다.
- [ ] 메뉴 그룹은 '메뉴 그룹명' 정보를 기반으로 메뉴 그룹을 생성할 수 있다.

### 메뉴 (현재 판매되는 상품의 묶음)

- [ ] 메뉴는 '메뉴명', '메뉴 가격', '메뉴 그룹', '메뉴 상품 목록', '메뉴 노출 여부' 정보를 가진다.
- [ ] 메뉴의 '메뉴명'은 필수값이며 공백을 허용하지 않는다.
- [ ] 메뉴의 '메뉴명'은 비속어를 허용하지 않는다.
- [ ] 메뉴의 '메뉴 가격'은 0 이상이여야 한다.
- [ ] 메뉴의 '메뉴 상품 목록'의 '메뉴 상품'은 '수량', '가격' 정보를 가진다.
- [ ] 메뉴 상품의 '수량'은 0 이상이여야 한다.
- [ ] 메뉴 상품의 '가격'은 0 이상이여야 한다.
- [ ] 메뉴 상품의 '가격'은 '수량'의 값을 기반으로 총합을 계산하였을 때, 메뉴의 '메뉴 가격' 값과 동일하거나 초과할 수 있다.

- [ ] 메뉴는 주어진 정보를 기반으로 '메뉴'를 생성할 수 있다.

- [ ] 메뉴는 주어진 정보를 기반으로 '메뉴'를 수정할 수 있다.
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.

아하 보통 저는 요구사항을 작성할 때 대분류, 소분류로 나눠서 작성하는 것을 선호하긴 합니다.

예를 들면, A 도메인에 상품을 생성하고 가격을 수정하는 기능이 있다고 한다면, 대분류를 생성(C), 수정(U)으로 1차 분류합니다. 이후, 수정이라는 분류 중에서 가격을 수정하고, 전시 여부를 수정하는 하위 요구사항을 서술하는 편이긴 합니다!

추가적으로 제가 메뉴 가격 수정 요구사항을 빠트렸네요;; 이 이유 때문에 요구사항이 더 애매하게 보였던 것 같긴하네영 ㅎㅎ

(혹시 위 부분에 대해서는 어떻게 생각하시나요 ㅎㅎ 경록님 팀에서는 요구사항 작성 시 포멧을 따로 가져가시는지 궁금하네여)

Copy link

Choose a reason for hiding this comment

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

이 방식도 괜찮은 것 같아요!
사실 대다수의 기능이 수정쪽으로 몰릴 것 같아서 사실 이 C,U,D로 구분하는게 큰 의미가있을까 싶기도하고
그 외에도 생각해보면 이런 CRUD 구분법은 개발자에게 친숙한 방식인 것 같다는 생각이 들기도하네요. 🤔

또 마이너하지만 전체적으로 뎁스가 하나씩 추가되는건데, 뎁스가 깊어지다보니 가독성이 조금 떨어질 수 있을 것 같다는 생각이들기는해요.

- [ ] 메뉴는 '메뉴 노출 여부'를 수정할 수 있다.
- [ ] 다른 특별한 조건 없이 숨김 상태로 수정할 수 있다.
- [ ] 메뉴의 '메뉴 가격'이 메뉴의 '메뉴 상품'과 연관된 상품의 '상품 가격'의 총합을 초과하지 않은 경우, 노출 상태로 변경할 수 있다.
- [ ] 메뉴의 '메뉴 상품'과 연관된 상품의 '상품 가격'의 변경으로 인해 메뉴의 '메뉴 상품'들의 총합이 메뉴의 '메뉴 가격'의 금액을 초과하는 경우, 숨김 상태로 변경해야 한다.
Copy link

Choose a reason for hiding this comment

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

사소할 수 있겠지만 개인적으로 연관된보다는 포함된의 의미가 조금 더 직관적이지 않을까 싶어요.

- [ ] 메뉴는 '메뉴 가격'을 수정할 수 있다.

### 가게 테이블 (가게 내 식사를 위한 테이블)

- [ ] 가게 테이블은 '테이블 이름', '테이블 사용 인원', '테이블 사용 유무' 정보를 가진다.
- [ ] 가게 테이블의 '테이블 이름'은 공백이거나 없을 수 없다.
- [ ] 가게 테이블의 '테이블 사용 인원'은 0 미만일 수 없다.

- [ ] 가게 테이블은 주어진 정보를 기반으로 '가게 테이블'을 생성할 수 있다.
- [ ] 가게 테이블의 '테이블 사용 인원'은 최초 생성 시 0 값을 가져야 한다.
- [ ] 가게 테이블의 '테이블 사용 유무'는 최초 생성 시 미사용 상태를 가져야 한다.

- [ ] 가게 테이블은 주어진 정보를 기반으로 '가게 테이블'을 수정할 수 있다.
- [ ] 가게 테이블은 '테이블 사용 인원'을 수정할 수 있다.
- [ ] 가게 테이블의 '테이블 사용 유뮤'가 사용 상태가 아닌 경우 수정할 수 없다.
- [ ] 가게 테이블은 '테이블 주문 상태'가 주문 완료인 경우, 0으로 수정할 수 있다.
- [ ] 가게 테이블은 '테이블 사용 유무'를 수정할 수 있다.
- [ ] 주문의 '주문 상태'가 주문 완료인 경우, 미사용 상태로 수정할 수 있다.

### 주문 (사용자가 주문한 메뉴)

- [ ] 주문은 '주문 유형', '주문 상태', '주문 시간', '주문 상품 목록', '주문 배송지', '가게 테이블' 정보를 가진다.
- [ ] 주문의 '주문 유형'은 DELIVERY(배달), TAKEOUT(포장), EAT_IN(매장 식사) 3가지 종류가 있다.
- [ ] 주문의 '주문 상태'는 WAITING(주문 대기), ACCEPTED(주문 수락), SERVED(서빙 완료), DELIVERING(배달 중), DELIVERED(배달 완료), COMPLETED(주문 완료) 6가지 종류가 있다.
- [ ] 주문의 '주문 상품 목록'은 '주문 유형'이 배달 또는 포장인 경우 0 미만일 수 없다.
- [ ] 주문의 '주문 상품 목록'은 연관된 메뉴의 갯수와 동일한 갯수를 가져야 한다.
Copy link

Choose a reason for hiding this comment

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

이게 무슨 말인지 잘 이해하지 못했는데 어떤 의미인지 설명해주실 수 있을까요?

- [ ] 주문의 '주문 상품 목록'의 '주문 상품'은 '주문 상품 메뉴 정보', '주문 상품 수량', '주문 상품 가격' 정보를 가진다.
- [ ] 주문의 '주문 배송지'는 주문 유형이 배달인 경우, 필수 값이다.
- [ ] 주문의 '가게 테이블'은 주문 유형이 매장 식사인 경우, 필수 값이다.

- [ ] 주문은 주어진 정보를 기반으로 '주문'을 생성할 수 있다.
- [ ] 주문의 '주문 상태'는 최초 생성 시 대기 상태여야 한다.
- [ ] 주문의 '주문 상품 목록'은 연관된 메뉴의 '메뉴 가격'과 '상품 가격'이 일치해야 한다.
- [ ] 주문의 '주문 상품 목록'은 연관된 메뉴의 '메뉴 상품'의 '메뉴 노출 여부'가 모두 노출 상태여야 한다.
- [ ] 주문의 '주문 유형'이 매장 식사 인 경우, 주문의 '가게 테이블'은 현재 사용 상태여야 한다.

- [ ] 주문은 주어진 정보를 기반으로 기존 주문을 수정할 수 있다.
- [ ] 주문은 '주문 상태'를 수정할 수 있다.
- [ ] 주문은 '주문 상태'를 주문 수락으로 수정할 수 있다.
- [ ] 주문의 '주문 상태'가 주문 대기가 아닐 경우, 주문의 '주문 상태'를 주문 수락으로 수정할 수 없다.
- [ ] 주문의 '주문 유형'이 배달인 경우, 라이더에게 배달 요청을 전달해야 한다.
- [ ] 주문은 '주문 상태'를 서빙 완료로 수정할 수 있다.
- [ ] 주문의 '주문 상태'가 주문 수락이 아닐 경우, 주문의 '주문 상태'를 서빙 완료로 수정할 수 없다.
- [ ] 주문은 '주문 상태'를 배달 중으로 수정할 수 있다.
- [ ] 주문의 '주문 상태'가 서빙 완료가 아닐 경우, 주문의 '주문 상태'를 배달 중으로 수정할 수 없다.
- [ ] 주문의 '주문 유형'이 배딜이 아닐 경우, 주문의 '주문 상태'를 배달 중으로 수정할 수 없다.
- [ ] 주문은 '주문 상태'를 배달 완료로 수정할 수 있다.
- [ ] 주문의 '주문 유형'이 배딜이 아닐 경우, 주문의 '주문 상태'를 배달 완료로 수정할 수 없다.
- [ ] 주문은 '주문 상태'를 주문 완료로 수정할 수 있다.
- [ ] 주문의 '주문 유형'이 배달이면서 주문의 '주문 상태'가 배달 완료가 아닌 경우, 주문의 '주문 상태'를 주문 완료로 수정할 수 있다.
- [ ] 주문의 '주문 유형'이 포장 또는 매장식사 이면서 주문의 '주문 상태'가 서빙 완료가 아닌 경우, 주문의 '주문 상태'를 주문 완료로 수정할 수 없다.
Comment on lines +101 to +102
Copy link

Choose a reason for hiding this comment

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

주문 상태 수정 쪽은 정리해주신 요구사항들이 한 눈에 잘 안들어오는 것 같은데, 조금 더 요구사항들을 다듬어보면 어떨까요? 🤗
작성하신 내용들을 소리내어 읽어보시면 요구사항을 더 깔끔하게 정리하는데 도움이되실거에요. 😉

예시로 아래와 같이 변경해볼 수도 있지 않을까요? 😃

Suggested change
- [ ] 주문의 '주문 유형'이 배달이면서 주문의 '주문 상태'가 배달 완료가 아닌 경우, 주문의 '주문 상태'를 주문 완료로 수정할 수 있다.
- [ ] 주문의 '주문 유형'이 포장 또는 매장식사 이면서 주문의 '주문 상태'가 서빙 완료가 아닌 경우, 주문의 '주문 상태'를 주문 완료로 수정할 수 없다.
- [ ] 배달주문인 경우 배달 완료 상태에서만 주문 완료를 할 수 있다.
- [ ] 매장식사 주문인 경우 서빙 완료 상태에서만 주문 완료를 할 수 있다.

'주문 상태 수정'쪽 외에도 요구사항의 길이가 긴 내용들은 한번쯤 같이 더 개선할 방법이 없는지 같이 확인해주시면 좋을 것 같아요.



## 용어 사전

| 한글명 | 영문명 | 설명 |
| --- | --- | --- |
| | | |
| 상품 | Product | 판매되는 상품 |
| 메뉴 그룹 | MenuGroup | 현재 판매되는 메뉴의 상위 그룹 |
| 메뉴 | Menu | 현재 판매되는 상품의 묶음 |
| 가게 테이블 | OrderTable | 가게 내 식사를 위한 테이블 |
| 주문 | Order | 사용자가 주문한 메뉴 |


## 모델링