1. 이번 과제 정리하기
- 프로그래밍 요구 사항
InputView, OutputView로 입출력 클래스 구현 (패키지, 클래스명, 메서드 반환타입, 시그니처 자유)
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월 중 식당 예상
방문 날짜입력 받기 - 방문 날짜는 1~31 사이
- 범위 밖 날짜 입력 시
[ERROR] 유효하지 않은 날짜입니다. 다시 입력해 주세요. - 지난 날짜 입력 시
[ERROR] 이미 지난 날짜입니다. 다시 입력해 주세요. 주문할 메뉴와 개수입력 받기- 주문할 메뉴는 예를 들자면
해산물파스타-2,레드와인-1,초코케이크-1꼴 - 메뉴판에 없는 메뉴 입력 시
[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요. - 메뉴 형식이 예시와 다른 경우
[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요. - 중복 메뉴를 입력 시
[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요. - 메뉴 개수는 1 이상의 숫자
- 이외의 값 입력 시
[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요. 주문 메뉴보여주기- 출력 순서 자유
증정 메뉴보여주기- 증정 이벤트 없는 경우, “
없음”으로 출력 혜택 내역보여주기- 고객에게 적용된 이벤트 내역 출력
- 적용된 이벤트 없는 경우, 혜택 내역 “
없음”으로 출력 - 여러 개 이벤트 적용된 경우, 출력 순서 자유
총 혜택 금액보여주기- 할인 금액의 합계 + 증정 메뉴의 가격
할인 후 예상 결제 금액보여주기- 할인 전 총주문 금액 - 할인 금액
이벤트 배지보여주기- 총헤택 금액에 따라 다르게 출력(별, 트리, 산타)
- 이벤트 배지 부여되지 않는 경우, “
없음”으로 출력
서비스 이름 :
12월 이벤트 플래너- 예외 처리
[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 작성하기
몰입
이번주에 적용해 볼 설계 방법 고민하기
설계 구상하기 (객체지향적으로 생각해보기)
메일 읽고 올바른 방법으로 과제 레포 파기
1일차_둘러보기, 환경설정하기
Oct 19, 2023
DIARY_DEVELOP
2일차_컨벤션 정리하기
Oct 20, 2023
DIARY_DEVELOP
3일차_설계에 대해 고민하기
Oct 21, 2023
DIARY_DEVELOP
4,5일차_MVC 온전히 이해하기
Oct 22, 2023
DIARY_DEVELOP
6일차_설계를 코드로 구현하기
Oct 24, 2023
DIARY_DEVELOP
7일차_리팩토링과 마무리하기
Oct 25, 2023
DIARY_DEVELOP
8,9일차_코드 리뷰 통해 객체지향에 다가가기
Oct 27, 2023
DIARY_DEVELOP
10일차_지난 과제 돌아보며 객체지향 이해하기, 의존성과 설계의 관계 맛보기
Oct 28, 2023
DIARY_DEVELOP
11일차_객체지향을 미션 설계에 적용하기(with [책] 객체 지향의 사실과 오해)
Oct 29, 2023
DIARY_DEVELOP
12일차_기능 별로 구현하며 단위 테스트의 필요성 느끼기 (with [책]
자바와 JUnit을 활용한 실용주의 단위 테스트)Oct 30, 2023
DIARY_DEVELOP
13,14일차_일급 컬렉션과 레코드 적용해 리팩토링하기
Oct 31, 2023
DIARY_DEVELOP
15, 16일차_코드 리뷰를 통해 성장하기(1)_다른 사람의 코드 읽으면 배운 것 정리
Nov 2, 2023
DIARY_DEVELOP
17일차_코드 리뷰를 통해 성장하기(2)_내 코드 개선하며 배운 것 정리
Nov 4, 2023
DIARY_DEVELOP
18일차_내가 찾은 설계 방법 공유하기, 공유에 대해 고민하기
Nov 5, 2023
DIARY_DEVELOP
19일차_지난 과제 피드백 고려해 설계하기
Nov 6, 2023
DIARY_DEVELOP
20, 21일차_일단 돌아가는 코드를 만들기
Nov 7, 2023
DIARY_DEVELOP
22일차_현재 도움이 될 것 생각하기 (디자인패턴과 mvc2 과감히 패스)
Nov 9, 2023
DIARY_DEVELOP
23일차_코드리뷰하기 (feat. converter 파고들기)
Nov 10, 2023
DIARY_DEVELOP
24일차_기획을 문서화하기
Nov 11, 2023
DIARY_DEVELOP
25일차_설계하며 고민하기
Nov 12, 2023
DIARY_DEVELOP
26, 27일차_구현하며 고민하기
Nov 13, 2023
DIARY_DEVELOP
