테스트 코드의 보호를 받으며 레거시 코드를 안전하게 리팩터링, 도메인 주도 설계 이해, 멀티 모듈 구성
- 각 기능에 테스트 코드를 작성
- 서비스 레이어의 비즈니스 로직을 도메인 레이어로 이동
- 유연한 구조를위해 모듈, 객체간 의존성은 단방향으로 변경해야 한다.
- 요구사항의 정리는 개발자가 아닌 타직군도 읽기 쉽게 작성해 보자
- 도메인, 서비스, 인수 테스트가 중복이라고 생각할 수 있으나 각 테스트의 테스트 목적이 다르다고 생각해보자
- 의존성의 방향은 presentation layer -> service layer -> domain layer로 흐르는 것이 좋다.
- 의존의 방향은 잘 바뀌는 곳이 잘바뀌지 않는 곳을 의존하는게 좋다.
- 상품을 등록할 수 있다.
- 상품의 가격이 올바르지 않으면 등록할 수 없다. -상품의 가격은 0원 이상이어야 한다.
- 상품 목록을 조회할 수 있다.
- 메뉴그룹을 등록할 수 있다.
- 메뉴 그룹 목록을 조회할 수 있다.
- 메뉴를 등록할 수 있다.
- 메뉴는 조건이 맞지 않으면 등록할 수 없다.
- 메뉴의 가격은 0원 이상이어야 한다.
- 메뉴는 메뉴그룹에 존재하는 메뉴여야 한다.
- 메뉴의 상품들이 모두 등록되어 있어야 한다.
- 메의 가격은 메뉴 상품들의 가격의 합보다 클 수 없다.
- 메뉴를 조회할 수 있다.
- 주문 테이블을 등록할 수 있다.
- 주문 테이블을 조회할 수 있다.
- 주문 테이블을 빈테이블로 변경할 수 있다.
- 조건에 맞지않는 주문 테이블을 빈테이블로 변경할 수 없다.
- 존재하지 않는 주문 테이블을 변경할 수 없다.
- 테이블 그룹에 속해있는 주문 테이블은 변경할 수 없다.
- 주문 상태가 요리중이거나 식사중인 주문 테이블은 변경할 수 없다.
- 주문 테이블의 손님수를 변경할 수 있다.
- 조건에 맞지않는 주문 테이블의 손님수는 변경할 수 없다.
- 손님의 수를 0명 미만으로 변경할 수 없다.
- 존재하지 않는 주문테이블을 변경할 수 없다.
- 비어있는 주문 테이블은 변경할 수 없다.
- 테이블 그룹을 등록할 수 있다.
- 조건에 맞지 않는 테이블 그룹은 등록할 수 없다.
- 주문 테이블이 비어있지 않거나 2개 이상이어야 한다.
- 주문 테이블이 모두 등록되어 있어야 한다.
- 주문 테이블이 비어있지않거나 테이블그룹이 등록되어있으면 안된다.
- 테이블 그룹을 삭제할 수 있다.
- 테이블 그룹의 주문 상태가 요리중이거나 식사중이면 삭제할 수 없다.
- 주문을 등록할 수 있다.
- 조건에 맞지 않으면 주문을 등록할 수 없다.
- 주문 항목이 비어있으면 등록할 수 없다.
- 주문 항목의 메뉴가 등록되어 있는 메뉴여야 한다.
- 주문 테이블이 모두 존재하여야 한다.
- 주문 테이블이 비어있으면 안된다.
- 주문을 조회할 수 있다.
- 주문 상태를 변경할 수 있다.
- 조건에 맞지 않으면 주문의 상태를 변경할 수 없다.
- 주문이 존재하지 않으면 변경할 수 없다.
- 주문상태가 완료됨이면 변경할 수 없다.
- JDBC -> Spring Data JPA
- 도메인 엔티티 변환
- 롬복사용 금지
- 단방향 관계로 변경
- MenuValidator , OrderValidator
- 간접참조로 변경
- MenuProduct - product 간접참조로 변경
한글명 | 영문명 | 설명 |
---|---|---|
상품 | product | 메뉴를 관리하는 기준이 되는 데이터 |
메뉴 그룹 | menu group | 메뉴 묶음, 분류 |
메뉴 | menu | 메뉴 그룹에 속하는 실제 주문 가능 단위 |
메뉴 상품 | menu product | 메뉴에 속하는 수량이 있는 상품 |
금액 | amount | 가격 * 수량 |
주문 테이블 | order table | 매장에서 주문이 발생하는 영역 |
빈 테이블 | empty table | 주문을 등록할 수 없는 주문 테이블 |
주문 | order | 매장에서 발생하는 주문 |
주문 상태 | order status | 주문은 조리 ➜ 식사 ➜ 계산 완료 순서로 진행된다. |
방문한 손님 수 | number of guests | 필수 사항은 아니며 주문은 0명으로 등록할 수 있다. |
단체 지정 | table group | 통합 계산을 위해 개별 주문 테이블을 그룹화하는 기능 |
주문 항목 | order line item | 주문에 속하는 수량이 있는 메뉴 |
매장 식사 | eat in | 포장하지 않고 매장에서 식사하는 것 |