ewhk9887/korean_code_reviews_from_github huggingface dataset:
@@ -0,0 +1,84 @@
+import { Console } from '@woowacourse/mission-utils';
+import { PROMOTION_CATEGORIES } from '../constant/index.js';
+
+const MESSAGE = {
+    GREETINGS: '안녕하세요! 우테코 식당 12월 이벤트 플래너입니다.',
+    INTRO_PREVIEW: '12월 26일에 우테코 식당에서 받을 이벤트 혜택 미리 보기!\n',
+    ORDER_MENU_TITLE: '<주문 메뉴>',
+    TOTAL_PRICE_WITHOUT_DISCOUNT_TITLE: '<할인 전 총주문 금액>',
+    BENEFIT_DETAILS_TITLE: '<혜택 내역>',
+    TOTAL_PRICE_WITH_DISCOUNT_TITLE: '<할인 후 예상 결제 금액>',
+    GIFT_TITLE: '<증정 메뉴>',
+    BENEFIT_TOTAL_PRICE_TITLE: '<총혜택 금액>',
+    BADGE_TITLE: '<12월 이벤트 배지>',
+    NONE: '없음',
+    MENU: (name, count) => `${name} ${count}개`,
+    PRICE: (price) => `${price.toLocaleString()}원`,
+    GIFT: (name, count) => `${name} ${count}개`,
+    DISCOUNT: (name, price) => `${name} 할인: -${price.toLocaleString()}원`,
+    TOTAL_BENEFIT_PRICE: (price) => (price > 0 ? `-${price.toLocaleString()}원` : '0원'),
+};
+
+const OutputView = {
+    printGreetings() {
+        Console.print(MESSAGE.GREETINGS);
+    },
+    printPreviewMessage() {
+        Console.print(MESSAGE.INTRO_PREVIEW);
+        Console.print('');
+    },
+    printOrderMenus(orders) {
+        Console.print(MESSAGE.ORDER_MENU_TITLE);
+
+        orders.forEach((order) => {
+            Console.print(MESSAGE.MENU(order.name, order.count));
+        });
+
+        Console.print('');
+    },
+    printTotalPriceWithoutDiscount(totalPrice) {
+        Console.print(MESSAGE.TOTAL_PRICE_WITHOUT_DISCOUNT_TITLE);
+        Console.print(MESSAGE.PRICE(totalPrice));
+        Console.print('');
+    },
+    printBenefitDetails(promotions) {
+        Console.print(MESSAGE.BENEFIT_DETAILS_TITLE);
+
+        const printData = [];
+
+        promotions.forEach((promotion) => {
+            const { NAME, promotionBenefitPrice } = promotion;
+            const isApplied = promotionBenefitPrice > 0;
+            if (isApplied) printData.push(MESSAGE.DISCOUNT(NAME, promotionBenefitPrice));
+        });
+        if (printData.length === 0) printData.push(MESSAGE.NONE);
+
+        Console.print(printData.join('\n'));
+        Console.print('');
+    },
+    printTotalPriceWithDiscount(totalPriceWithDiscount) {
+        Console.print(MESSAGE.TOTAL_PRICE_WITH_DISCOUNT_TITLE);
+        Console.print(MESSAGE.PRICE(totalPriceWithDiscount));
+        Console.print('');
+    },
+    printGiveWayMenu(promotions) {
+        const giftMenu = promotions.find((promotion) => promotion.EVENT === PROMOTION_CATEGORIES.GIFT);
+        const { PRODUCT, promotionBenefitPrice } = giftMenu;
+        const isApplied = promotionBenefitPrice > 0;
+
+        Console.print(MESSAGE.GIFT_TITLE);
+        Console.print(isApplied ? MESSAGE.GIFT(PRODUCT.NAME, 1) : MESSAGE.NONE);
+        Console.print('');
+    },
+    printTotalBenefitPrice(totalBenefitPrice) {
+        Console.print(MESSAGE.BENEFIT_TOTAL_PRICE_TITLE);
+        Console.print(MESSAGE.TOTAL_BENEFIT_PRICE(totalBenefitPrice));
+        Console.print('');
+    },
+    printBadge(badge) {
+        Console.print(MESSAGE.BADGE_TITLE);
+        Console.print(badge);
+    },
+};
+
+export default OutputView;

