ewhk9887/korean_code_reviews_from_github huggingface dataset:
@@ -0,0 +1,76 @@
+package christmas.domain.logic;
+
+import christmas.domain.type.Badge;
+import christmas.domain.type.Menu;
+import org.junit.jupiter.api.Test;
+
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class EventCalculatorTest {
+
+    @Test
+    void isEligibleForEvent() {
+        assertTrue(EventCalculator.isEligibleForEvent(15000));
+        assertFalse(EventCalculator.isEligibleForEvent(5000));
+    }
+
+    @Test
+    void calculateWeekdayDiscount_주중_디저트() {
+        Map<Menu, Integer> order = Map.of(Menu.CHOCOLATE_CAKE, 1);
+        int discount = EventCalculator.calculateWeekdayDiscount(3, order);
+        assertEquals(2023, discount);
+    }
+
+    @Test
+    void calculateWeekdayDiscount_주중_디저트없음() {
+        Map<Menu, Integer> order = Map.of(Menu.CAESAR_SALAD, 1, Menu.TAPAS, 1);
+        int discount = EventCalculator.calculateWeekdayDiscount(3, order);
+        assertEquals(0, discount);
+    }
+
+    @Test
+    void calculateWeekendDiscount_주말_메인() {
+        Map<Menu, Integer> order = Map.of(Menu.T_BONE_STEAK, 2, Menu.TAPAS, 1);
+        int discount = EventCalculator.calculateWeekendDiscount(4, order);
+        assertEquals(2023 * 2, discount);
+    }
+
+    @Test
+    void calculateWeekendDiscount_주말_메인없음() {
+        Map<Menu, Integer> order = Map.of(Menu.ICE_CREAM, 1);
+        int discount = EventCalculator.calculateWeekendDiscount(4, order);
+        assertEquals(0, discount);
+    }
+
+    @Test
+    void calculateSpecialDiscount_별데이() {
+        int discount = EventCalculator.calculateSpecialDiscount(25);
+        assertEquals(1000, discount);
+    }
+
+    @Test
+    void calculateSpecialDiscount_별데이_아님() {
+        int discount = EventCalculator.calculateSpecialDiscount(26);
+        assertEquals(0, discount);
+    }
+
+    @Test
+    void calculateGiveawayEvent() {
+        Map<Menu, Integer> giveaway = EventCalculator.calculateGiveawayEvent(120000);
+        assertNotNull(giveaway);
+        assertTrue(giveaway.containsKey(Menu.CHAMPAGNE));
+        assertEquals(1, giveaway.get(Menu.CHAMPAGNE));
+    }
+
+    @Test
+    void calculateBadge() {
+        assertEquals(Badge.SANTA, EventCalculator.calculateBadge(20000));
+        assertEquals(Badge.SANTA, EventCalculator.calculateBadge(30000));
+        assertEquals(Badge.TREE, EventCalculator.calculateBadge(15000));
+        assertEquals(Badge.TREE, EventCalculator.calculateBadge(19999));
+        assertEquals(Badge.STAR, EventCalculator.calculateBadge(7000));
+        assertEquals(Badge.NONE, EventCalculator.calculateBadge(4000));
+    }
+}

리뷰: 클린코드에 나오는 내용인데 한 테스트 메서드 안에 여러 assert문을 사용하는 것은 좋지 않다고 해요! 해당 메서드에서@ParameterizedTest 와 @MethodSource를 사용해보면 어떨까요?
@@ -0,0 +1,20 @@
+package christmas.domain.logic;
+
+import christmas.domain.model.DecemberEvent;
+
+public class ChristmasEventCalculator {
+    public static int calculateChristmasDiscount(int date) {
+        int startDay = DecemberEvent.getEventStartDate();
+        int discountPricePerDay = DecemberEvent.getDayDiscountPrice();
+        int discountPriceOfFirstDay = DecemberEvent.getStartDiscountPrice();
+
+        if (date > DecemberEvent.CHRISTMAS_DAY) {
+            return 0;
+        }
+
+        int daysUntilDate = date - startDay;
+        int totalDiscount = discountPriceOfFirstDay + (daysUntilDate * discountPricePerDay);
+
+        return totalDiscount;
+    }
+}

