ewhk9887/korean_code_reviews_from_github huggingface dataset:
@@ -0,0 +1,104 @@
+import InputView from "../InputView.js";
+import dateIsValid from "../utils/dateIsValid.js";
+import foodIsValid from "../utils/foodIsValid.js";
+import orderMenu from "../domain/orderMenu.js";
+import OutputView from "../OutputView.js";
+import preDiscountAmount from "../domain/preDiscountAmount.js";
+import Discount from "../domain/Discount.js";
+import totalDiscount from "../domain/totalDiscount.js";
+import badge from "../domain/badge.js";
+
+/**
+ * 크리스마스 할인 이벤트 로직 제어하는 컨트롤러 클래스
+ * @class
+ */
+class ChristmasController {
+  /**
+   * 할인 객체
+   * @type {Discount}
+   * @private
+   */
+  #discount = new Discount();
+
+  /**
+   * ChristmasController 인스턴스 생성
+   * @constructor
+   */
+  constructor() {
+    /**
+     * 애플리케이션 시작 메시지 출력
+     */
+    OutputView.start();
+  }
+
+  /**
+   * 사용자로부터 날짜를 입력 받는 메서드
+   * @async
+   * @returns {Promise<string>} 입력받은 날짜
+   */
+  async dateInput() {
+    return this.#handleDateInput();
+  }
+
+  /**
+   * 날짜 입력 처리를 담당하는 메서드
+   * @async
+   * @private
+   * @returns {Promise<string>} 입력받은 날짜
+   * @throws {InputError} 입력이 유효하지 않은 경우 발생하는 예외
+   */
+  async #handleDateInput() {
+    try {
+      const date = await InputView.date();
+      dateIsValid(date);
+      return date;
+    } catch (error) {
+      OutputView.errorPrint(error.message);
+      return this.#handleDateInput();
+    }
+  }
+
+  /**
+   * 사용자로부터 음식을 입력받는 메서드
+   * @async
+   * @returns {Promise<string>} 입력받은 음식
+   */
+  async foodInput() {
+    return this.#handleFoodInput();
+  }
+
+  /**
+   * 음식 입력 처리를 담당하는 메서드
+   * @async
+   * @private
+   * @returns {Promise<string>} 입력받은 음식
+   * @throws {InputError} 입력이 유효하지 않은 경우 발생하는 예외
+   */
+  async #handleFoodInput() {
+    try {
+      const food = await InputView.food();
+      foodIsValid(food);
+      return food;
+    } catch (error) {
+      OutputView.errorPrint(error.message);
+      return this.#handleFoodInput();
+    }
+  }
+
+  /**
+   * 크리스마스 이벤트 로직을 처리하는 메서드
+   * @param {string} date - 날짜
+   * @param {string} food - 음식 주문
+   * @returns {void}
+   */
+  handleChristmasLogic(date, food) {
+    OutputView.preView(date);
+    const menu = orderMenu(food);
+    const totalPrice = preDiscountAmount(menu.menuNames, menu.quantities);
+    const discount = this.#discount.discountPrice(menu, date, totalPrice);
+    const totalDiscountPrice = totalDiscount(totalPrice, discount);
+    badge(totalDiscountPrice);
+  }
+}
+
+export default ChristmasController;

리뷰: #handleFoodInput()랑 로직이 거의 동일한거 같은데, 묶어 볼 수 있을거 같아여 저는 아래와 같이 묶었습니다! 참고해 보시면 좋을거 같아여

