ewhk9887/korean_code_reviews_from_github huggingface dataset:
@@ -0,0 +1,45 @@
+package christmas.domain.discount;
+
+import christmas.domain.discount.dto.DiscountResponseDto;
+import christmas.domain.discount.dto.FreeBieResponseDto;
+import christmas.domain.menu.DrinkMenu;
+import christmas.domain.menu.Menu;
+import christmas.domain.order.OrderRequestDto;
+
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Optional;
+
+public class FreeBieDiscounter implements Discounter {
+
+    private final String DISCOUNT_NAME = "증정 할인";
+    private final Menu FREEBIE_MENU = DrinkMenu.CHAMPAGNE;
+    private final int FREEBIE_MIN_PRICE = 120_000;
+
+    @Override
+    public DiscountResponseDto discount(OrderRequestDto orderRequest) {
+
+        List<Menu> menus = orderRequest.getMenus();
+        LocalDate orderDate = orderRequest.getOrderDate();
+
+        if (isFreeBie(menus, orderDate)) {
+            return new FreeBieResponseDto(Optional.of(FREEBIE_MENU), DISCOUNT_NAME);
+        }
+
+        return new FreeBieResponseDto(Optional.empty(), DISCOUNT_NAME);
+    }
+
+    private boolean isFreeBie(List<Menu> menus, LocalDate orderDate) {
+        int totalPrice = 0;
+
+        if (orderDate.getMonth().getValue() != 12 || orderDate.getYear() != 2023) {
+            return false;
+        }
+
+        for (Menu menu : menus) {
+            totalPrice += menu.getPrice();
+        }
+
+        return totalPrice >= FREEBIE_MIN_PRICE;
+    }
+}

리뷰: 감사합니다!
@@ -0,0 +1,33 @@
+package christmas.domain.discount.dto;
+
+import christmas.domain.menu.Menu;
+
+import java.util.Optional;
+
+public class FreeBieResponseDto extends DiscountResponseDto{
+
+    private final Optional<Menu> freeBieMenu;
+
+    public FreeBieResponseDto(Optional<Menu> freeBieMenu, String discountName) {
+        super(freeBieMenu.orElse(new FreeMenu()).getPrice(), discountName);
+        this.freeBieMenu = freeBieMenu;
+    }
+
+    public Optional<Menu> getFreeBieMenu() {
+        return freeBieMenu;
+    }
+
+    static private class FreeMenu implements Menu {
+        
+
+        @Override
+        public int getPrice() {
+            return 0;
+        }
+
+        @Override
+        public String getName() {
+            return null;
+        }
+    }
+}

리뷰: 증정품을 어떻게 처리할 지에 대해 많이 고민했습니다 ㅎㅎ..
좀 더 좋은 방법이 있을 것 같은데, 저는 안 떠오르네요 ㅠㅠ
@@ -0,0 +1,84 @@
+package christmas.domain.order;
+
+import christmas.domain.discount.Discounter;
+import christmas.domain.discount.dto.DiscountResponseDto;
+import christmas.domain.discount.dto.FreeBieResponseDto;
+import christmas.domain.menu.DrinkMenu;
+import christmas.domain.menu.Menu;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class OrderImpl implements Order{
+
+    private final List<Discounter> discounters;
+
+    public OrderImpl(List<Discounter> discounters) {
+        this.discounters = discounters;
+    }
+
+    @Override
+    public OrderResponseDto order(OrderRequestDto orderRequestDto) {
+        assertValidOrder(orderRequestDto.getMenus());
+
+        List<DiscountResponseDto> discountResult = getDiscountResponses(orderRequestDto);
+        int discountPrice = getDiscountPrice(discountResult);
+        int priceBeforeDiscount = getPriceBeforeDiscount(orderRequestDto.getMenus());
+        int priceAfterDiscount = priceBeforeDiscount - discountPrice;
+
+        OrderResponseDto result = new OrderResponseDto();
+        result.setDiscountResults(discountResult);
+        result.setDiscountPrice(discountPrice);
+        result.setPriceAfterDiscount(priceAfterDiscount);
+        result.setPriceBeforeDiscount(priceBeforeDiscount);
+
+
+        return result;
+    }
+
+    private void assertValidOrder(List<Menu> menus) {
+        boolean validCheck = false;
+
+        for (Menu menu : menus) {
+            if (!(menu instanceof DrinkMenu)) {
+                validCheck = true;
+                break;
+            }
+        }
+
+        if (!validCheck) {
+            throw new IllegalArgumentException(OrderErrorMessage.INVALID_ORDER.getMessage());
+        }
+    }
+
+
+    private List<DiscountResponseDto> getDiscountResponses(OrderRequestDto orderRequestDto){
+        List<DiscountResponseDto> result = new ArrayList<>();
+
+        for (Discounter discounter : discounters) {
+            result.add(discounter.discount(orderRequestDto));
+        }
+        return result;
+    }
+
+
+    //증정은 따로 처리 필요.
+    private int getDiscountPrice(List<DiscountResponseDto> discounts) {
+        int discountPrice = 0;
+        for (DiscountResponseDto discount : discounts) {
+            discountPrice += discount.getTotalDiscount();
+        }
+
+        return discountPrice;
+    }
+
+    private int getPriceBeforeDiscount(List<Menu> menus) {
+        int priceBeforeDiscount = 0;
+
+        for (Menu menu : menus) {
+            priceBeforeDiscount += menu.getPrice();
+        }
+
+        return priceBeforeDiscount;
+    }
+}