리뷰: 유틸리티 클래스로 보이는데 생성자를 private로 만드는게 좋아보여요! 👍
@@ -0,0 +1,71 @@
+package christmas.domain.model;
+
+import christmas.domain.type.Menu;
+
+import java.util.*;
+
+public class DecemberEvent {
+    public static final int CHRISTMAS_DAY = 25;
+    private static final int EVENT_START_DATE = 1;
+    private static final int DAY_DISCOUNT_PRICE = 100;
+    private static final int START_DISCOUNT_PRICE = 1_000;
+    private static final int MIN_PRICE = 10_000;
+    private static final int WEEKDAY_DISCOUNT_PRICE = 2_023;
+    private static final int WEEKEND_DISCOUNT_PRICE = 2_023;
+    private static final Menu.Category WEEKDAY_DISCOUNT_CATEGORY = Menu.Category.DESSERT;
+    private static final Menu.Category WEEKEND_DISCOUNT_CATEGORY = Menu.Category.MAIN;
+    private static final List<Integer> WEEKEND_DATES = Arrays.asList(1, 2, 8, 9, 15, 16, 22, 23, 29, 30);
+    private static final List<Integer> STAR_DATES = Arrays.asList(3, 10, 17, 24, 25, 31);
+    private static final int SPECIAL_DISCOUNT_PRICE = 1_000;
+    private static final int GIVEAWAY_CONDITION_PRICE = 120_000;
+    private static final Map<Menu, Integer> GIVEAWAY_BENEFITS = Map.of(Menu.CHAMPAGNE, 1);
+
+
+    public static boolean isOverThanMinPrice(int totalPrice) {
+        return totalPrice >= MIN_PRICE;
+    }
+
+    public static boolean isStarDate(int date) {
+        return STAR_DATES.contains(date);
+    }
+
+    public static boolean isWeekend(int date) {
+        return WEEKEND_DATES.contains(date);
+    }
+
+    public static boolean isEligibleForGiveaway(int totalPrice) {
+        return totalPrice >= GIVEAWAY_CONDITION_PRICE;
+    }
+
+    public static int getSpecialDiscountPrice() {
+        return SPECIAL_DISCOUNT_PRICE;
+    }
+
+    public static int getWeekdayDiscountPrice() { return WEEKDAY_DISCOUNT_PRICE; }
+
+    public static int getWeekendDiscountPrice() { return WEEKEND_DISCOUNT_PRICE; }
+
+    public static Menu.Category getWeekdayDiscountCategory() {
+        return WEEKDAY_DISCOUNT_CATEGORY;
+    }
+
+    public static Menu.Category getWeekendDiscountCategory() {
+        return WEEKEND_DISCOUNT_CATEGORY;
+    }
+
+    public static Map<Menu, Integer> getGiveawayBenefits() {
+        return GIVEAWAY_BENEFITS;
+    }
+
+    public static int getDayDiscountPrice() {
+        return DAY_DISCOUNT_PRICE;
+    }
+
+    public static int getStartDiscountPrice() {
+        return START_DISCOUNT_PRICE;
+    }
+
+    public static int getEventStartDate() {
+        return EVENT_START_DATE;
+    }
+}

