🍀

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

작성일자
Nov 11, 2023
태그
DIARY_DEVELOP
프로젝트
PreCourse
책 종류

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월 이벤트 배지 내용 보여주기
      • 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 작성하기
몰입
이번주에 적용해 볼 설계 방법 고민하기
설계 구상하기 (객체지향적으로 생각해보기)
메일 읽고 올바른 방법으로 과제 레포 파기
 
🍀
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