```js
/**
 * @module ErrorHandler
 * 시스템 작업 중 발생하는 예외 처리 및 재 실행을 위한 모듈
 */
const ErrorHandler = {
  /**
   * 제공된 비동기 함수를 실행 후 오류가 발생하지 않을 때 까지 오류 메시지를 출력하고 함수를 재 실행
   * @template T
   * @param {Function} executeFunction - 실행할 비동기 함수
   * @returns {Promise<T>} 비동기 함수가 성공적으로 완료되면 그 결과를 반환
   */
  async retryOnErrors(executeFunction) {
    try {
      return await executeFunction();
    } catch (error) {
      Console.print(error.message);
      return this.retryOnErrors(executeFunction);
    }
  },
};

export default ErrorHandler;

```
@@ -0,0 +1,51 @@
+import { MENU } from "../constants/menu.js";
+import { NUMBERS } from "../constants/numbers.js";
+import OutputView from "../OutputView.js";
+
+const { zero } = NUMBERS;
+
+/**
+ * 주문된 음식의 가격과 수량을 기반으로 할인 전 총 주문 가격을 계산함.
+ *
+ * @param {Array} menuNames - 주문된 음식 목록
+ * @param {Array} quantities - 주문된 음식 수량
+ * @returns {number} - 할인 전 총 주문 가격
+ */
+const preDiscountAmount = (menuNames, quantities) => {
+  const orderedFoodList = orderedFoods(menuNames, quantities);
+  const totalAmount = orderedFoodList.reduce((total, food) => {
+    return total + food.price * food.quantity;
+  }, zero);
+
+  preDiscountAmountOutput(totalAmount);
+
+  return totalAmount;
+};
+
+/**
+ * 주문한 메뉴 이름과 수량을 바탕으로 주문된 음식 목록을 생성함.
+ *
+ * @param {Array} menuNames - 주문된 음식 목록
+ * @param {Array} quantities - 주문된 음식 수량
+ * @returns {Array<{ menu: string, quantity: number, price: number }>} - 주문된 음식 목록
+ */
+const orderedFoods = (menuNames, quantities) => {
+  return menuNames.map((menu, index) => {
+    const menuItem = MENU.find((food) => food.menu === menu);
+    const quantity = parseInt(quantities[index], 10);
+    const price = menuItem.price;
+    return { menu, quantity, price };
+  });
+};
+/**
+ * 할인 전 총 주문 가격을 출력함.
+ *
+ * @param {number} totalAmount - 할인 전 총 주문 가격
+ * @returns {void}
+ */
+const preDiscountAmountOutput = (totalAmount) => {
+  OutputView.preDiscount(totalAmount);
+  OutputView.free(totalAmount);
+};
+
+export default preDiscountAmount;

리뷰: 구조분해할당으로 더 간력하게 표현 가능해보입니다!

```suggestion
  const totalAmount = orderedFoodList.reduce((total, {price, quantitiy}) => {
    return total + price * quantity;
  }, zero);
```
@@ -0,0 +1,104 @@
+import InputView from "../InputView.js";
+import dateIsValid from "../utils/dateIsValid.js";
+import foodIsValid from "../utils/foodIsValid.js";
+import orderMenu from "../domain/orderMenu.js";
+import OutputView from "../OutputView.js";
+import preDiscountAmount from "../domain/preDiscountAmount.js";
+import Discount from "../domain/Discount.js";
+import totalDiscount from "../domain/totalDiscount.js";
+import badge from "../domain/badge.js";
+
+/**
+ * 크리스마스 할인 이벤트 로직 제어하는 컨트롤러 클래스
+ * @class
+ */
+class ChristmasController {
+  /**
+   * 할인 객체
+   * @type {Discount}
+   * @private
+   */
+  #discount = new Discount();
+
+  /**
+   * ChristmasController 인스턴스 생성
+   * @constructor
+   */
+  constructor() {
+    /**
+     * 애플리케이션 시작 메시지 출력
+     */
+    OutputView.start();
+  }
+
+  /**
+   * 사용자로부터 날짜를 입력 받는 메서드
+   * @async
+   * @returns {Promise<string>} 입력받은 날짜
+   */
+  async dateInput() {
+    return this.#handleDateInput();
+  }
+
+  /**
+   * 날짜 입력 처리를 담당하는 메서드
+   * @async
+   * @private
+   * @returns {Promise<string>} 입력받은 날짜
+   * @throws {InputError} 입력이 유효하지 않은 경우 발생하는 예외
+   */
+  async #handleDateInput() {
+    try {
+      const date = await InputView.date();
+      dateIsValid(date);
+      return date;
+    } catch (error) {
+      OutputView.errorPrint(error.message);
+      return this.#handleDateInput();
+    }
+  }
+
+  /**
+   * 사용자로부터 음식을 입력받는 메서드
+   * @async
+   * @returns {Promise<string>} 입력받은 음식
+   */
+  async foodInput() {
+    return this.#handleFoodInput();
+  }
+
+  /**
+   * 음식 입력 처리를 담당하는 메서드
+   * @async
+   * @private
+   * @returns {Promise<string>} 입력받은 음식
+   * @throws {InputError} 입력이 유효하지 않은 경우 발생하는 예외
+   */
+  async #handleFoodInput() {
+    try {
+      const food = await InputView.food();
+      foodIsValid(food);
+      return food;
+    } catch (error) {
+      OutputView.errorPrint(error.message);
+      return this.#handleFoodInput();
+    }
+  }
+
+  /**
+   * 크리스마스 이벤트 로직을 처리하는 메서드
+   * @param {string} date - 날짜
+   * @param {string} food - 음식 주문
+   * @returns {void}
+   */
+  handleChristmasLogic(date, food) {
+    OutputView.preView(date);
+    const menu = orderMenu(food);
+    const totalPrice = preDiscountAmount(menu.menuNames, menu.quantities);
+    const discount = this.#discount.discountPrice(menu, date, totalPrice);
+    const totalDiscountPrice = totalDiscount(totalPrice, discount);
+    badge(totalDiscountPrice);
+  }
+}
+
+export default ChristmasController;

