(해당 주차 비공개했습니다)
으므므메메메 이번주의 모든 날에 일정이 있다니
믿을 수가 없군!
하지만 내 업보인걸
후회란없다
https://github.com/woowacourse-precourse/java-christmas-6
GitHub - woowacourse-precourse/java-christmas-6
Contribute to woowacourse-precourse/java-christmas-6 development by creating an account on GitHub.
github.com
미션 - 크리스마스 프로모션
🚀 기능 요구 사항
이번 미션은 이메일 형식의 기능 요구 사항입니다. 문제를 구현하는 데 필요한 요구사항과 배경지식은 이메일 내용에 전부 담겨있으니, 꼼꼼하게 확인하고 필요하다면 주어진 문제의 내용을 통해 유추하고 스스로 판단해 구현해 주시면 됩니다. 문제의 모든 내용은 충분히 검토되었으며, 출제 의도를 담은 내용임을 알려드립니다.✅
보낸 사람: 비즈니스팀 <biz@woowacourse.io>
받는 사람: 개발팀 <dev@woowacourse.io>
제목: 12월 이벤트를 위한 개발 요청
안녕하세요. 비즈니스팀입니다!
다가오는 2023년 12월에 우테코 식당에서 1년 중 제일 큰 이벤트를 개최하려고 합니다.
12월을 위해 이벤트 예산을 넉넉히 확보해 두었으니, 예산은 걱정하지 마세요~
특별히 이번 12월 이벤트를 진행하기 위해서, 개발팀의 도움이 많이 필요합니다.
아래 메뉴와 달력 이미지를 보면서 12월 이벤트 계획과 요청 내용을 본격적으로 설명해 드릴게요.
메뉴

달력
이벤트 목표 ❓얘는 무슨 의미지
- 중복된 할인과 증정을 허용해서, 고객들이 혜택을 많이 받는다는 것을 체감할 수 있게 하는 것
- 올해 12월에 지난 5년 중 최고의 판매 금액을 달성
- 12월 이벤트 참여 고객의 5%가 내년 1월 새해 이벤트에 재참여하는 것
12월 이벤트 계획
- 크리스마스 디데이 할인✅
- 이벤트 기간: 2023.12.1 ~ 2023.12.25✅
- 1,000원으로 시작하여 크리스마스가 다가올수록 날마다 할인 금액이 100원씩 증가✅
- 총주문 금액에서 해당 금액만큼 할인✅
(e.g. 시작일인 12월 1일에 1,000원, 2일에 1,100원, ..., 25일엔 3,400원 할인)
- 평일 할인(일요일~목요일): 평일에는 디저트 메뉴를 메뉴 1개당 2,023원 할인✅
- 주말 할인(금요일, 토요일): 주말에는 메인 메뉴를 메뉴 1개당 2,023원 할인✅
- 특별 할인: 이벤트 달력에 별이 있으면 총주문 금액에서 1,000원 할인✅
- 증정 이벤트: 할인 전 총주문 금액이 12만 원 이상일 때, 샴페인 1개 증정✅
- 이벤트 기간: '크리스마스 디데이 할인'을 제외한 다른 이벤트는 2023.12.1 ~ 2023.12.31 동안 적용✅
혜택 금액에 따른 12월 이벤트 배지 부여✅
- 총혜택 금액에 따라 다른 이벤트 배지를 부여합니다. 이 배지는 2024 새해 이벤트에서 활용할 예정입니다. 배지에 따라 새해 이벤트 참여 시, 각각 다른 새해 선물을 증정할 예정입니다.
- 5천 원 이상: 별✅
- 1만 원 이상: 트리✅
- 2만 원 이상: 산타✅
고객에게 안내할 이벤트 주의 사항
- 총주문 금액 10,000원 이상부터 이벤트가 적용됩니다.
- 음료만 주문 시, 주문할 수 없습니다.✅
- 메뉴는 한 번에 최대 20개까지만 주문할 수 있습니다.✅
(e.g. 시저샐러드-1, 티본스테이크-1, 크리스마스파스타-1, 제로콜라-3, 아이스크림-1의 총개수는 7개)
'12월 이벤트 플래너' 개발 요청 사항
- 고객들이 식당에 방문할 날짜와 메뉴를 미리 선택하면 이벤트 플래너가 주문 메뉴, 할인 전 총주문 금액, 증정 메뉴, 혜택 내역, 총혜택 금액, 할인 후 예상 결제 금액, 12월 이벤트 배지 내용을 보여주기를 기대합니다.✅
- 12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)✅
- 방문할 날짜는 1 이상 31 이하의 숫자로만 입력받아 주세요.
- 1 이상 31 이하의 숫자가 아닌 경우, "[ERROR] 유효하지 않은 날짜입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.✅
- 모든 에러 메시지는 "[ERROR]"로 시작하도록 작성해 주세요.✅
- 주문하실 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)
- 고객이 메뉴판에 없는 메뉴를 입력하는 경우, "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.✅
- 메뉴의 개수는 1 이상의 숫자만 입력되도록 해주세요. 이외의 입력값은 "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
- 메뉴 형식이 예시와 다른 경우, "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
- 중복 메뉴를 입력한 경우(e.g. 시저샐러드-1,시저샐러드-1), "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
- 모든 에러 메시지는 "[ERROR]"로 시작하도록 작성해 주세요.✅
- 주문 메뉴의 출력 순서는 자유롭게 출력해 주세요. - 해시맵 이용 가능?✅
- 총혜택 금액에 따라 이벤트 배지의 이름을 다르게 보여 주세요.✅
- 총혜택 금액 = 할인 금액의 합계 + 증정 메뉴의 가격✅
- 할인 후 예상 결제 금액 = 할인 전 총주문 금액 - 할인 금액✅
- 증정 메뉴
- 증정 이벤트에 해당하지 않는 경우, 증정 메뉴 "없음"으로 보여 주세요.✅
- 혜택 내역
- 고객에게 적용된 이벤트 내역만 보여 주세요.✅
- 적용된 이벤트가 하나도 없다면 혜택 내역 "없음"으로 보여 주세요.✅
- 혜택 내역에 여러 개의 이벤트가 적용된 경우, 출력 순서는 자유롭게 출력해주세요.✅
- 이벤트 배지
- 이벤트 배지가 부여되지 않는 경우, "없음"으로 보여 주세요.✅
- 적용된 이벤트가 하나도 없는 경우는 아래 예시를 참고해 주세요.✅

