전체 보기
🍀

24일차_기획을 문서화하기

작성일자
2023/11/11
태그
DIARY_DEVELOP
프로젝트
PreCourse
책 종류
1 more property

1. 이번 과제 정리하기

프로그래밍 요구 사항
InputView, OutputView로 입출력 클래스 구현 (패키지, 클래스명, 메서드 반환타입, 시그니처 자유)
public class InputView { public int readDate() { System.out.println("12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)"); String input = Console.readLine(); ...
Java
복사
public class OutputView { public void printMenu() { System.out.println("<주문 메뉴>"); ...
Java
복사
camp.nextstep.edu.missionutils.Console.readLine() 사용
indent 2 이하, 3항 연산자 금지, switch/case 금지, else 금지, 메서드는 15라인 이하
Junit5와 AssertJ로 기능 목록 동작 확인
도메인 로직에 단위 테스트 구현 → UI(System.out, System.in, Scanner)는 제외
사용자가 잘못된 값 입력 시 [ERROR]로 시작하는 에러 메시지 출력 후 그 부분부터 입력 다시 받기
Exception이 아닌 IllegalArgumentException 같이 명확한 유형 처리
기능 요구 사항 : 식당의 이벤트를 위한 개발 해달란 요청 받음
목표
중복된 할인과 증정을 허용해, 고객들이 혜택 많이 받는다는 것 체감할 수 있게 하기
올해 12월에 지난 5년 중 최고의 판매 금액을 달성하기
12월 이벤트 참여 고객의 5%가 내년 1월 새해 이벤트에 재참여하게 하기
이벤트
크리스마스 디데이 할인 : 12월 1일에 1,000원부터 시작해 25일까지 매일 100원씩 증가해 할인
평일 할인(일~목) : 디저트 메뉴를 1개당 2,203원 할인
주말 할인(금,토) : 메인 메뉴를 메뉴 1개당 2,023원 할인
특별 할인(일,25일) : 총 주문 금액에서 1,000원 할인
증정 이벤트 : 할인 전 총 주문 금액이 12만원 이상일 때, 샴페인 1개 증정
이벤트 기간 : 크리스마스 디데이 할인 제외한 나머지 이벤트는 12월 한 달동안 적용
특이사항
식당의 메뉴는 에피타이저, 메인, 디저트, 음료로 구성됨
총혜택 금액에 따라 배지(별, 트리, 산타) 부여 (새해 이벤트에서 선물 증정 시 사용할 예정)
고객에게 안내할 주의 사항
총주문 금액 10,000원 이상부터 이벤트가 적용됩니다.
음료만 주문 시, 주문할 수 없습니다.
메뉴는 한 번에 최대 20개까지만 주문할 수 있습니다.(e.g. 시저샐러드-1, 티본스테이크-1, 크리스마스파스타-1, 제로콜라-3, 아이스크림-1의 총개수는 7개)
개발 요청 사항
서비스 이름 : 12월 이벤트 플래너
고객들이 식당에 방문할 날짜메뉴 선택하면
주문 메뉴, 할인 전 총주문 금액, 증정 메뉴, 헤택 내역, 총혜택 금액, 할인 후 예상 결제 금액, 12월 이벤트 배지 내용 보여주기
12월 중 식당 예상 방문 날짜 입력 받기
방문 날짜는 1~31 사이
범위 밖 날짜 입력 시 [ERROR] 유효하지 않은 날짜입니다. 다시 입력해 주세요.
지난 날짜 입력 시 [ERROR] 이미 지난 날짜입니다. 다시 입력해 주세요.
주문할 메뉴와 개수 입력 받기
주문할 메뉴는 예를 들자면 해산물파스타-2,레드와인-1,초코케이크-1
메뉴판에 없는 메뉴 입력 시[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요.
메뉴 형식이 예시와 다른 경우 [ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요.
중복 메뉴를 입력 시 [ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요.
메뉴 개수는 1 이상의 숫자
이외의 값 입력 시 [ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요.
주문 메뉴 보여주기
출력 순서 자유
증정 메뉴 보여주기
증정 이벤트 없는 경우, “없음”으로 출력
혜택 내역 보여주기
고객에게 적용된 이벤트 내역 출력
적용된 이벤트 없는 경우, 혜택 내역 “없음”으로 출력
여러 개 이벤트 적용된 경우, 출력 순서 자유
총 혜택 금액 보여주기
할인 금액의 합계 + 증정 메뉴의 가격
할인 후 예상 결제 금액 보여주기
할인 전 총주문 금액 - 할인 금액
이벤트 배지 보여주기
총헤택 금액에 따라 다르게 출력(별, 트리, 산타)
이벤트 배지 부여되지 않는 경우, “없음”으로 출력
예외 처리
[ERROR] 유효하지 않은 날짜입니다. 다시 입력해 주세요.
view
사용자가 입력한 값이 숫자가 아닐 때
model
사용자가 입력한 날짜가 1이상 31 이하가 아닐 때
사용자가 입력한 날짜가 이미 지난 날짜일 때
[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요.
view
사용자가 입력한 값이 형식에 맞지 않을 때
model
사용자가 입력한 메뉴가 없는 메뉴일 때
사용자가 입력한 메뉴에 중복이 있을 때
사용자가 입력한 메뉴에 음료만 있을 때
사용자가 입력한 각 메뉴 개수가 1개 이상이 아닐 때
사용자가 입력한 메뉴 개수 합이 20개를 초과할 때
과제 목표
클래스(객체)를 분리하는 연습
클래스(객체)를 분리하는 것에 대해 좀 더 깊이 고민해 볼 수 있도록 클래스 예시와 요구 사항 추가됨
클래스의 역할과 책임을 생각해 보고 클래스 작성 시 도메인 로직에 집중하는 방향으로 구현
UI는 도메인 로직과 분리하는 방향으로 생각
단위 테스트를 시작
제출
main 브랜치에 커밋하기 (다른 브랜치에 커밋하면 0점)
제출 시 비공개 저장소 주소를 올리기

2. 나의 설계법 완전히 검증하기

스토리텔링식으로 설계해 협력/책임/역할 정하기 (+ 데이터가 아닌 행동 위주로 사고하기)

이야기 : 모자 장수가 이벤트 진행 중인 식당을 전화로 예약하려 함 (전제 : 백틱 처리된 모든 물건은 의인화해 생각한다)
모자 장수 집에 모자 장수가 있고, 전화기 너머 식당에 콜직원, 메뉴판, 달력, 이벤트 목록, 할인 계산기, 예약 장부가 있음
콜직원모자 장수에게 “방문할 날짜를 말씀해주세요~”라고 물음
모자 장수가 “12월 23일 예약하고 싶어요!”라고 답함
콜직원예약 장부에게 “23일 예약 기록 시작해”라고 명령함
예약 장부달력에게 “23일에 예약 표시해줘”라고 명령함
달력이 “응! 오늘은 20일로 아직 23일 전이라 예약 가능해! 표시해둘게”라고 답함
콜직원모자 장수에게 “주문할 메뉴와 개수를 말씀해주세요~”라고 물음
모자 장수가 “해산물파스타 2개요!” 라고 답함
콜직원예약 장부에게 “메뉴 기입해~”라고 명령함
예약 장부메뉴판에게 “전부 1개 이상이라 내가 볼 땐 괜찮아 보이는데, 너가 보기에도 주문 가능한 메뉴들이면 메뉴판에 표시해줘”라고 명령함
메뉴판이 “응! 전부 존재하는 메뉴들이라 주문 가능해! 표시해둘게”라고 답함
콜직원예약 장부에게 “모자 장수의 예약 내역에 이벤트 적용해”라고 명령함
예약 장부이벤트 계산기에게 “12월 23일, 35,000원짜리 해산물파스타 2개에 이벤트 적용해”라고 명령함
이벤트 계산기이벤트 목록에게 “12월 23일, 35,000원짜리 해산물파스타 2개에 이벤트 적용해” 라고 명령함
이벤트 목록이 “응, 2023*2원 깍아주는 주말 할인이 들어갈거고, 증정이랑 배지는 없어” 라고 답함
이벤트 계산기할인 계산기에게 “할인 전 총 주문 금액이랑 총 혜택 금액, 할인 후 예상 결제 금액을 계산해줘”라고 명령함
할인 계산기가 “할인 전 총 주문 금액은 70,000원이고, 혜택 금액은 4,046원으로, 할인 후 예상 결제 금액은 65,954원이야”라고 답함
콜직원예약 장부에게 “모자 장수의 예약 내역을 말해라”라고 명령함
예약 장부가 “주문 메뉴, 할인 전 총주문 금액, 증정 메뉴, 혜택 내역, 총혜택 금액, 할인 후 예상 결제 금액, 12월 이벤트 배지”를 답함
협력 : 요청과 응답
모자 장수콜직원에게 전화 걸어 예약을 요청함으로써 예약이 시작됨
콜직원모자 장수에게 방문 날짜를 말할 것을 요청함
모자 장수가 23일에 방문하고 싶다고 말함으로써 요청에 응답함
콜직원예약 장부에게 23일 예약을 생성하기 시작하라고 요청함
예약 장부달력에게 23일에 예약 표시해두라고 요청함
달력이 12월 일정에 23일 예약을 표시해둠으로써 요청에 응답함
콜직원모자 장수에게 주문할 메뉴와 개수를 말할 것을 요청함
모자 장수가 해산물 파스타 2개를 주문하겠다고 말함으로써 요청에 응답함
콜직원예약 장부에게 예약에 주문 내용을 추가하라고 요청함
예약 장부메뉴판에게 해산물 파스타 2개를 표시해두라고 요청함
메뉴판이 메뉴 목록에 해산물 파스타 2개를 표시해둠으로써 요청에 응답함
콜직원예약 장부에게 이벤트 적용할 것을 요청함
예약 장부이벤트에게 특정 예약에 대해 이벤트 적용할 것을 요청함
이벤트이벤트 목록에게 적용되는 목록 표시하고 혜택 금액 계산해 요청에 응답함
콜직원예약 장부에게 예약 내역 출력할 것을 요청함
예약 장부가 예약 내역(메뉴판, 달력, 이벤트, 고객 이름) 출력해 요청에 응답함
책임 : 하는 것(요청, 계산)과 아는 것
콜직원
하는 것
예약 장부에게 예약 생성 요청
예약 장부에게 예약 내역에 이벤트 적용 요청
예약 장부에게 모자 장수의 예약 내역 출력 요청
예약 장부
아는 것
예약 내역(메뉴판, 달력, 이벤트, 고객 이름)
하는 것
달력에 예약 날짜 표시 명령
메뉴판에 예약 메뉴 표시 명령
이벤트에 이벤트 적용 명령
예약 내역 출력
메뉴판
하는 것 : 주문 메뉴 표시
아는 것 : 메뉴 목록
달력
하는 것 : 예약 날짜 표시
아는 것 : 오늘 날짜(11월 30일로 가정), 12월 일수
이벤트
하는 것 : 이벤트 목록에 이벤트 표시, 혜택 금액 계산
아는 것 : 이벤트 목록
역할 : 책임의 집합 (재사용성)
콜직원 → 컨트롤러 (EventPlannerController)
예약 장부 → 이벤트 플래너 (EventPlanner)
예약 내역 → 계획 결과 (PlanResult)
메뉴판 → 메뉴판 (Menu)
달력 → 달력 (Calender)
이벤트 → 이벤트 (Event)

Today in 프리코스

TIL 작성하기
몰입
이번주에 적용해 볼 설계 방법 고민하기
설계 구상하기 (객체지향적으로 생각해보기)
메일 읽고 올바른 방법으로 과제 레포 파기
Search
1일차_둘러보기, 환경설정하기
2023/10/19
DIARY_DEVELOP
1일차_둘러보기, 환경설정하기
2023/10/19
DIARY_DEVELOP