리뷰: airbnb 규칙에서 key값은 소문자로 하는것을 권장하고 있어요.
@@ -0,0 +1,55 @@
+import { BADGE, PROMOTION_CATEGORIES, PROMOTION_MINIMUM_PRICE } from '../constant/index.js';
+
+class Planner {
+    #order;
+    #calendar;
+
+    constructor(order, calendar) {
+        this.#order = order;
+        this.#calendar = calendar;
+    }
+
+    getPromotionsByOrderDate() {
+        const promotions = this.#calendar.getPromotionsByDate(this.#order.getOrderDate());
+        const activePromotions = [];
+        promotions.forEach((promotion) => {
+            const { CONFIG } = promotion;
+            activePromotions.push({
+                ...CONFIG,
+                promotionBenefitPrice: this.#applyPromotions(promotion),
+            });
+        });
+
+        return activePromotions;
+    }
+    getTotalBenefitPrice() {
+        const promotions = this.getPromotionsByOrderDate();
+
+        return promotions.reduce((acc, cur) => acc + cur.promotionBenefitPrice, 0);
+    }
+    getTotalPriceWithDiscount() {
+        const promotions = this.getPromotionsByOrderDate();
+        const totalPrice = this.#order.getTotalPrice();
+        const getTotalBenefitPrice = this.getTotalBenefitPrice();
+        const giftPromotion = promotions.find((promotion) => promotion.EVENT === PROMOTION_CATEGORIES.GIFT);
+
+        return totalPrice - (getTotalBenefitPrice - giftPromotion.promotionBenefitPrice);
+    }
+    getBadge() {
+        const { SANTA, TREE, STAR, NONE } = BADGE;
+        const totalBenefitPrice = this.getTotalBenefitPrice();
+        if (totalBenefitPrice >= SANTA.PRICE) return SANTA.NAME;
+        if (totalBenefitPrice >= TREE.PRICE) return TREE.NAME;
+        if (totalBenefitPrice >= STAR.PRICE) return STAR.NAME;
+
+        return NONE.NAME;
+    }
+    #applyPromotions(promotion) {
+        const totalPriceWithoutDiscount = this.#order.getTotalPrice();
+        if (totalPriceWithoutDiscount < PROMOTION_MINIMUM_PRICE) return 0;
+
+        return promotion.getPromotionPrice(this.#order);
+    }
+}
+
+export default Planner;

리뷰: 저는 왜 이렇게 생각하지 못했던 걸까요...ㅎㅎㅎ
상수화 해놓고 이상한 짓을 했네요.
@@ -0,0 +1,105 @@
+package controller;
+
+import model.user.ChristmasUser;
+import model.calendar.December;
+import model.event.ChristmasEvent;
+import view.InputView;
+import view.OutputView;
+
+import java.util.Map;
+
+public class ChristmasController {
+    private static ChristmasUser user;
+
+    public ChristmasController() {
+        user = new ChristmasUser();
+    }
+
+    public void startEvent() {
+        December.init();
+        requestGreeting();
+        requestReadDate();
+        requestReadMenu();
+        requestPrintGuide();
+        printEvent();
+    }
+
+    public void printEvent(){
+        requestSection();
+        requestPrintMenu();
+        requestSection();
+        requestPrintAmountBefore();
+        requestSection();
+        requestPrintGiftMenu();
+        requestSection();
+        requestPrintBenefitsDetails();
+        requestSection();
+        requestPrintTotalBenefit();
+        requestSection();
+        requestPrintEstimatedAmountAfter();
+        requestSection();
+        requestPrintBadge();
+    }
+
+    public static void requestSection() {
+        OutputView.printSection();
+    }
+
+    public static void requestGreeting() {
+        OutputView.printGreeting();
+    }
+
+    public void requestReadDate() {
+        user.setDate(InputView.readDate());
+    }
+
+    public void requestReadMenu() {
+        user.setOrder(InputView.readMenu());
+    }
+
+    public static void requestPrintGuide() {
+        OutputView.printBenefitsGuide(user.getMonth(), user.getDay());
+    }
+
+    public void requestPrintMenu() {
+        OutputView.printMenu(user.getOrder());
+    }
+
+    public void requestPrintAmountBefore() {
+        user.sumAmountBefore();
+        OutputView.printTotalOrderAmountBefore(user.getTotalPrice());
+    }
+
+    public void requestPrintGiftMenu() {
+        if (ChristmasEvent.getGiveChampagnePrice() <= user.getTotalPrice()) {
+            OutputView.printGiftMenu("샴페인 1개");
+            return;
+        }
+        OutputView.printGiftMenu("없음");
+    }
+
+    public void requestPrintBenefitsDetails() {
+        Map<String, Integer> benefit = ChristmasEvent.ResultChristmasDDayDiscount(user.getDay(),
+                user.getTotalPrice(),
+                user.getOrder());
+        OutputView.printBenefitsDetails(benefit, user.getTotalPrice());
+        if (user.getTotalPrice()>=10000)
+            user.setTotalDiscount(benefit.values().stream().mapToInt(Integer::intValue).sum());
+    }
+
+    public void requestPrintTotalBenefit() {
+        OutputView.printTotalBenefit(user.getTotalDiscount());
+    }
+    public void requestPrintEstimatedAmountAfter() {
+        if (ChristmasEvent.getGiveChampagnePrice() <= user.getTotalPrice()) {
+            OutputView.printEstimatedAmountAfter(user.getTotalPrice() - user.getTotalDiscount() + 25000);
+            return;
+        }
+        OutputView.printEstimatedAmountAfter(user.getTotalPrice() - user.getTotalDiscount());
+    }
+
+    public void requestPrintBadge() {
+        OutputView.printEventBadge(user.getTotalDiscount());
+    }
+
+}