리뷰: 상수를 관리하는 클래스를 다른 패키지로 구분하는 건 어떨까요?
@@ -0,0 +1,61 @@
+package christmas.view;
+
+import camp.nextstep.edu.missionutils.Console;
+import christmas.domain.type.Menu;
+import christmas.util.DateValidator;
+import christmas.util.OrderValidator;
+import christmas.util.ValidationException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class InputView {
+    private static final String ASK_DATE_MESSAGE = "12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)";
+    private static final String ASK_ORDER_MESSAGE = "주문하실 메뉴를 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)";
+
+    public int readDate() {
+        while (true) {
+            try {
+                System.out.println(ASK_DATE_MESSAGE);
+                String input = Console.readLine();
+                DateValidator.validateInput(input);
+                int date = Integer.parseInt(input);
+                return date;
+            } catch (ValidationException e) {
+                System.out.println(e.getMessage());
+            }
+        }
+    }
+
+    public Map<Menu, Integer> readOrder() {
+        while (true) {
+            try {
+                System.out.println(ASK_ORDER_MESSAGE);
+                String input = Console.readLine();
+                OrderValidator.validateInput(input);
+                Map<Menu, Integer> order = parseOrder(input);
+                OrderValidator.validateOrder(order);
+
+                return order;
+            } catch (ValidationException e) {
+                System.out.println(e.getMessage());
+            }
+        }
+    }
+
+    private Map<Menu, Integer> parseOrder(String input) {
+        Map<Menu, Integer> order = new HashMap<>();
+
+        String[] items = input.split(",");
+        for (String item : items) {
+            String[] parts = item.trim()
+                    .split("-");
+            String menuName = parts[0].trim();
+            int amount = Integer.parseInt(parts[1].trim());
+
+            Menu menu = Menu.findByName(menuName);
+            order.put(menu, amount);
+        }
+        return order;
+    }
+}

리뷰: 반복되지만 미세하게 다른 코드네요! 어떻게 반복을 줄일지 고민해보시면 좋을 것 같아요! 👍
@@ -0,0 +1,28 @@
+package christmas.util;
+
+public class DateValidator {
+    private static final String INVALID_DATE_MESSAGE = "유효하지 않은 날짜입니다. 다시 입력해 주세요.";
+
+    public static void validateInput(String input) {
+        validateNumeric(input);
+        int date = Integer.parseInt(input);
+        validateDate(date);
+    }
+
+    private static void validateNumeric(String input) {
+        if (input == null) {
+            throw new ValidationException(INVALID_DATE_MESSAGE);
+        }
+        try {
+            Integer.parseInt(input);
+        } catch (NumberFormatException e) {
+            throw new ValidationException(INVALID_DATE_MESSAGE);
+        }
+    }
+
+    private static void validateDate(int date) {
+        if (date < 1 || date > 31) {
+            throw new ValidationException(INVALID_DATE_MESSAGE);
+        }
+    }
+}

리뷰: 아 맞네요 제가 추구하는 방향이 `12월 이벤트` 클래스만 매달 해당하는 달에 갈아 끼우는 거였거든요 `몇월.LAST_DATE` 이런식으로 바꿔야 겠습니다.
@@ -0,0 +1,76 @@
+package christmas.domain.logic;
+
+import christmas.domain.type.Badge;
+import christmas.domain.type.Menu;
+import org.junit.jupiter.api.Test;
+
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class EventCalculatorTest {
+
+    @Test
+    void isEligibleForEvent() {
+        assertTrue(EventCalculator.isEligibleForEvent(15000));
+        assertFalse(EventCalculator.isEligibleForEvent(5000));
+    }
+
+    @Test
+    void calculateWeekdayDiscount_주중_디저트() {
+        Map<Menu, Integer> order = Map.of(Menu.CHOCOLATE_CAKE, 1);
+        int discount = EventCalculator.calculateWeekdayDiscount(3, order);
+        assertEquals(2023, discount);
+    }
+
+    @Test
+    void calculateWeekdayDiscount_주중_디저트없음() {
+        Map<Menu, Integer> order = Map.of(Menu.CAESAR_SALAD, 1, Menu.TAPAS, 1);
+        int discount = EventCalculator.calculateWeekdayDiscount(3, order);
+        assertEquals(0, discount);
+    }
+
+    @Test
+    void calculateWeekendDiscount_주말_메인() {
+        Map<Menu, Integer> order = Map.of(Menu.T_BONE_STEAK, 2, Menu.TAPAS, 1);
+        int discount = EventCalculator.calculateWeekendDiscount(4, order);
+        assertEquals(2023 * 2, discount);
+    }
+
+    @Test
+    void calculateWeekendDiscount_주말_메인없음() {
+        Map<Menu, Integer> order = Map.of(Menu.ICE_CREAM, 1);
+        int discount = EventCalculator.calculateWeekendDiscount(4, order);
+        assertEquals(0, discount);
+    }
+
+    @Test
+    void calculateSpecialDiscount_별데이() {
+        int discount = EventCalculator.calculateSpecialDiscount(25);
+        assertEquals(1000, discount);
+    }
+
+    @Test
+    void calculateSpecialDiscount_별데이_아님() {
+        int discount = EventCalculator.calculateSpecialDiscount(26);
+        assertEquals(0, discount);
+    }
+
+    @Test
+    void calculateGiveawayEvent() {
+        Map<Menu, Integer> giveaway = EventCalculator.calculateGiveawayEvent(120000);
+        assertNotNull(giveaway);
+        assertTrue(giveaway.containsKey(Menu.CHAMPAGNE));
+        assertEquals(1, giveaway.get(Menu.CHAMPAGNE));
+    }
+
+    @Test
+    void calculateBadge() {
+        assertEquals(Badge.SANTA, EventCalculator.calculateBadge(20000));
+        assertEquals(Badge.SANTA, EventCalculator.calculateBadge(30000));
+        assertEquals(Badge.TREE, EventCalculator.calculateBadge(15000));
+        assertEquals(Badge.TREE, EventCalculator.calculateBadge(19999));
+        assertEquals(Badge.STAR, EventCalculator.calculateBadge(7000));
+        assertEquals(Badge.NONE, EventCalculator.calculateBadge(4000));
+    }
+}