리뷰: ```suggestion
  handleChristmasLogic(date, food) {
    OutputView.preView(date);
    
    const menu = orderMenu(food);
    const totalPrice = preDiscountAmount(menu.menuNames, menu.quantities);
    const discount = this.#discount.discountPrice(menu, date, totalPrice);
    const totalDiscountPrice = totalDiscount(totalPrice, discount);
    badge(totalDiscountPrice);
  }
```

사소하지만 개행을 넣어볼 수 있을거 같아여
@@ -0,0 +1,39 @@
+import { NUMBERS } from "../constants/numbers.js";
+import { PROMPT } from "../constants/prompt.js";
+import OutputView from "../OutputView.js";
+
+const { zero } = NUMBERS;
+const { order_menu } = PROMPT;
+
+/**
+ * 입력받은 음식 정보를 가공하여 주문 목록을 반환함.
+ * 
+ * @param {string} food - 음식 정보 문자열
+ * @returns {{ menuNames: Array<string>, quantities: Array<number> }} - 추출된 음식 이름과 수량
+ * @property {Array} menuNames - 음식 목록
+ * @property {Array} quantities - 수량 목록
+ */
+const orderMenu = (food) => {
+  const menuNames = food.match(/[^\d,-]+/g);
+  const quantities = food.match(/\d+/g);
+
+  orderMenuOutput(menuNames, quantities);
+  return { menuNames, quantities };
+};
+
+/**
+ * 주문 목록을 출력합니다.
+ * 
+ * @param {Array} menuNames - 음식 목록
+ * @param {Array} quantities - 수량 목록
+ * @returns {void}
+ */
+const orderMenuOutput = (menuNames, quantities) => {
+  OutputView.print(order_menu);
+  menuNames.map((name, index) => {
+    const quantity = quantities[index];
+    OutputView.menu(name, quantity);
+  });
+};
+
+export default orderMenu;

리뷰: match를 사용해 볼 수도 있었네여 한 수 배우고갑니다 👍
@@ -0,0 +1,104 @@
+import InputView from "../InputView.js";
+import dateIsValid from "../utils/dateIsValid.js";
+import foodIsValid from "../utils/foodIsValid.js";
+import orderMenu from "../domain/orderMenu.js";
+import OutputView from "../OutputView.js";
+import preDiscountAmount from "../domain/preDiscountAmount.js";
+import Discount from "../domain/Discount.js";
+import totalDiscount from "../domain/totalDiscount.js";
+import badge from "../domain/badge.js";
+
+/**
+ * 크리스마스 할인 이벤트 로직 제어하는 컨트롤러 클래스
+ * @class
+ */
+class ChristmasController {
+  /**
+   * 할인 객체
+   * @type {Discount}
+   * @private
+   */
+  #discount = new Discount();
+
+  /**
+   * ChristmasController 인스턴스 생성
+   * @constructor
+   */
+  constructor() {
+    /**
+     * 애플리케이션 시작 메시지 출력
+     */
+    OutputView.start();
+  }
+
+  /**
+   * 사용자로부터 날짜를 입력 받는 메서드
+   * @async
+   * @returns {Promise<string>} 입력받은 날짜
+   */
+  async dateInput() {
+    return this.#handleDateInput();
+  }
+
+  /**
+   * 날짜 입력 처리를 담당하는 메서드
+   * @async
+   * @private
+   * @returns {Promise<string>} 입력받은 날짜
+   * @throws {InputError} 입력이 유효하지 않은 경우 발생하는 예외
+   */
+  async #handleDateInput() {
+    try {
+      const date = await InputView.date();
+      dateIsValid(date);
+      return date;
+    } catch (error) {
+      OutputView.errorPrint(error.message);
+      return this.#handleDateInput();
+    }
+  }
+
+  /**
+   * 사용자로부터 음식을 입력받는 메서드
+   * @async
+   * @returns {Promise<string>} 입력받은 음식
+   */
+  async foodInput() {
+    return this.#handleFoodInput();
+  }
+
+  /**
+   * 음식 입력 처리를 담당하는 메서드
+   * @async
+   * @private
+   * @returns {Promise<string>} 입력받은 음식
+   * @throws {InputError} 입력이 유효하지 않은 경우 발생하는 예외
+   */
+  async #handleFoodInput() {
+    try {
+      const food = await InputView.food();
+      foodIsValid(food);
+      return food;
+    } catch (error) {
+      OutputView.errorPrint(error.message);
+      return this.#handleFoodInput();
+    }
+  }
+
+  /**
+   * 크리스마스 이벤트 로직을 처리하는 메서드
+   * @param {string} date - 날짜
+   * @param {string} food - 음식 주문
+   * @returns {void}
+   */
+  handleChristmasLogic(date, food) {
+    OutputView.preView(date);
+    const menu = orderMenu(food);
+    const totalPrice = preDiscountAmount(menu.menuNames, menu.quantities);
+    const discount = this.#discount.discountPrice(menu, date, totalPrice);
+    const totalDiscountPrice = totalDiscount(totalPrice, discount);
+    badge(totalDiscountPrice);
+  }
+}
+
+export default ChristmasController;