리뷰: 오! 그렇네요. 감사합니다!
@@ -0,0 +1,43 @@
+package christmas.domain.user;
+
+import java.util.Optional;
+
+public enum Badge {
+    STAR(5_000, "별"),
+    TREE(10_000, "트리"),
+    SANTA(20_000, "산타");
+
+    private final int minPrice;
+    private final String message;
+
+    Badge(int minPrice, String message) {
+        this.minPrice = minPrice;
+        this.message = message;
+    }
+
+    public int getMinPrice() {
+        return minPrice;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public static Optional<Badge> findByPrice(int discountPrice) {
+        Badge result = null;
+
+        for (Badge badge : Badge.values()) {
+            if (result == null && badge.getMinPrice() <= discountPrice) {
+                result = badge;
+            }
+            else if (badge.getMinPrice() <= discountPrice && badge.getMinPrice() >= result.getMinPrice() ) {
+                result = badge;
+            }
+        }
+
+        if (result == null) {
+            return Optional.empty();
+        }
+        return Optional.of(result);
+    }
+}

리뷰: 앗 그렇군요. 그냥 message로만 있으면 헷갈리겠네요.
@@ -0,0 +1,28 @@
+package christmas.domain.user;
+
+import christmas.domain.order.Order;
+import christmas.domain.order.OrderRequestDto;
+import christmas.domain.order.OrderResponseDto;
+
+import java.util.Optional;
+
+public class User {
+
+    private Optional<Badge> badge;
+    private final Order order;
+
+    public User(Order order) {
+        this.order = order;
+    }
+
+    public OrderResponseDto order(OrderRequestDto request) {
+        OrderResponseDto response = order.order(request);
+        this.badge = Badge.findByPrice(response.getDiscountPrice());
+
+        return response;
+    }
+
+    public Optional<Badge> getBadge() {
+        return badge;
+    }
+}

리뷰: Optional을 생각보다 많이 쓰고, 추천해주더라고요. 이펙티브 자바나 좋은 코드, 나쁜 코드 등 다양한 곳에서 나옵니다!
@@ -0,0 +1,81 @@
+package christmas.presentation;
+
+import camp.nextstep.edu.missionutils.Console;
+import christmas.domain.menu.Menu;
+import christmas.domain.order.OrderErrorMessage;
+
+import java.time.LocalDate;
+import java.util.*;
+
+public class InputView {
+
+    public LocalDate inputDate() throws IllegalArgumentException {
+
+        try {
+            System.out.println("12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)");
+            int date = Integer.parseInt(Console.readLine());
+
+            if (date < 1 || date > 31) {
+                throw new IllegalArgumentException(ViewErrorMessage.INVALID_DATE_FORMAT.getMessage());
+            }
+
+            return LocalDate.of(2023,12,date);
+        } catch (NumberFormatException ex) {
+            throw new IllegalArgumentException(ViewErrorMessage.INVALID_DATE_FORMAT.getMessage());
+        }
+    }
+
+    public Map<String, Integer> inputMenus() throws IllegalArgumentException {
+        System.out.println("주문하실 메뉴를 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)");
+        String userInput = Console.readLine();
+        try {
+            Map<String, Integer> result = parsingMenus(userInput);
+            if (result.keySet().size() == 0) {
+                throw new IllegalArgumentException(OrderErrorMessage.INVALID_ORDER.getMessage());
+            }
+
+            return result;
+        } catch (IllegalArgumentException ex) {
+            throw ex;
+        }
+    }
+
+
+
+    private Map<String, Integer> parsingMenus(String userOrder) throws IllegalArgumentException {
+        Map<String,Integer> menus = new HashMap<>();
+        Set<String> orderMenu = new HashSet<>();
+
+        List<String> splitMenus = List.of(userOrder.split(","));
+        for (String splitMenu : splitMenus) {
+            Map<String, Integer> tmpResult = parsingMenu(splitMenu);
+            String tmpMenuName = tmpResult.keySet().iterator().next();
+
+            if (orderMenu.contains(tmpMenuName)) {
+                throw new IllegalArgumentException(OrderErrorMessage.INVALID_ORDER.getMessage());
+            }
+            orderMenu.add(tmpMenuName);
+            menus.put(tmpMenuName, tmpResult.get(tmpMenuName));
+        }
+        return menus;
+    }
+
+    private Map<String, Integer> parsingMenu(String menu) {
+        Map<String, Integer> parsingResult = new HashMap<>();
+        int i = menu.lastIndexOf("-");
+
+        if (i == -1) {
+            throw new IllegalArgumentException(OrderErrorMessage.INVALID_ORDER.getMessage());
+        }
+
+        try {
+            parsingResult.put(menu.substring(0,i), Integer.parseInt(menu.substring(i + 1)));
+        } catch (IllegalArgumentException ex) {
+            throw new IllegalArgumentException(OrderErrorMessage.INVALID_ORDER.getMessage());
+        } catch (Exception ex) {
+            throw new IllegalArgumentException(OrderErrorMessage.INVALID_ORDER.getMessage());
+        }
+
+        return parsingResult;
+    }
+}

리뷰: 음... 저도 이제 보니 도메인 객체에서 체크하는 것이 맞는 것 같네요.
만약 요구사항이 변경되어서 11월만 주문이 가능하다면, 이 부분은 도메인에 해당하는 것 같습니다.
피드백 감사합니다.
@@ -0,0 +1,81 @@
+package christmas.presentation;
+
+import camp.nextstep.edu.missionutils.Console;
+import christmas.domain.menu.Menu;
+import christmas.domain.order.OrderErrorMessage;
+
+import java.time.LocalDate;
+import java.util.*;
+
+public class InputView {
+
+    public LocalDate inputDate() throws IllegalArgumentException {
+
+        try {
+            System.out.println("12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)");
+            int date = Integer.parseInt(Console.readLine());
+
+            if (date < 1 || date > 31) {
+                throw new IllegalArgumentException(ViewErrorMessage.INVALID_DATE_FORMAT.getMessage());
+            }
+
+            return LocalDate.of(2023,12,date);
+        } catch (NumberFormatException ex) {
+            throw new IllegalArgumentException(ViewErrorMessage.INVALID_DATE_FORMAT.getMessage());
+        }
+    }
+
+    public Map<String, Integer> inputMenus() throws IllegalArgumentException {
+        System.out.println("주문하실 메뉴를 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)");
+        String userInput = Console.readLine();
+        try {
+            Map<String, Integer> result = parsingMenus(userInput);
+            if (result.keySet().size() == 0) {
+                throw new IllegalArgumentException(OrderErrorMessage.INVALID_ORDER.getMessage());
+            }
+
+            return result;
+        } catch (IllegalArgumentException ex) {
+            throw ex;
+        }
+    }
+
+
+
+    private Map<String, Integer> parsingMenus(String userOrder) throws IllegalArgumentException {
+        Map<String,Integer> menus = new HashMap<>();
+        Set<String> orderMenu = new HashSet<>();
+
+        List<String> splitMenus = List.of(userOrder.split(","));
+        for (String splitMenu : splitMenus) {
+            Map<String, Integer> tmpResult = parsingMenu(splitMenu);
+            String tmpMenuName = tmpResult.keySet().iterator().next();
+
+            if (orderMenu.contains(tmpMenuName)) {
+                throw new IllegalArgumentException(OrderErrorMessage.INVALID_ORDER.getMessage());
+            }
+            orderMenu.add(tmpMenuName);
+            menus.put(tmpMenuName, tmpResult.get(tmpMenuName));
+        }
+        return menus;
+    }
+
+    private Map<String, Integer> parsingMenu(String menu) {
+        Map<String, Integer> parsingResult = new HashMap<>();
+        int i = menu.lastIndexOf("-");
+
+        if (i == -1) {
+            throw new IllegalArgumentException(OrderErrorMessage.INVALID_ORDER.getMessage());
+        }
+
+        try {
+            parsingResult.put(menu.substring(0,i), Integer.parseInt(menu.substring(i + 1)));
+        } catch (IllegalArgumentException ex) {
+            throw new IllegalArgumentException(OrderErrorMessage.INVALID_ORDER.getMessage());
+        } catch (Exception ex) {
+            throw new IllegalArgumentException(OrderErrorMessage.INVALID_ORDER.getMessage());
+        }
+
+        return parsingResult;
+    }
+}

리뷰: 콤마로 메뉴를 구분하거나 <메뉴 이름>-1 이런 식으로 입력이 된다는 것은 InputView만 알고 있다고 생각했습니다. 그래서 이 부분을 다른 객체에서 사용할 수 있게끔 가공하는 것도 InputView의 역할이라고 생각해서 이렇게 처리 했습니다.
@@ -0,0 +1,53 @@
+package christmas.Domain;
+
+import christmas.Constant.December;
+import christmas.Constant.DiscountPrice;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Discount {
+
+    public Map<String, Integer> applyDiscount(int visitDay, int dessertCount, int mainCount) {
+        Map<String, Integer> appliedDiscount = new HashMap<>();
+        calculateChristmasDiscount(visitDay, appliedDiscount);
+        calculateWeekendDiscount(visitDay, mainCount, appliedDiscount);
+        calculateSpecialDiscount(visitDay, appliedDiscount);
+        calculateWeekdayDiscount(visitDay, dessertCount, appliedDiscount);
+        return appliedDiscount;
+    }
+
+    private void calculateChristmasDiscount(int visitDay, Map<String, Integer> appliedDiscount) {
+        if (December.FIRST_DAY.getDay() <= visitDay && visitDay <= December.CHRISTMAS.getDay()) {
+            appliedDiscount.put("크리스마스 디데이 할인",
+                ((visitDay - December.FIRST_DAY.getDay()) * DiscountPrice.DAILY_INCREASE.getPrice())
+                    + DiscountPrice.DEFAULT_DISCOUNT.getPrice());
+        }
+    }
+
+    private void calculateWeekendDiscount(int visitDay, int mainCount,
+        Map<String, Integer> appliedDiscount) {
+        if (getDayOfWeek(visitDay) == December.FRIDAY.getDay()
+            || getDayOfWeek(visitDay) == December.SATURDAY.getDay()) {
+            appliedDiscount.put("주말 할인", DiscountPrice.WEEKEND_DISCOUNT.getPrice() * mainCount);
+        }
+    }
+
+    private void calculateSpecialDiscount(int visitDay, Map<String, Integer> appliedDiscount) {
+        if (getDayOfWeek(visitDay) == December.SUNDAY.getDay()
+            || visitDay == December.CHRISTMAS.getDay()) {
+            appliedDiscount.put("특별 할인", DiscountPrice.SPECIAL_DISCOUNT.getPrice());
+        }
+    }
+
+    private void calculateWeekdayDiscount(int visitDay, int dessertCount,
+        Map<String, Integer> appliedDiscount) {
+        if (December.SUNDAY.getDay() <= getDayOfWeek(visitDay)
+            && getDayOfWeek(visitDay) <= December.THURSDAY.getDay()) {
+            appliedDiscount.put("평일 할인", DiscountPrice.WEEKDAY_DISCOUNT.getPrice() * dessertCount);
+        }
+    }
+
+    private static int getDayOfWeek(int visitDay) {
+        return visitDay % December.WEEK_DAYS.getDay();
+    }
+}

리뷰: 제가 Enum 과 함수형을 활용하지는 않았지만 다른분이 활용하신 것을 봤어서 공유해드립니다!
[이 링크](https://github.com/june-777/java-christmas-6-june-777/pull/1/files#diff-7bfcb10ed508aaf21090292db65f13df60f023b14552f1338a16fe10023b9948)에서 EventType 부분을 확인해보시면 됩니다!
<img width="850" alt="image" src="https://github.com/Firedrago95/java-christmas-6-Firedrago95/assets/78288539/dc123cfb-535e-4223-8328-cfe3d4597608">
@@ -0,0 +1,97 @@
+package christmas.Controller;
+
+import christmas.Domain.PromotionService;
+import christmas.Util.Parser;
+import christmas.View.InputView;
+import christmas.View.OutputView;
+
+
+public class PromotionController {
+
+    private PromotionService promotionService;
+
+    public void run() {
+        setPromotion();
+        printOrderList();
+        printTotalPrice();
+        if (hasNoEvent()) {
+            printNoEvent();
+            return;
+        }
+        printEligibleGift();
+        printAppliedDiscount();
+        printTotalBenefit();
+        printTotalPayment();
+        printChristmasBadge();
+    }
+
+    private void setPromotion() {
+        setUpService();
+        setDate();
+        setOrder();
+    }
+
+    private void setUpService() {
+        promotionService = new PromotionService();
+    }
+
+    private void setDate() {
+        try {
+            int visitDay = InputView.requestVisitDay();
+            promotionService.createDate(visitDay);
+        } catch (IllegalArgumentException e) {
+            System.out.println(e.getMessage());
+            setDate();
+        }
+    }
+
+    private void setOrder() {
+        try {
+            String orders = InputView.requestOrder();
+            promotionService.createOrder(Parser.convertStringToMap(orders));
+        } catch (IllegalArgumentException e) {
+            System.out.println(e.getMessage());
+            setOrder();
+        }
+    }
+
+    private void printOrderList() {
+        OutputView.printOrder(promotionService.getOrderList());
+    }
+
+    private void printTotalPrice() {
+        OutputView.printTotalPrice(promotionService.getTotalPrice());
+    }
+
+    private void printNoEvent() {
+        OutputView.printNoEvent(promotionService.getTotalPrice());
+    }
+
+    private boolean hasNoEvent() {
+        boolean isEventOn = promotionService.isEventOn();
+        if (!isEventOn) {
+            return true;
+        }
+        return false;
+    }
+
+    private void printEligibleGift() {
+        OutputView.printGift(promotionService.hasGift());
+    }
+
+    private void printAppliedDiscount() {
+        OutputView.printDiscount(promotionService.getDiscount(), promotionService.hasGift());
+    }
+
+    private void printTotalBenefit() {
+        OutputView.printTotalBenefit(promotionService.getTotalBenefit());
+    }
+
+    private void printTotalPayment() {
+        OutputView.printTotalPayment(promotionService.getTotalPayment());
+    }
+
+    private void printChristmasBadge() {
+        OutputView.printBadge(promotionService.getChristmasBadge());
+    }
+}

리뷰: 서비스 계층은 한번 설정되고 난 뒤로 변경되지 않으니까 Controller 생성자를 통해서 주입 받는 방법도 괜찮을 것 같습니다!😁
@@ -0,0 +1,97 @@
+package christmas.Controller;
+
+import christmas.Domain.PromotionService;
+import christmas.Util.Parser;
+import christmas.View.InputView;
+import christmas.View.OutputView;
+
+
+public class PromotionController {
+
+    private PromotionService promotionService;
+
+    public void run() {
+        setPromotion();
+        printOrderList();
+        printTotalPrice();
+        if (hasNoEvent()) {
+            printNoEvent();
+            return;
+        }
+        printEligibleGift();
+        printAppliedDiscount();
+        printTotalBenefit();
+        printTotalPayment();
+        printChristmasBadge();
+    }
+
+    private void setPromotion() {
+        setUpService();
+        setDate();
+        setOrder();
+    }
+
+    private void setUpService() {
+        promotionService = new PromotionService();
+    }
+
+    private void setDate() {
+        try {
+            int visitDay = InputView.requestVisitDay();
+            promotionService.createDate(visitDay);
+        } catch (IllegalArgumentException e) {
+            System.out.println(e.getMessage());
+            setDate();
+        }
+    }
+
+    private void setOrder() {
+        try {
+            String orders = InputView.requestOrder();
+            promotionService.createOrder(Parser.convertStringToMap(orders));
+        } catch (IllegalArgumentException e) {
+            System.out.println(e.getMessage());
+            setOrder();
+        }
+    }
+
+    private void printOrderList() {
+        OutputView.printOrder(promotionService.getOrderList());
+    }
+
+    private void printTotalPrice() {
+        OutputView.printTotalPrice(promotionService.getTotalPrice());
+    }
+
+    private void printNoEvent() {
+        OutputView.printNoEvent(promotionService.getTotalPrice());
+    }
+
+    private boolean hasNoEvent() {
+        boolean isEventOn = promotionService.isEventOn();
+        if (!isEventOn) {
+            return true;
+        }
+        return false;
+    }
+
+    private void printEligibleGift() {
+        OutputView.printGift(promotionService.hasGift());
+    }
+
+    private void printAppliedDiscount() {
+        OutputView.printDiscount(promotionService.getDiscount(), promotionService.hasGift());
+    }
+
+    private void printTotalBenefit() {
+        OutputView.printTotalBenefit(promotionService.getTotalBenefit());
+    }
+
+    private void printTotalPayment() {
+        OutputView.printTotalPayment(promotionService.getTotalPayment());
+    }
+
+    private void printChristmasBadge() {
+        OutputView.printBadge(promotionService.getChristmasBadge());
+    }
+}

리뷰: 저도 잘 활용하지는 못하지만 함수형 인터페이스를 활용해보시면 하나의 `try-catch` 문을 사용할 수 있더라고요!
같은 지원자이신 현준님이 [정리해주신 글](https://hstory0208.tistory.com/entry/Java-%ED%95%A8%EC%88%98%ED%98%95-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EB%9E%80-%ED%99%9C%EC%9A%A9-%EB%B0%A9%EB%B2%95%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90)이 있어서 공유해드립니다!
@@ -0,0 +1,28 @@
+package christmas.View;
+
+import camp.nextstep.edu.missionutils.Console;
+import christmas.Domain.Date;
+
+public class InputView {
+
+    public static final String REQUEST_ORDER =
+        "주문하실 메뉴를 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)";
+    private static final String REQUEST_VISIT_DAY =
+        "12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)";
+
+    public static int requestVisitDay() {
+        try {
+            System.out.println(REQUEST_VISIT_DAY);
+            return Integer.parseInt(Console.readLine());
+        } catch (NumberFormatException e) {
+            System.out.println(Date.INVALID_RANGE);
+            return requestVisitDay();
+        }
+    }
+
+    public static String requestOrder() {
+        System.out.println(REQUEST_ORDER);
+        return Console.readLine();
+    }
+
+}

리뷰: 접근 제어자가 다른 특별한 이유가 있으시나요??🧐
@@ -0,0 +1,28 @@
+package christmas.View;
+
+import camp.nextstep.edu.missionutils.Console;
+import christmas.Domain.Date;
+
+public class InputView {
+
+    public static final String REQUEST_ORDER =
+        "주문하실 메뉴를 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)";
+    private static final String REQUEST_VISIT_DAY =
+        "12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)";
+
+    public static int requestVisitDay() {
+        try {
+            System.out.println(REQUEST_VISIT_DAY);
+            return Integer.parseInt(Console.readLine());
+        } catch (NumberFormatException e) {
+            System.out.println(Date.INVALID_RANGE);
+            return requestVisitDay();
+        }
+    }
+
+    public static String requestOrder() {
+        System.out.println(REQUEST_ORDER);
+        return Console.readLine();
+    }
+
+}

리뷰: 개인적인 생각이지만 이러면 `IllegalArgumentException` 이 아닌 `NumberFormatException` 가 발생할 것 같아요.
물론 `NumberFormatException`가 `IllegalArgumentException` 의 자식 예외이지만 그래도 요구사항에 명시적으로 `IllegalArgumentException` 를 발생시키라고 되어 있으니까 지겨주면 좋을 것 같습니다!(지극히 개인적인 의견입니다!☺️)