리뷰: 오... 아직 테스트코드가 익숙치않았는데 활용해 보겠습니다.
@@ -0,0 +1,20 @@
+package christmas.domain.logic;
+
+import christmas.domain.model.DecemberEvent;
+
+public class ChristmasEventCalculator {
+    public static int calculateChristmasDiscount(int date) {
+        int startDay = DecemberEvent.getEventStartDate();
+        int discountPricePerDay = DecemberEvent.getDayDiscountPrice();
+        int discountPriceOfFirstDay = DecemberEvent.getStartDiscountPrice();
+
+        if (date > DecemberEvent.CHRISTMAS_DAY) {
+            return 0;
+        }
+
+        int daysUntilDate = date - startDay;
+        int totalDiscount = discountPriceOfFirstDay + (daysUntilDate * discountPricePerDay);
+
+        return totalDiscount;
+    }
+}

리뷰: 아하 굳이 객체가 생성될 필요가 없군요
@@ -0,0 +1,71 @@
+package christmas.domain.model;
+
+import christmas.domain.type.Menu;
+
+import java.util.*;
+
+public class DecemberEvent {
+    public static final int CHRISTMAS_DAY = 25;
+    private static final int EVENT_START_DATE = 1;
+    private static final int DAY_DISCOUNT_PRICE = 100;
+    private static final int START_DISCOUNT_PRICE = 1_000;
+    private static final int MIN_PRICE = 10_000;
+    private static final int WEEKDAY_DISCOUNT_PRICE = 2_023;
+    private static final int WEEKEND_DISCOUNT_PRICE = 2_023;
+    private static final Menu.Category WEEKDAY_DISCOUNT_CATEGORY = Menu.Category.DESSERT;
+    private static final Menu.Category WEEKEND_DISCOUNT_CATEGORY = Menu.Category.MAIN;
+    private static final List<Integer> WEEKEND_DATES = Arrays.asList(1, 2, 8, 9, 15, 16, 22, 23, 29, 30);
+    private static final List<Integer> STAR_DATES = Arrays.asList(3, 10, 17, 24, 25, 31);
+    private static final int SPECIAL_DISCOUNT_PRICE = 1_000;
+    private static final int GIVEAWAY_CONDITION_PRICE = 120_000;
+    private static final Map<Menu, Integer> GIVEAWAY_BENEFITS = Map.of(Menu.CHAMPAGNE, 1);
+
+
+    public static boolean isOverThanMinPrice(int totalPrice) {
+        return totalPrice >= MIN_PRICE;
+    }
+
+    public static boolean isStarDate(int date) {
+        return STAR_DATES.contains(date);
+    }
+
+    public static boolean isWeekend(int date) {
+        return WEEKEND_DATES.contains(date);
+    }
+
+    public static boolean isEligibleForGiveaway(int totalPrice) {
+        return totalPrice >= GIVEAWAY_CONDITION_PRICE;
+    }
+
+    public static int getSpecialDiscountPrice() {
+        return SPECIAL_DISCOUNT_PRICE;
+    }
+
+    public static int getWeekdayDiscountPrice() { return WEEKDAY_DISCOUNT_PRICE; }
+
+    public static int getWeekendDiscountPrice() { return WEEKEND_DISCOUNT_PRICE; }
+
+    public static Menu.Category getWeekdayDiscountCategory() {
+        return WEEKDAY_DISCOUNT_CATEGORY;
+    }
+
+    public static Menu.Category getWeekendDiscountCategory() {
+        return WEEKEND_DISCOUNT_CATEGORY;
+    }
+
+    public static Map<Menu, Integer> getGiveawayBenefits() {
+        return GIVEAWAY_BENEFITS;
+    }
+
+    public static int getDayDiscountPrice() {
+        return DAY_DISCOUNT_PRICE;
+    }
+
+    public static int getStartDiscountPrice() {
+        return START_DISCOUNT_PRICE;
+    }
+
+    public static int getEventStartDate() {
+        return EVENT_START_DATE;
+    }
+}