리뷰: 프린트 하는 것을 한곳에서 다 처리하기 위한 메서드 작성이 눈에 띄였습니다. 기능별 메서드 작성이 잘 된 케이스라고 생각합니다. 그런데 여기에서 discount안에 benefit이 같이 있다 보니 샴페인 혜택에 대해서 처리를 하지 않았나 하는 오해가 생길뻔 했습니다. 변수명에서 조금 힌트를 주는 것은 어떨까 싶습니다!
@@ -0,0 +1,104 @@
+import InputView from "../InputView.js";
+import dateIsValid from "../utils/dateIsValid.js";
+import foodIsValid from "../utils/foodIsValid.js";
+import orderMenu from "../domain/orderMenu.js";
+import OutputView from "../OutputView.js";
+import preDiscountAmount from "../domain/preDiscountAmount.js";
+import Discount from "../domain/Discount.js";
+import totalDiscount from "../domain/totalDiscount.js";
+import badge from "../domain/badge.js";
+
+/**
+ * 크리스마스 할인 이벤트 로직 제어하는 컨트롤러 클래스
+ * @class
+ */
+class ChristmasController {
+  /**
+   * 할인 객체
+   * @type {Discount}
+   * @private
+   */
+  #discount = new Discount();
+
+  /**
+   * ChristmasController 인스턴스 생성
+   * @constructor
+   */
+  constructor() {
+    /**
+     * 애플리케이션 시작 메시지 출력
+     */
+    OutputView.start();
+  }
+
+  /**
+   * 사용자로부터 날짜를 입력 받는 메서드
+   * @async
+   * @returns {Promise<string>} 입력받은 날짜
+   */
+  async dateInput() {
+    return this.#handleDateInput();
+  }
+
+  /**
+   * 날짜 입력 처리를 담당하는 메서드
+   * @async
+   * @private
+   * @returns {Promise<string>} 입력받은 날짜
+   * @throws {InputError} 입력이 유효하지 않은 경우 발생하는 예외
+   */
+  async #handleDateInput() {
+    try {
+      const date = await InputView.date();
+      dateIsValid(date);
+      return date;
+    } catch (error) {
+      OutputView.errorPrint(error.message);
+      return this.#handleDateInput();
+    }
+  }
+
+  /**
+   * 사용자로부터 음식을 입력받는 메서드
+   * @async
+   * @returns {Promise<string>} 입력받은 음식
+   */
+  async foodInput() {
+    return this.#handleFoodInput();
+  }
+
+  /**
+   * 음식 입력 처리를 담당하는 메서드
+   * @async
+   * @private
+   * @returns {Promise<string>} 입력받은 음식
+   * @throws {InputError} 입력이 유효하지 않은 경우 발생하는 예외
+   */
+  async #handleFoodInput() {
+    try {
+      const food = await InputView.food();
+      foodIsValid(food);
+      return food;
+    } catch (error) {
+      OutputView.errorPrint(error.message);
+      return this.#handleFoodInput();
+    }
+  }
+
+  /**
+   * 크리스마스 이벤트 로직을 처리하는 메서드
+   * @param {string} date - 날짜
+   * @param {string} food - 음식 주문
+   * @returns {void}
+   */
+  handleChristmasLogic(date, food) {
+    OutputView.preView(date);
+    const menu = orderMenu(food);
+    const totalPrice = preDiscountAmount(menu.menuNames, menu.quantities);
+    const discount = this.#discount.discountPrice(menu, date, totalPrice);
+    const totalDiscountPrice = totalDiscount(totalPrice, discount);
+    badge(totalDiscountPrice);
+  }
+}
+
+export default ChristmasController;

