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