리뷰: 12월 이벤트에는 할인 금액이나 기간등이 있어서 비즈니스 로직과 밀접하다고 생각해서 저기에 위치하긴 했습니다.
@@ -0,0 +1,41 @@
+package christmas.domain.model;
+
+import christmas.domain.type.Menu;
+
+import java.util.Map;
+
+public class OrderInfo {
+    private final int date;
+    private final Map<Menu, Integer> order;
+    private final int totalOrderPrice;
+
+    public OrderInfo(int date, Map<Menu, Integer> order) {
+        this.date = date;
+        this.order = order;
+        this.totalOrderPrice = calculateTotalOrderPrice();
+    }
+
+    public int getDate() {
+        return date;
+    }
+    public Map<Menu, Integer> getOrder() {
+        return order;
+    }
+
+    public int getTotalOrderPrice() {
+        return totalOrderPrice;
+    }
+
+    private int calculateTotalOrderPrice() {
+        int totalOrderPrice = 0;
+
+        for (Map.Entry<Menu, Integer> entry : order.entrySet()) {
+            Menu menu = entry.getKey();
+            int quantity = entry.getValue();
+
+            totalOrderPrice += menu.getPrice() * quantity;
+        }
+
+        return totalOrderPrice;
+    }
+}

리뷰: calculateTotalOrderPrice로 항상 값을 구할 수 있으니 totalOrderPrice를 멤버변수로 갖는 것 보다  외부에서 메서드를 호출하는 방식은 어떠신가요?
@@ -0,0 +1,58 @@
+package christmas.domain.type;
+
+public enum Menu {
+    //에피타이저
+    MUSHROOM_SOUP("양송이수프", 6_000, Category.APPETIZER),
+    TAPAS("타파스", 5_500, Category.APPETIZER),
+    CAESAR_SALAD("시저샐러드", 8_000, Category.APPETIZER),
+
+    //메인
+    T_BONE_STEAK("티본스테이크", 55_000, Category.MAIN),
+    BBQ_RIBS("바비큐립", 54_000, Category.MAIN),
+    SEAFOOD_PASTA("해산물파스타", 35_000, Category.MAIN),
+    CHRISTMAS_PASTA("크리스마스파스타", 25_000, Category.MAIN),
+
+    //디저트
+    CHOCOLATE_CAKE("초코케이크", 15_000, Category.DESSERT),
+    ICE_CREAM("아이스크림", 5_000, Category.DESSERT),
+
+    //음료
+    ZERO_COKE("제로콜라", 3_000, Category.BEVERAGE),
+    RED_WINE("레드와인", 60_000, Category.BEVERAGE),
+    CHAMPAGNE("샴페인", 25_000, Category.BEVERAGE);
+
+    private final String name;
+    private final int price;
+    private final Category category;
+
+    Menu(String name, int price, Category category) {
+        this.name = name;
+        this.price = price;
+        this.category = category;
+    }
+
+    public static Menu findByName(String menuName) {
+        for (Menu menu : Menu.values()) {
+            if (menu.getName().equals(menuName)) {
+                return menu;
+            }
+        }
+        return null;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public int getPrice() {
+        return price;
+    }
+
+    public Category getCategory() {
+        return category;
+    }
+
+    public enum Category {
+        APPETIZER, MAIN, DESSERT, BEVERAGE
+    }
+}

리뷰: 자바 스트림 api 를 사용하시면 인덴트를 줄이고 명확성을 높이실 수 있을 것 같습니다!
@@ -0,0 +1,58 @@
+package christmas.domain.type;
+
+public enum Menu {
+    //에피타이저
+    MUSHROOM_SOUP("양송이수프", 6_000, Category.APPETIZER),
+    TAPAS("타파스", 5_500, Category.APPETIZER),
+    CAESAR_SALAD("시저샐러드", 8_000, Category.APPETIZER),
+
+    //메인
+    T_BONE_STEAK("티본스테이크", 55_000, Category.MAIN),
+    BBQ_RIBS("바비큐립", 54_000, Category.MAIN),
+    SEAFOOD_PASTA("해산물파스타", 35_000, Category.MAIN),
+    CHRISTMAS_PASTA("크리스마스파스타", 25_000, Category.MAIN),
+
+    //디저트
+    CHOCOLATE_CAKE("초코케이크", 15_000, Category.DESSERT),
+    ICE_CREAM("아이스크림", 5_000, Category.DESSERT),
+
+    //음료
+    ZERO_COKE("제로콜라", 3_000, Category.BEVERAGE),
+    RED_WINE("레드와인", 60_000, Category.BEVERAGE),
+    CHAMPAGNE("샴페인", 25_000, Category.BEVERAGE);
+
+    private final String name;
+    private final int price;
+    private final Category category;
+
+    Menu(String name, int price, Category category) {
+        this.name = name;
+        this.price = price;
+        this.category = category;
+    }
+
+    public static Menu findByName(String menuName) {
+        for (Menu menu : Menu.values()) {
+            if (menu.getName().equals(menuName)) {
+                return menu;
+            }
+        }
+        return null;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public int getPrice() {
+        return price;
+    }
+
+    public Category getCategory() {
+        return category;
+    }
+
+    public enum Category {
+        APPETIZER, MAIN, DESSERT, BEVERAGE
+    }
+}

리뷰: InputView에서도 비슷한 코드로 메뉴 이름을 검증하시는데 null 을 반환하는 대신 여기서 바로 예외를 던지시는 건 어떠신가요?
@@ -0,0 +1,70 @@
+package christmas.domain.logic;
+
+import christmas.domain.model.DecemberEvent;
+import christmas.domain.type.Badge;
+import christmas.domain.type.Menu;
+
+import java.util.Collections;
+import java.util.Map;
+
+public class EventCalculator {
+    public static boolean isEligibleForEvent(int totalPrice) {
+        return DecemberEvent.isOverThanMinPrice(totalPrice);
+    }
+
+    public static int calculateWeekdayDiscount(int date, Map<Menu, Integer> order) {
+        int totalDiscount = 0;
+        Menu.Category category = DecemberEvent.getWeekdayDiscountCategory();
+        int discountPrice = DecemberEvent.getWeekdayDiscountPrice();
+
+        for (Map.Entry<Menu, Integer> entry : order.entrySet()) {
+            Menu menu = entry.getKey();
+            int quantity = entry.getValue();
+
+            totalDiscount += calculateDiscountByCategory(menu, quantity, category, discountPrice);
+        }
+
+        return totalDiscount;
+    }
+
+    public static int calculateWeekendDiscount(int date, Map<Menu, Integer> order) {
+        int totalDiscount = 0;
+        Menu.Category category = DecemberEvent.getWeekendDiscountCategory();
+        int discountPrice = DecemberEvent.getWeekendDiscountPrice();
+
+        for (Map.Entry<Menu, Integer> entry : order.entrySet()) {
+            Menu menu = entry.getKey();
+            int quantity = entry.getValue();
+
+            totalDiscount += calculateDiscountByCategory(menu, quantity, category, discountPrice);
+        }
+
+        return totalDiscount;
+    }
+
+    public static int calculateSpecialDiscount(int date) {
+        if (DecemberEvent.isStarDate(date)) {
+            return DecemberEvent.getSpecialDiscountPrice();
+        }
+        return 0;
+    }
+
+    public static Map<Menu, Integer> calculateGiveawayEvent(int totalPrice) {
+        if (DecemberEvent.isEligibleForGiveaway(totalPrice)) {
+            return DecemberEvent.getGiveawayBenefits();
+        }
+        return Collections.emptyMap();
+    }
+
+    public static Badge calculateBadge(int totalDiscount) {
+        Badge badge = Badge.findByTotalDiscount(totalDiscount);
+        return badge;
+    }
+
+    private static int calculateDiscountByCategory(Menu menu, int quantity, Menu.Category category, int discountPrice) {
+        if (menu.getCategory().equals(category)) {
+            return quantity * discountPrice;
+        }
+        return 0;
+    }
+}

리뷰: 이 메서드에서 date는 사용하지 않는데 파라미터로 받으시는 이유가 있으실까요?
@@ -0,0 +1,70 @@
+package christmas.domain.logic;
+
+import christmas.domain.model.DecemberEvent;
+import christmas.domain.type.Badge;
+import christmas.domain.type.Menu;
+
+import java.util.Collections;
+import java.util.Map;
+
+public class EventCalculator {
+    public static boolean isEligibleForEvent(int totalPrice) {
+        return DecemberEvent.isOverThanMinPrice(totalPrice);
+    }
+
+    public static int calculateWeekdayDiscount(int date, Map<Menu, Integer> order) {
+        int totalDiscount = 0;
+        Menu.Category category = DecemberEvent.getWeekdayDiscountCategory();
+        int discountPrice = DecemberEvent.getWeekdayDiscountPrice();
+
+        for (Map.Entry<Menu, Integer> entry : order.entrySet()) {
+            Menu menu = entry.getKey();
+            int quantity = entry.getValue();
+
+            totalDiscount += calculateDiscountByCategory(menu, quantity, category, discountPrice);
+        }
+
+        return totalDiscount;
+    }
+
+    public static int calculateWeekendDiscount(int date, Map<Menu, Integer> order) {
+        int totalDiscount = 0;
+        Menu.Category category = DecemberEvent.getWeekendDiscountCategory();
+        int discountPrice = DecemberEvent.getWeekendDiscountPrice();
+
+        for (Map.Entry<Menu, Integer> entry : order.entrySet()) {
+            Menu menu = entry.getKey();
+            int quantity = entry.getValue();
+
+            totalDiscount += calculateDiscountByCategory(menu, quantity, category, discountPrice);
+        }
+
+        return totalDiscount;
+    }
+
+    public static int calculateSpecialDiscount(int date) {
+        if (DecemberEvent.isStarDate(date)) {
+            return DecemberEvent.getSpecialDiscountPrice();
+        }
+        return 0;
+    }
+
+    public static Map<Menu, Integer> calculateGiveawayEvent(int totalPrice) {
+        if (DecemberEvent.isEligibleForGiveaway(totalPrice)) {
+            return DecemberEvent.getGiveawayBenefits();
+        }
+        return Collections.emptyMap();
+    }
+
+    public static Badge calculateBadge(int totalDiscount) {
+        Badge badge = Badge.findByTotalDiscount(totalDiscount);
+        return badge;
+    }
+
+    private static int calculateDiscountByCategory(Menu menu, int quantity, Menu.Category category, int discountPrice) {
+        if (menu.getCategory().equals(category)) {
+            return quantity * discountPrice;
+        }
+        return 0;
+    }
+}

리뷰: Map<Menu, Integer> order 로 카테코리별 메뉴 개수를 셀 수 있으니 이를 OrderInfo 모델의 역할로 넘기시는 건 어떠실까요?