리뷰: logic이라는 네이밍 보단 '12월의 이벤트 계획' 이라는 요구사항이 있었던 만큼 handleChristmasEventPlan 으로 더 명시적으로 나타내 볼 수 있을거 같아여
@@ -0,0 +1,104 @@
+import InputView from "../InputView.js";
+import dateIsValid from "../utils/dateIsValid.js";
+import foodIsValid from "../utils/foodIsValid.js";
+import orderMenu from "../domain/orderMenu.js";
+import OutputView from "../OutputView.js";
+import preDiscountAmount from "../domain/preDiscountAmount.js";
+import Discount from "../domain/Discount.js";
+import totalDiscount from "../domain/totalDiscount.js";
+import badge from "../domain/badge.js";
+
+/**
+ * 크리스마스 할인 이벤트 로직 제어하는 컨트롤러 클래스
+ * @class
+ */
+class ChristmasController {
+  /**
+   * 할인 객체
+   * @type {Discount}
+   * @private
+   */
+  #discount = new Discount();
+
+  /**
+   * ChristmasController 인스턴스 생성
+   * @constructor
+   */
+  constructor() {
+    /**
+     * 애플리케이션 시작 메시지 출력
+     */
+    OutputView.start();
+  }
+
+  /**
+   * 사용자로부터 날짜를 입력 받는 메서드
+   * @async
+   * @returns {Promise<string>} 입력받은 날짜
+   */
+  async dateInput() {
+    return this.#handleDateInput();
+  }
+
+  /**
+   * 날짜 입력 처리를 담당하는 메서드
+   * @async
+   * @private
+   * @returns {Promise<string>} 입력받은 날짜
+   * @throws {InputError} 입력이 유효하지 않은 경우 발생하는 예외
+   */
+  async #handleDateInput() {
+    try {
+      const date = await InputView.date();
+      dateIsValid(date);
+      return date;
+    } catch (error) {
+      OutputView.errorPrint(error.message);
+      return this.#handleDateInput();
+    }
+  }
+
+  /**
+   * 사용자로부터 음식을 입력받는 메서드
+   * @async
+   * @returns {Promise<string>} 입력받은 음식
+   */
+  async foodInput() {
+    return this.#handleFoodInput();
+  }
+
+  /**
+   * 음식 입력 처리를 담당하는 메서드
+   * @async
+   * @private
+   * @returns {Promise<string>} 입력받은 음식
+   * @throws {InputError} 입력이 유효하지 않은 경우 발생하는 예외
+   */
+  async #handleFoodInput() {
+    try {
+      const food = await InputView.food();
+      foodIsValid(food);
+      return food;
+    } catch (error) {
+      OutputView.errorPrint(error.message);
+      return this.#handleFoodInput();
+    }
+  }
+
+  /**
+   * 크리스마스 이벤트 로직을 처리하는 메서드
+   * @param {string} date - 날짜
+   * @param {string} food - 음식 주문
+   * @returns {void}
+   */
+  handleChristmasLogic(date, food) {
+    OutputView.preView(date);
+    const menu = orderMenu(food);
+    const totalPrice = preDiscountAmount(menu.menuNames, menu.quantities);
+    const discount = this.#discount.discountPrice(menu, date, totalPrice);
+    const totalDiscountPrice = totalDiscount(totalPrice, discount);
+    badge(totalDiscountPrice);
+  }
+}
+
+export default ChristmasController;