리뷰: 10_000을 상수로 포장하면 더욱 좋은 코드가 될 것 같아요!
@@ -0,0 +1,16 @@
+package exception;
+
+public class InputValid {
+    private InputValid() {
+
+    }
+
+    public static int stringToInteger(String input, String errorType) {
+        for (int i = 0; i < input.length(); i++) {
+            if (!Character.isDigit(input.charAt(i))) {
+                throw new IllegalArgumentException("[ERROR] 유효하지 않은 " + errorType + "입니다. 다시 입력해 주세요.");
+            }
+        }
+        return Integer.parseInt(input);
+    }
+}

리뷰: `Integer.parseInt()` 가 파싱 할 수 없는 경우엔 `NumberFormatException` 을 던지기 때문에
~~~java
try(
    return Integer.parseInt(input)
) catch (NumberFormatException e) {
    throw new IllegalArgumentException();
}
~~~
처럼 더욱 간결하게 작성할 수 있어요!!
@@ -0,0 +1,16 @@
+package exception;
+
+public class InputValid {
+    private InputValid() {
+
+    }
+
+    public static int stringToInteger(String input, String errorType) {
+        for (int i = 0; i < input.length(); i++) {
+            if (!Character.isDigit(input.charAt(i))) {
+                throw new IllegalArgumentException("[ERROR] 유효하지 않은 " + errorType + "입니다. 다시 입력해 주세요.");
+            }
+        }
+        return Integer.parseInt(input);
+    }
+}

리뷰: 혹시 검증 로직을 분리하고 싶은 이유로 저렇게 작성 한거면
~~~java
for (int i = 0; i < input.length(); i++) {
    if (!Character.isDigit(input.charAt(i))) {
        throw new IllegalArgumentException("[ERROR] 유효하지 않은 " + errorType + "입니다. 다시 입력해 주세요.");
    }
}
~~~
를 `validateCanParseInt()` 같은 메소드로 분리해 주는게 더 보기 좋을 것 같아요!
@@ -0,0 +1,65 @@
+package exception;
+
+import model.menu.*;
+
+import java.util.Map;
+
+public class OrderMenu {
+    private OrderMenu() {
+
+    }
+
+    public static String[] menuFormat(String input) {
+        String[] itemInfo = input.split("-");
+
+        if (itemInfo.length != 2) {
+            throw new IllegalArgumentException("[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요.");
+        }
+
+        return itemInfo;
+    }
+
+    public static int menuQuantityValid(String input) {
+        int num = InputValid.stringToInteger(input, "주문");
+        if (num < 1) {
+            throw new IllegalArgumentException("[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요.");
+        }
+
+        return num;
+    }
+
+    public static void menuValid(String menuName) {
+        if (!ChristmasMenu.isValidAppetizer(menuName) &&
+                !ChristmasMenu.isValidDessert(menuName) &&
+                !ChristmasMenu.isValidDrink(menuName) &&
+                !ChristmasMenu.isValidMain(menuName)) {
+            throw new IllegalArgumentException("[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요.");
+        }
+    }
+
+    public static void menuDuplication(Map<String, Integer> order, String menuName) {
+        if (order.containsKey(menuName)) {
+            throw new IllegalArgumentException("[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요.");
+        }
+    }
+
+    public static void maxNumMenu(Map<String, Integer> order) {
+        if (order.values().stream().mapToInt(Integer::intValue).sum() > 20) {
+            throw new IllegalArgumentException("[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요.");
+        }
+    }
+
+    public static void checkDrinkCount(Map<String, Integer> order) {
+        int drinkCount = 0;
+
+        for (Drink menu : Drink.values()) {
+            if (order.containsKey(menu.getName())) {
+                drinkCount++;
+            }
+        }
+
+        if (drinkCount == order.size()) {
+            throw new IllegalArgumentException("[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요.");
+        }
+    }
+}