기대하는 '12월 이벤트 플래너'의 예시 모습
기대하는 예시를 한 개만 들어서 설명했지만, 더 다양한 사례가 있을 것으로 예상됩니다.
개발이 완료되는 대로 공유해 주시면, 비즈니스팀에서 1주일간 테스트를 진행하고 오픈할 예정입니다.
1주일 뒤에 예정된 '12월 이벤트 플래너' 개발 회의에서 더 자세한 얘기를 해보면 좋겠습니다.
감사합니다. :)
🎯 프로그래밍 요구 사항
- JDK 17 버전에서 실행 가능해야 한다. JDK 17에서 정상적으로 동작하지 않을 경우 0점 처리한다.✅
- 프로그램 실행의 시작점은 Application의 main()이다.✅
- build.gradle 파일을 변경할 수 없고, 외부 라이브러리를 사용하지 않는다.✅
- Java 코드 컨벤션 가이드를 준수하며 프로그래밍한다.✅
- 프로그램 종료 시 System.exit()를 호출하지 않는다.✅
- 프로그램 구현이 완료되면 ApplicationTest의 모든 테스트가 성공해야 한다. 테스트가 실패할 경우 0점 처리한다.✅
- 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 이름을 수정하거나 이동하지 않는다.✅
- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.✅
- 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.✅
- 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다.✅
- 3항 연산자를 쓰지 않는다.✅
- 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다.✅
- 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라.✅
- JUnit 5와 AssertJ를 이용하여 본인이 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인한다.✅
- else 예약어를 쓰지 않는다.✅
- 힌트: if 조건절에서 값을 return 하는 방식으로 구현하면 else를 사용하지 않아도 된다.✅
- else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다.✅
- 도메인 로직에 단위 테스트를 구현해야 한다. 단, UI(System.out, System.in, Scanner) 로직은 제외한다.✅
- 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 분리해 구현한다.✅
- 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.✅
- Exception이 아닌 IllegalArgumentException, IllegalStateException 등과 같은 명확한 유형을 처리한다.✅
추가된 요구 사항
- 아래 있는 InputView, OutputView 클래스를 참고하여 입출력 클래스를 구현한다.✅
- 입력과 출력을 담당하는 클래스를 별도로 구현한다.✅
- 해당 클래스의 패키지, 클래스명, 메서드의 반환 타입과 시그니처는 자유롭게 구현할 수 있다.✅
라이브러리
- camp.nextstep.edu.missionutils에서 제공하는 Console API를 사용하여 구현해야 한다.✅
- 사용자가 입력하는 값은 camp.nextstep.edu.missionutils.Console의 readLine()을 활용한다.✅
✏️ 과제 진행 요구 사항
- 미션은 java-christmas-6 저장소를 비공개 저장소로 생성해 시작한다.✅
- 기능을 구현하기 전 docs/README.md에 구현할 기능 목록을 정리해 추가한다.✅
- Git의 커밋 단위는 앞 단계에서 docs/README.md에 정리한 기능 목록 단위로 추가한다.✅
- 커밋 메시지 컨벤션 가이드를 참고해 커밋 메시지를 작성한다.✅
- 과제 진행 및 제출 방법은 프리코스 과제 제출 문서를 참고한다.✅
☄️ 기능명세서 / UML / README.MD ☄️