리뷰: 그러네요 ! 그 생각을 못했던 것 같습니다 !! 감사합니다 !
@@ -0,0 +1,41 @@
+package christmas.constant;
+
+public enum Month {
+
+    JANUARY("1월",1,31),
+    FEBRUARY("2월",1,28),
+    LEAP_YEAR_FEBRUARY("2월",1,29),
+    MARCH("3월",1,31),
+    APRIL("4월",1,30),
+    MAY("5월",1,31),
+    JUNE("6월",1,30),
+    JULY("7월",1,31),
+    AUGUST("8월",1,31),
+    SEPTEMBER("9월",1,30),
+    OCTOBER("10월",1,31),
+    NOVEMBER("11월",1,30),
+    DECEMBER("12월",1,31);
+
+    private String month;
+    private int firstDay;
+    private int lastDay;
+
+    Month(String month, int firstDay, int lastDay) {
+
+        this.month = month;
+        this.firstDay = firstDay;
+        this.lastDay = lastDay;
+    }
+
+    public String getMonth() {
+        return month;
+    }
+
+    public int getFirstDay() {
+        return firstDay;
+    }
+
+    public int getLastDay() {
+        return lastDay;
+    }
+}

리뷰: 12월만 생각하지 않고 확장성있게 잘 구현하셨네요!!👍
@@ -0,0 +1,24 @@
+package christmas.controller;
+
+import christmas.service.PlannerService;
+import christmas.service.PlannerServiceImpl;
+
+public class PlannerController {
+
+    private final PlannerService plannerService = new PlannerServiceImpl();
+
+    public void setReservationDate(String date) {
+
+        plannerService.makeReservationDate(date);
+    }
+
+    public void setOrderMenu(String orderMenu) {
+
+        plannerService.reservationMenu(orderMenu);
+    }
+
+    public String printReservationPaper() {
+
+        return plannerService.printReservationPaper();
+    }
+}

리뷰: 이부분이 setter의 기능이 아닌데 겉으로 보이기엔 set..으로 시작하면 setter같아서 혹시 메소드 이름 readReservationDate나 initReservationDate등 다른 이름 어떤가요?!
@@ -0,0 +1,72 @@
+package christmas.domain;
+
+import christmas.constant.BenefitMessage;
+import christmas.constant.Price;
+
+import java.util.Map;
+
+public class Benefit {
+
+    private Gift gift;
+    private Badge badge;
+    private int discountPrice;
+    private static final String LINE_SEPARATOR = System.lineSeparator();
+    public String getGiftInfo(int orderPrice) {
+
+        gift = Gift.giveGift(orderPrice);
+
+        StringBuilder builder = new StringBuilder();
+        builder.append(gift.getGiftInfo()).append(LINE_SEPARATOR);
+
+        return builder.toString();
+    }
+
+    public String getBenefitInfo(String date, Map<String, String> orders) {
+
+        StringBuilder builder = new StringBuilder();
+        builder.append(Discount.discountInfo(orders, date));
+        builder.append(gift.getGiftPriceInfo());
+
+        return builder.toString();
+    }
+
+    public String getBenefitPrice(int orderPrice) {
+
+        if(orderPrice >= Price.MINIMUM_PRICE_APPLY_EVENT) {
+            discountPrice = Discount.getSumDiscountPrice();
+        }
+        int benefitPrice = discountPrice - gift.getGiftPrice();
+
+        StringBuilder builder = new StringBuilder();
+        if(orderPrice < Price.MINIMUM_PRICE_APPLY_EVENT){
+            builder.append(0).append(Price.WON).append(LINE_SEPARATOR);
+            return builder.toString();
+        }
+        builder.append(Price.df.format(benefitPrice))
+                .append(Price.WON).append(LINE_SEPARATOR);
+
+        return builder.toString();
+    }
+
+    public String getExpectedPayment(int orderPrice) {
+
+        int expectedPayment = orderPrice + discountPrice;
+        StringBuilder builder = new StringBuilder();
+        builder.append(Price.df.format(expectedPayment)).append(Price.WON)
+                .append(LINE_SEPARATOR);
+
+        return builder.toString();
+    }
+
+    public String getBadgeInfo() {
+
+        int benefitPrice = gift.getGiftPrice() - discountPrice;
+        badge = Badge.giveBadge(benefitPrice);
+
+        StringBuilder builder = new StringBuilder();
+        builder.append(badge.getType())
+                .append(LINE_SEPARATOR);
+
+        return builder.toString();
+    }
+}

