- NextStep & 우아한 형제들 주관
- 일반 사용자용 서비스를 개발할 때 필요한 역량 습득
- 리뷰어의 코드 리뷰를 통해 책임 주도 설계를 기반으로 유연한 구조의 클린 코드를 작성
테스트 코드를 기반으로 레거시 코드를 안전하게 리팩터링, 멀티 모듈 구성
- 안전하게 리팩터링할 수 있도록 각 기능에 테스트 코드를 작성
- 이를 통해 리팩터링 중 기능의 버그 발생 확률을 낮춤
- DDD를 기반으로 기존에 서비스 레이어의 쌓여 있는 비즈니스 로직을 도메인 레이어으로 추출
- 이를 통해 기존의 DB 위주의 설계(데이터 주도 설계, 절차 지향적)와 도메인 주도 설계의 패러다임 불일치 해결
- 모듈 간 또는 객체 간 양방향 의존성을 단방향으로 변경
- 양방향 의존은 성능, 유연성, 가독성 등 여러 부분에서 비효율적
- 유연한 구조를 위해 도메인을 기준으로 독립적인 모듈로 만들어 멀티 모듈 형태로 관리
주요 피드백 내용
- Mocking 테스트와 실제 인스턴스를 사용 테스트는 생각보다 큰 차이가 있기 때문에 잘 판단할 것
- Mocking 테스트는 간결하고 빠른 테스트가 가능하지만 정확한 테스트가 어려움
- 실제 인스턴스를 사용하는 방법은 프로덕션 코드를 그대로 테스트 할 수 있지만 픽스처 생성 등 부가 작업이 생길 수 있음
- 또한 어떤 테스트든 완전히 버그가 없는 무결한 상태를 의미하지 않음
주요 피드백 내용
- 테스트에 필요한 데이터는 상황에 따라 SQL 파일보다 픽스처를 생성하여 사용하는 것이 효율적일 수 있음
- if문 조건 등을 메서드로 추출(추상화)하여 간결한 코드로 만들어 가독성을 높일 수 있음
- 도메인으로 들어갈 수 있는 책임(기능)을 잘 판단할 것
주요 피드백 내용
MenuProduct
객체와 이를 감싸고 있는@Embeddable MenuProducts
객체는 연관관계가 아님- 단순히 감싸고 있는 일급 컬렉션
Menu
객체와MenuProduct
이 양방향 연관관계
주요 피드백 내용
- 피드백 내용 없음
- 메뉴 그룹 생성 기능
- 메뉴 그룹 조회 기능
- 메뉴 생성 기능
- 가격은 0원 이하일 수 없음
- 메뉴 그룹이 존재하지 않으면 등록할 수 없음 (특정 메뉴 그룹에 속해 있어야 함)
- 메뉴 내의 각 제품 가격 * 수량을 모두 합산한 것 보다 메뉴의 가격이 크다면 등록할 수 없음
- 메뉴 조회 기능
- 제품들을 저장, 해당 메뉴와 매핑
- 주문 생성 기능
- 생성 요청시 상품을 같이 주문하지 않는다면 생성 불가
- 요청한 모든 주문 상품들이 메뉴에 모두 등록되어 있지 않다면 생성 불가
- 존재하지 않는(비어있는) 주문 테이블이라면 생성 불가
- 주문 조회 기능
- 주문 상태 변경 기능
- 해당 주문이 존재하지 않는 경우 변경 불가
- 이미 완료된 상태라면 변경 불가
- 상품 생성 기능
- 상품의 가격이 0원 이하라면 제품 생성 불가
- 상품 조회 기능
- 테이블 그룹 생성(단체 지정) 기능
- 생성 요청시 주문 테이블 크기가 2이하라면 생성 불가
- 생성 요청한 주문 테이블이 다른 그룹 테이블에 존재한다면(중복으로 단체 지정) 생성 불가
- 테이블 그룹 해제(단체 지정 해지) 기능
- 해당 주문 테이블의 주문 상태가 조리중, 식사중인 경우 해지 불가
- 주문 테이블 생성 기능
- 주문 테이블 조회 기능
- 비어있는 테이블 설정 기능
- 유효하지 않은 주문 테이블이라면 설정 불가
- 해당 주문 테이블이 테이블 그룹에 속해있다면 설정 불가
- 주문 테이블이 조리, 식사중인 경우 해지 불가
- 게스트의 수 변경(또는 등록) 기능
- 요청한 게스트의 수가 0 이하라면 변경 불가
- 요청한 주문 테이블이 존재하지 않는(빈 테이블) 경우 변경 불가
한글명 | 영문명 | 설명 |
---|---|---|
상품 | kitchenpos.application.product | 메뉴를 관리하는 기준이 되는 데이터 |
메뉴 그룹 | kitchenpos.application.menu group | 메뉴 묶음, 분류 |
메뉴 | kitchenpos.application.menu | 메뉴 그룹에 속하는 실제 주문 가능 단위 |
메뉴 상품 | kitchenpos.application.menu kitchenpos.application.product | 메뉴에 속하는 수량이 있는 상품 |
금액 | amount | 가격 * 수량 |
주문 테이블 | kitchenpos.application.order kitchenpos.application.table | 매장에서 주문이 발생하는 영역 |
빈 테이블 | empty kitchenpos.application.table | 주문을 등록할 수 없는 주문 테이블 |
주문 | kitchenpos.application.order | 매장에서 발생하는 주문 |
주문 상태 | kitchenpos.application.order status | 주문은 조리 ➜ 식사 ➜ 계산 완료 순서로 진행된다. |
방문한 손님 수 | number of guests | 필수 사항은 아니며 주문은 0명으로 등록할 수 있다. |
단체 지정 | kitchenpos.application.table group | 통합 계산을 위해 개별 주문 테이블을 그룹화하는 기능 |
주문 항목 | kitchenpos.application.order line item | 주문에 속하는 수량이 있는 메뉴 |
매장 식사 | eat in | 포장하지 않고 매장에서 식사하는 것 |