리뷰: validateDuplicate() 같은 이름이 더 어울릴 것 같아요!
@@ -0,0 +1,65 @@
+package exception;
+
+import model.menu.*;
+
+import java.util.Map;
+
+public class OrderMenu {
+    private OrderMenu() {
+
+    }
+
+    public static String[] menuFormat(String input) {
+        String[] itemInfo = input.split("-");
+
+        if (itemInfo.length != 2) {
+            throw new IllegalArgumentException("[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요.");
+        }
+
+        return itemInfo;
+    }
+
+    public static int menuQuantityValid(String input) {
+        int num = InputValid.stringToInteger(input, "주문");
+        if (num < 1) {
+            throw new IllegalArgumentException("[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요.");
+        }
+
+        return num;
+    }
+
+    public static void menuValid(String menuName) {
+        if (!ChristmasMenu.isValidAppetizer(menuName) &&
+                !ChristmasMenu.isValidDessert(menuName) &&
+                !ChristmasMenu.isValidDrink(menuName) &&
+                !ChristmasMenu.isValidMain(menuName)) {
+            throw new IllegalArgumentException("[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요.");
+        }
+    }
+
+    public static void menuDuplication(Map<String, Integer> order, String menuName) {
+        if (order.containsKey(menuName)) {
+            throw new IllegalArgumentException("[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요.");
+        }
+    }
+
+    public static void maxNumMenu(Map<String, Integer> order) {
+        if (order.values().stream().mapToInt(Integer::intValue).sum() > 20) {
+            throw new IllegalArgumentException("[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요.");
+        }
+    }
+
+    public static void checkDrinkCount(Map<String, Integer> order) {
+        int drinkCount = 0;
+
+        for (Drink menu : Drink.values()) {
+            if (order.containsKey(menu.getName())) {
+                drinkCount++;
+            }
+        }
+
+        if (drinkCount == order.size()) {
+            throw new IllegalArgumentException("[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요.");
+        }
+    }
+}

리뷰: ~~~java
boolean containsDrink = order.keySet().stream()
    .anyMatch(menu -> ChristmasMenu.isValidDrink(menu))
~~~
처럼 Stream을 활용할 수 있으면 더 좋을 것 같아요!
@@ -0,0 +1,19 @@
+package exception;
+
+public class VisitDate {
+
+    private static Integer DateStart = 1;
+    private static Integer DateEnd = 31;
+
+    private VisitDate() {
+
+    }
+    /*날짜 범위를 확인 커밋메시지 실수*/
+    public static int checkDate(String input) {
+        int date = InputValid.stringToInteger(input, "날짜");
+        if (DateStart > date || DateEnd < date) {
+            throw new IllegalArgumentException("[ERROR] 유효하지 않은 날짜입니다. 다시 입력해 주세요.");
+        }
+        return date;
+    }
+}

리뷰: 이 방법 보다는 날짜 정보를 담고 있는 Date라는 클래스를 새로 만들어서 객채 생성과 동시에 검증을 하는건 어떨까요 ??
~~~java
class Date {
    final int value;