☄️ 커밋 ☄️



☄️ 수정 ☄️
- 순서 해시맵?✅
- 금액 , 구분✅
- "없음" 처리하기✅
- 메뉴 여러 개로 나뉜 거 맘에 안 듬
- 샴페인 약간 하드커딩느
- 없음 너무 여기저기✅
- 메뉴에 없는 값을 메뉴로 오류 ✅
☄️ 체크사항 체크하기 ☄️
-입력에외처리 (숫자만 입력해 주세요!)✅
-입력에외처리 (메뉴와 개수를 알렺세요!✅
구현 순서도 코딩 컨벤션 ( 상수 => 멤버 변수 => 생성자 => 메서드 )✅
- 메뉴 개수가 0일 때 테스트코드✅
- 클린코드 단축키 먹이기✅
- 전체 테스트코드 작성하기✅
- 우테큐 제공 테스트코드 통과하기✅
- 예외 사항 더 찾고 처리하기✅
- 자바독 체크✅
- 변수명 체크
- 캡슐화 체크하기✅
- 테스트 코드도 깔끔하게 만들기✅
- 테스트를 위한 코드와 구현 코드의 분리✅
- final 키워드로 불변 값 선언하기✅
- 객체를 객체스럽게 사용하기 (데이터를 가지는 객체에게서 데이터를 가져오기보다는 데이터에 대한 메세지를 던지도록 구현)❌ㅠ
- getter를 사용하는 대신 객체에 메세지를 보내자❌ㅠ
- getter 사용 시 Collections.unmodifiableList()와 같은 Unmodifiable Collecion을 사용해 외부 변경 막기❌ㅠ..링크들해시맵없음..
- 깃 컨피그 ❌ ㅎㅎ.. 다음에
출력 순서는 자유롭게 출력
- 메뉴의 개수는 1 이상의 숫자만 입력되도록 해주세요. 이외의 입력값은 "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.✅
- 메뉴 형식이 예시와 다른 경우, "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
- 중복 메뉴를 입력한 경우(e.g. 시저샐러드-1,시저샐러드-1), "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.✅
- 총주문 금액 10,000원 이상부터 이벤트가 적용됩니다.✅
☄️ 출제의도 예상하기 ☄️
- 주문서 / 날짜 일급컬렉션으로 만들기
- MVC 패턴 적용하기
- 메뉴 enum - Arrays.asList 활용하기
- 샴페인 이벤트 - 총주문 금액 계산 파트 밖에서도 메뉴의 가격 알 수 있야야 함 ( 메뉴가격 따로 관리)
- 비슷한 형식의 이벤트 여러 개 => 인터페이스,구현
- 이벤트 배지 조건 3개 (if - return)
-순서 상관없음?! - Unmodifiable Collecion을 사용해 외부 변경 막기?
https://github.com/Goldchae/java-christmas-6-Goldchae
'💾 Backend > 우아한 테크코스-프리코스' 카테고리의 다른 글
🛸 일급 컬렉션 (First Class Collection) (0) | 2023.11.12 |
---|---|
🪐우테코 프리코스🪐 - 4주차🚀 (0) | 2023.11.10 |
🪐우테코 프리코스🪐 - 3주차 과제🔭 (0) | 2023.11.07 |
🛸 도메인 로직에 대한 단위 테스트 (0) | 2023.11.05 |
🪐우테코 프리코스🪐 - 3주차🚀 (0) | 2023.11.02 |