리뷰: 저랑 비슷한 방식으로 구현해서 반갑네요! 비슷하게 고민했던 부분이 느껴져요!
@@ -0,0 +1,47 @@
+package christmas.domain;
+
+import java.util.Arrays;
+
+public enum Menu {
+
+    MUSHROOM_SOUP("양송이수프", 6000),
+    TAPAS("타파스", 5500),
+    CAESAR_SALAD("시저샐러드", 8000),
+    T_BONE_STAKE("티본스테이크", 55000),
+    BBQ_RIBS("바비큐립", 54000),
+    SEAFOOD_PASTA("해산물파스타", 35000),
+    CHRISTMAS_PASTA("크리스마스파스타", 25000),
+    CHOCOLATE_CAKE("초코케이크", 15000),
+    ICE_CREAM("아이스크림", 5000),
+    ZERO_COKE("제로콜라", 3000),
+    RED_WINE("레드와인", 60000),
+    CHAMPAGNE("샴페인", 25000),
+    EMPTY("없음", 0);
+
+    private String menuName;
+    private int price;
+
+    private Menu(String menuName, int price) {
+
+        this.menuName = menuName;
+        this.price = price;
+    }
+
+    public static Menu findMenu(String menuName) {
+
+        for(Menu menu : Menu.values()) {
+            if(menu.getMenuName().equals(menuName)) {
+                return menu;
+            }
+        }
+        return Menu.EMPTY;
+    }
+
+    public String getMenuName() {
+        return menuName;
+    }
+
+    public int getPrice() {
+        return price;
+    }
+}

리뷰: 메뉴에 MenuType을 안넣으신 이유가 있나요?! 궁금합니다.
@@ -0,0 +1,92 @@
+package christmas.domain;
+
+import christmas.constant.*;
+
+public class ReservationInfo {
+
+    private static final String LINE_SEPARATOR = System.lineSeparator();
+    private String date;
+    private Order order;
+    private Benefit benefit;
+
+    public void makeReservation(String date) {
+
+        this.date = date;
+        int parseDate = parseDate(date);
+        validateDateRange(parseDate);
+    }
+
+    public void submitOrder(String orderMenu) {
+
+        order = new Order(orderMenu);
+        benefit = new Benefit();
+    }
+
+    private int parseDate(String date) {
+
+        try {
+
+            return Integer.parseInt(date);
+
+        }catch (Exception e){
+
+            throw new IllegalArgumentException(ErrorMessage.DATE_FORMAT_ERROR_MESSAGE.name());
+        }
+    }
+    private void validateDateRange(int date) {
+
+        if(Month.DECEMBER.getFirstDay() > date ||
+                Month.DECEMBER.getLastDay() < date) {
+
+            throw new IllegalArgumentException(ErrorMessage.DATE_RANGE_ERROR_MESSAGE.name());
+        }
+    }
+
+    public String getReservationDate() {
+
+        return date;
+    }
+
+    public String getOrderMenu() {
+
+        return order.createOrderMenuInfo();
+    }
+
+    public String getOrderPrice() {
+
+        return Price.df.format(order.calculateOrderPrice())+Price.WON+LINE_SEPARATOR;
+    }
+
+    public String getGiftInfo() {
+
+        return benefit.getGiftInfo(order.calculateOrderPrice());
+    }
+
+    public String getBenefitInfo() {
+
+        int orderPrice = order.calculateOrderPrice();
+        boolean isLessThanMinimumPrice = orderPrice < Price.MINIMUM_PRICE_APPLY_EVENT;
+        String benefitInfo = benefit.getBenefitInfo(date, order.getOrders());
+
+        if(isLessThanMinimumPrice||benefitInfo.equals("")) {
+
+            return BenefitMessage.NO_BENEFIT + LINE_SEPARATOR;
+        }
+        return benefitInfo;
+    }
+
+    public String getBenefitPrice() {
+
+        return benefit.getBenefitPrice(order.calculateOrderPrice());
+    }
+
+    public String getExpectedPayment() {
+
+        return benefit.getExpectedPayment(order.calculateOrderPrice());
+    }
+
+    public String getEventBadgeInfo() {
+
+        return benefit.getBadgeInfo();
+    }
+}

리뷰: 이부분 코딩 컨벤션이 지켜지지 않은것 같아요! || 앞뒤로 공백이 없네요.