    public Date(int value) {
        validateDate();
        this.value = value;   
}
~~~
같이 활용하면 더욱 객체지향적인 코드가 될 것 같아요!
@@ -0,0 +1,84 @@
+package model.calendar;
+
+import model.event.ChristmasEvent;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+public class December {
+    static private Map<Integer, Map<String, Object>> date = new HashMap<>();
+    static private ArrayList<Integer> weekend = new ArrayList<Integer>() {{
+        add(1);
+        add(2);
+        add(8);
+        add(9);
+        add(15);
+        add(16);
+        add(22);
+        add(23);
+        add(29);
+        add(30);
+    }};
+
+    static private ArrayList<Integer> starDay = new ArrayList<Integer>() {{
+        add(3);
+        add(10);
+        add(17);
+        add(24);
+        add(25);
+        add(31);
+    }};
+
+    public static Map<String, Object> getDate(int day) {
+        return date.get(day);
+    }
+
+    private December() {
+    }
+
+    public static void init() {
+        initializeChristmasDiscountDates();
+        initializeDefaultDiscountDates();
+    }
+
+    private static void initializeChristmasDiscountDates() {
+        int price = ChristmasEvent.getChristmasDDayDiscountInitPrice();
+        int stepPrice = ChristmasEvent.getChristmasDDayDiscountStepPrice();
+
+        for (int i = 1; i < 32; i++) {
+            Map<String, Object> tmpData = createDiscountDate(price, i);
+            date.put(i, tmpData);
+            price += stepPrice;
+        }
+    }
+
+    private static void initializeDefaultDiscountDates() {
+        for (int i = 26; i < 32; i++) {
+            Map<String, Object> tmpData = createDiscountDate(0, i);
+            date.put(i, tmpData);
+        }
+    }
+
+    private static Map<String, Object> createDiscountDate(int price, int day) {
+        Map<String, Object> tmpData = new HashMap<>();
+        tmpData.put("할인금액", price);
+        tmpData.put("영업일", getDayType(day));
+        tmpData.put("별유무", isStar(day));
+        return tmpData;
+    }
+
+    public static String getDayType(Integer day) {
+        if (weekend.contains(day)) {
+            return "주말";
+        }
+        return "평일";
+    }
+
+    public static boolean isStar(Integer day) {
+        if (starDay.contains(day)) {
+            return true;
+        }
+        return false;
+    }
+}

리뷰: `List.of()`나 `Arrays.asList()` 를 활용하면 
~~~java
List.of(1,2,8,9...);
Arrays.asList(1,2,8,9...);
~~~
처럼 간결하게 쓸 수 있어요!
@@ -0,0 +1,84 @@
+package model.calendar;
+
+import model.event.ChristmasEvent;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+public class December {
+    static private Map<Integer, Map<String, Object>> date = new HashMap<>();
+    static private ArrayList<Integer> weekend = new ArrayList<Integer>() {{
+        add(1);
+        add(2);
+        add(8);
+        add(9);
+        add(15);
+        add(16);
+        add(22);
+        add(23);
+        add(29);
+        add(30);
+    }};
+
+    static private ArrayList<Integer> starDay = new ArrayList<Integer>() {{
+        add(3);
+        add(10);
+        add(17);
+        add(24);
+        add(25);
+        add(31);
+    }};
+
+    public static Map<String, Object> getDate(int day) {
+        return date.get(day);
+    }
+
+    private December() {
+    }
+
+    public static void init() {
+        initializeChristmasDiscountDates();
+        initializeDefaultDiscountDates();
+    }
+
+    private static void initializeChristmasDiscountDates() {
+        int price = ChristmasEvent.getChristmasDDayDiscountInitPrice();
+        int stepPrice = ChristmasEvent.getChristmasDDayDiscountStepPrice();
+
+        for (int i = 1; i < 32; i++) {
+            Map<String, Object> tmpData = createDiscountDate(price, i);
+            date.put(i, tmpData);
+            price += stepPrice;
+        }
+    }
+
+    private static void initializeDefaultDiscountDates() {
+        for (int i = 26; i < 32; i++) {
+            Map<String, Object> tmpData = createDiscountDate(0, i);
+            date.put(i, tmpData);
+        }
+    }
+
+    private static Map<String, Object> createDiscountDate(int price, int day) {
+        Map<String, Object> tmpData = new HashMap<>();
+        tmpData.put("할인금액", price);
+        tmpData.put("영업일", getDayType(day));
+        tmpData.put("별유무", isStar(day));
+        return tmpData;
+    }
+
+    public static String getDayType(Integer day) {
+        if (weekend.contains(day)) {
+            return "주말";
+        }
+        return "평일";
+    }
+
+    public static boolean isStar(Integer day) {
+        if (starDay.contains(day)) {
+            return true;
+        }
+        return false;
+    }
+}

리뷰: Enum을 적극 활용해 보시는걸 추천드려요!
@@ -0,0 +1,84 @@
+package model.calendar;
+
+import model.event.ChristmasEvent;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+public class December {
+    static private Map<Integer, Map<String, Object>> date = new HashMap<>();
+    static private ArrayList<Integer> weekend = new ArrayList<Integer>() {{
+        add(1);
+        add(2);
+        add(8);
+        add(9);
+        add(15);
+        add(16);
+        add(22);
+        add(23);
+        add(29);
+        add(30);
+    }};
+
+    static private ArrayList<Integer> starDay = new ArrayList<Integer>() {{
+        add(3);
+        add(10);
+        add(17);
+        add(24);
+        add(25);
+        add(31);
+    }};
+
+    public static Map<String, Object> getDate(int day) {
+        return date.get(day);
+    }
+
+    private December() {
+    }
+
+    public static void init() {
+        initializeChristmasDiscountDates();
+        initializeDefaultDiscountDates();
+    }
+
+    private static void initializeChristmasDiscountDates() {
+        int price = ChristmasEvent.getChristmasDDayDiscountInitPrice();
+        int stepPrice = ChristmasEvent.getChristmasDDayDiscountStepPrice();
+
+        for (int i = 1; i < 32; i++) {
+            Map<String, Object> tmpData = createDiscountDate(price, i);
+            date.put(i, tmpData);
+            price += stepPrice;
+        }
+    }
+
+    private static void initializeDefaultDiscountDates() {
+        for (int i = 26; i < 32; i++) {
+            Map<String, Object> tmpData = createDiscountDate(0, i);
+            date.put(i, tmpData);
+        }
+    }
+
+    private static Map<String, Object> createDiscountDate(int price, int day) {
+        Map<String, Object> tmpData = new HashMap<>();
+        tmpData.put("할인금액", price);
+        tmpData.put("영업일", getDayType(day));
+        tmpData.put("별유무", isStar(day));
+        return tmpData;
+    }
+
+    public static String getDayType(Integer day) {
+        if (weekend.contains(day)) {
+            return "주말";
+        }
+        return "평일";
+    }
+
+    public static boolean isStar(Integer day) {
+        if (starDay.contains(day)) {
+            return true;
+        }
+        return false;
+    }
+}

리뷰: 여기도 문자열을 그대로 반환하기보단
`WEEKDAY` `WEEKEND`를 가진 `Enum`을 만들어서 그 객체를 반환하는 게 더 좋아보여요!
@@ -0,0 +1,31 @@
+package model.event;
+
+public enum Badge {
+    STAR(5000),
+    TREE(10000),
+    SANTA(20000);
+
+    private int price = 0;
+
+    Badge(int price) {
+        this.price = price;
+    }
+
+    public int getPrice() {
+        return price;
+    }
+
+    public static String getBadgeType(int price) {
+        if (SANTA.getPrice() <= price) {
+            return "산타";
+        }
+        if (TREE.getPrice() <= price) {
+            return "트리";
+        }
+        if (STAR.getPrice() <= price) {
+            return "별";
+        }
+
+        return "없음";
+    }
+}

리뷰: 이러면 Enum을 사용한 이유가 없어보여요 ,, 
String 대신 Enum을 반환하는 게 더 좋아보입니다 !
@@ -0,0 +1,24 @@
+package model.menu;
+
+public enum Main {
+    T_BONE_STEAK("티본스테이크", 55000),
+    BBQ_RIBS("바비큐립", 54000),
+    SEAFOOD_PASTA("해산물파스타", 35000),
+    CHRISTMAS_PASTA("크리스마스파스타", 25000);
+
+    private String name = "";
+    private int price = 0;
+
+    Main(String name, int price) {
+        this.name = name;
+        this.price = price;
+    }
+
+    public int getPrice() {
+        return price;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

리뷰: Menu라는 Enum 하나를 만들고 그 안에 Category를 디저트, 애피타이저 등등으로 나눠두는 것은 어떨까요?
@@ -0,0 +1,16 @@
+package core.mvc.tobe;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class DefaultMethodArgumentResolver implements HandlerMethodArgumentResolver {
+
+    @Override
+    public Object resolveArgument(MethodParameter methodParameter, HttpServletRequest request) {
+        return request.getParameter(methodParameter.getParameterName());
+    }
+
+    @Override
+    public boolean supportsParameter(MethodParameter methodParameter) {
+        return true;
+    }
+}

리뷰: 해당 클래스에서 wrapper클래스도 지원해주면 좋겠네요.
ClassUtils.isPrimitiveOrWrapper 등을 참고해보세요~
@@ -0,0 +1,16 @@
+package core.mvc.tobe;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class DefaultMethodArgumentResolver implements HandlerMethodArgumentResolver {
+
+    @Override
+    public Object resolveArgument(MethodParameter methodParameter, HttpServletRequest request) {
+        return request.getParameter(methodParameter.getParameterName());
+    }
+
+    @Override
+    public boolean supportsParameter(MethodParameter methodParameter) {
+        return true;
+    }
+}

리뷰: true보다도 PrimitiveOrWrapper인지 확인할 수 있으면 좋겠네요.