🚀 기능 요구 사항
12월 이벤트 플래너 개발 요청 사항은 다음과 같습니다.
- 고객들이 식당에 방문할 날짜와 메뉴를 미리 선택하면 이벤트 플래너가 주문 메뉴, 할인 전 총주문 금액, 증정 메뉴, 혜택 내역, 총혜택 금액, 할인 후 예상 결제 금액, 12월 이벤트 배지 내용을 보여주기를 기대합니다.
- 12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)
- 방문할 날짜는 1 이상 31 이하의 숫자로만 입력받아 주세요.
- 1 이상 31 이하의 숫자가 아닌 경우, "[ERROR] 유효하지 않은 날짜입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
- 모든 에러 메시지는 "[ERROR]"로 시작하도록 작성해 주세요.
- 주문하실 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)
- 고객이 메뉴판에 없는 메뉴를 입력하는 경우, "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
- 메뉴의 개수는 1 이상의 숫자만 입력되도록 해주세요. 이외의 입력값은 "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
- 메뉴 형식이 예시와 다른 경우, "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
- 중복 메뉴를 입력한 경우(e.g. 시저샐러드-1,시저샐러드-1), "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여 주세요.
- 모든 에러 메시지는 "[ERROR]"로 시작하도록 작성해 주세요.
- 주문 메뉴의 출력 순서는 자유롭게 출력해 주세요.
- 총혜택 금액에 따라 이벤트 배지의 이름을 다르게 보여 주세요.
- 총혜택 금액 = 할인 금액의 합계 + 증정 메뉴의 가격
- 할인 후 예상 결제 금액 = 할인 전 총주문 금액 - 할인 금액
- 증정 메뉴
- 증정 이벤트에 해당하지 않는 경우, 증정 메뉴 "없음"으로 보여 주세요.
- 혜택 내역
- 고객에게 적용된 이벤트 내역만 보여 주세요.
- 적용된 이벤트가 하나도 없다면 혜택 내역 "없음"으로 보여 주세요.
- 혜택 내역에 여러 개의 이벤트가 적용된 경우, 출력 순서는 자유롭게 출력해주세요.
- 이벤트 배지
- 이벤트 배지가 부여되지 않는 경우, "없음"으로 보여 주세요.
✏️ 구현할 기능 목록
<입력>
- 사용자로부터 식당 예상 방문 날짜를 입력받습니다.
- 1 이상 31 이하의 숫자를 입력받습니다.
- 숫자가 아닌 값을 입력한 경우, NumberFormatException 발생
- 범위 밖의 숫자를 입력한 경우, IllegalArgumentException 발생
- "[ERROR] 유효하지 않은 날짜입니다. 다시 입력해 주세요."라는 에러 메시지 출력
- 사용자로부터 주문 메뉴와 개수를 입력받습니다.
- [메뉴]-[개수]`의 형식으로 입력받습니다.
- 해당 형식으로 입력하지 않은 경우, IllegalArgumentException 발생
- 메뉴에 없는 값을 입력한 경우, IllegalArgumentException 발생
- 같은 메뉴로 중복되게 입력한 경우, IllegalArgumentException 발생
- 음료 메뉴만 입력한 경우, IllegalArgumentException 발생
- 개수에 숫자가 아닌 값을 입력한 경우, NumberFormatException 발생
- 개수에 1 미만의 숫자를 입력한 경우, IllegalArgumentException 발생
- 개수의 총합이 20을 넘는 경우, IllegalArgumentException 발생
- "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지 출력
<출력>
- 모든 입력이 끝났다면, 사용자가 주문한 메뉴와 개수를 출력합니다.
- 할인 전 총주문 금액을 출력합니다.
- 할인 전 총주문 금액 = 각 메뉴마다 주문한 메뉴 가격 * 개수를 계산하여 합한 금액
- 증정 메뉴를 출력합니다.
- 할인 전 총주문 금액이 `120,000`원 이상일 때, 샴페인 1개를 증정합니다.
- 혜택 내역을 출력합니다.
- 크리스마스 디데이 할인 (1일부터 25일까지) : 총주문 금액에서 1000 + (방문 날짜 - 1) * 100원 할인
- 평일 할인 (일요일 ~ 목요일) : 디저트 메뉴 1개당 2,023원 할인
- 주말 할인 (금요일 ~ 토요일) : 메인 메뉴 1개당 2,023원 할인
- 특별 할인 (매주 일요일 + 25일) : 총주문 금액에서 1,000원 할인
- 증정 이벤트 (할인 전 총주문 금액이 12만 원 이상) : 샴페인 1개 증정
- 할인 전 총주문 금액이 10,000원 미만인 경우, "없음"을 출력합니다.
- 총혜택 금액을 출력합니다.
- 총혜택 금액 = 할인 금액의 합계 + 증정 메뉴의 가격
- 할인 후 예상 결제 금액을 출력합니다.
- 할인 후 예상 결제 금액 = 할인 전 총주문 금액 - 할인 금액의 합계
- 12월 이벤트 배지를 출력합니다.
- 총혜택 금액에 따라 다른 이벤트 배지를 부여합니다.
- 5천 원 이상: 별
- 1만 원 이상: 트리
- 2만 원 이상: 산타
- 총혜택 금액에 따라 다른 이벤트 배지를 부여합니다.
- 이벤트 배지가 부여되지 않는 경우, "없음"을 출력합니다.
🤔 고민한 점
1. 클래스와 객체 분리
이번 주차에도 클래스 설계에서 역할을 명확하게 설정하고, 클래스를 작성할 때 도메인 로직에 중점을 두는 것에 집중했습니다.
먼저 클래스를 설계할 때, 각 클래스가 어떤 도메인 로직을 처리하며 어떤 역할을 가질지 명확하게 정의하는 것부터 시작했습니다.
이번 주차에는 저번 주차와는 달리 처리해야 할 객체들이 많아 어려움을 겪었습니다.
클래스로 분리하여 처리하였으나, 원하는 대로 작동하지 않아 가독성이 떨어지는 코드가 되었습니다.
그래도 최대한 메소드를 기능별로 나누어 직관적으로 어떤 기능을 하는지 보여주려고 노력했습니다.
2. UI 로직과 도메인 로직 분리
InputView와 OutputView를 통해 UI 로직을 분리하여 코드를 작성했습니다.
이를 통해, 코드 변경이나 확장이 필요한 경우에 유연하게 처리할 수 있었습니다.
InputView와 OutputView의 내용만 수정하면 되므로 다른 부분에 영향을 미치지 않는 안정성을 확보할 수 있었습니다.
UI 로직과 도메인 로직을 분리함으로써 각 부분에 대한 테스트를 수행하는데 있어서도 더욱 편리했습니다.
💡 느낀 점
- 이번 3주차 공통 피드백 문서를 보고 많은 깨달음을 얻었는데 특히 '객체는 객체처럼 사용하라'는 말이 가장 인상 깊었습니다.
- 이처럼 외부에서 직접적으로 내부 상태를 조작하는 것이 아니라 객체에 메시지를 보내어 해당 객체가 내부에서 일을 처리하는 원칙을 최대한 준수하려고 노력했습니다.
- 코드를 작성하다 보면 이 원칙이 지켜지지 않을 때도 있지만, 앞으로도 이를 위해 노력하여 코드의 모듈화와 유지보수성을 향상시키고자 합니다.
728x90
반응형
'기타 > 우테코' 카테고리의 다른 글
[우테코] 프리코스 3주차 미션 - 로또 (0) | 2023.11.10 |
---|---|
[Kotlin] JUnit의 Assert 함수 사용하기 (0) | 2023.11.09 |
[Kotlin] JUnit으로 테스트 코드 작성하기 (0) | 2023.11.07 |
[우테코] 프리코스 2주차 미션 - 자동차 경주 (0) | 2023.11.03 |
[우테코] 프리코스 1주차 미션 - 숫자 야구 (0) | 2023.10.27 |