ewhk9887/korean_code_reviews_from_github huggingface dataset:
@@ -0,0 +1,60 @@
+package christmas.domain;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+class EventProcessTest {
+    @DisplayName("이벤트에 충분한 전체 주문 금액으로 전체 혜택 도출")
+    @Test
+    void takeAllBenefitWithSufficientTotalOrderPrice() {
+        Date dateInput = new Date(3);
+        Order orderInput = new Order(setUpSufficientTotalOrderPriceOrder());
+        EventProcess eventProcess = new EventProcess();
+        EventResult eventResult = eventProcess.takeAllBenefit(dateInput, orderInput);
+        Map<BenefitType, Integer> result = eventResult.getAllBenefit();
+
+        assertThat(result.get(BenefitType.GIFT)).isEqualTo(25000);
+        assertThat(result.get(BenefitType.D_DAY)).isEqualTo(1200);
+        assertThat(result.get(BenefitType.WEEKDAY)).isEqualTo(2023);
+        assertThat(result.get(BenefitType.WEEKEND)).isEqualTo(0);
+        assertThat(result.get(BenefitType.SPECIAL)).isEqualTo(1000);
+    }
+
+    private List<OrderedMenu> setUpSufficientTotalOrderPriceOrder() {
+        List<OrderedMenu> orderedMenus = new ArrayList<>();
+        orderedMenus.add(new OrderedMenu("해산물파스타", 2));
+        orderedMenus.add(new OrderedMenu("레드와인", 1));
+        orderedMenus.add(new OrderedMenu("초코케이크", 1));
+
+        return orderedMenus;
+    }
+
+    @DisplayName("이벤트에 충분하지 않은 전체 주문 금액으로 전체 혜택 도출")
+    @Test
+    void takeAllBenefitWithInSufficientTotalOrderPrice() {
+        Date dateInput = new Date(26);
+        Order orderInput = new Order(setUpInSufficientTotalOrderPriceOrder());
+        EventProcess eventProcess = new EventProcess();
+        EventResult eventResult = eventProcess.takeAllBenefit(dateInput, orderInput);
+        Map<BenefitType, Integer> result = eventResult.getAllBenefit();
+
+        assertThat(result.get(BenefitType.GIFT)).isEqualTo(0);
+        assertThat(result.get(BenefitType.D_DAY)).isEqualTo(0);
+        assertThat(result.get(BenefitType.WEEKDAY)).isEqualTo(0);
+        assertThat(result.get(BenefitType.WEEKEND)).isEqualTo(0);
+        assertThat(result.get(BenefitType.SPECIAL)).isEqualTo(0);
+    }
+
+    private List<OrderedMenu> setUpInSufficientTotalOrderPriceOrder() {
+        List<OrderedMenu> orderedMenus = new ArrayList<>();
+        orderedMenus.add(new OrderedMenu("타파스", 1));
+        orderedMenus.add(new OrderedMenu("제로콜라", 1));
+
+        return orderedMenus;
+    }
+}
\ No newline at end of file

리뷰: 와,, 확실하게 테스트 할 수 있겠네요 감사합니다!!
@@ -0,0 +1,23 @@
+package christmas.domain;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+class MenuTest {
+    @DisplayName("주어진 이름을 토대로 메뉴를 판단할 수 있다.")
+    @Test
+    void decideMenu() {
+        String inputTapas = "타파스";
+        String inputSeafoodPasta = "해산물파스타";
+        String inputRedWine = "레드와인";
+        Menu inputTapasResult = Menu.decideMenu(inputTapas);
+        Menu inputSeafoodPastaResult = Menu.decideMenu(inputSeafoodPasta);
+        Menu inputRedWineResult = Menu.decideMenu(inputRedWine);
+
+        assertThat(inputTapasResult).isEqualTo(Menu.TAPAS);
+        assertThat(inputSeafoodPastaResult).isEqualTo(Menu.SEAFOOD_PASTA);
+        assertThat(inputRedWineResult).isEqualTo(Menu.RED_WINE);
+    }
+}
\ No newline at end of file

리뷰: 맞아요 개인적으로 가장 아쉬운 부분인데요,, 구현하고 리팩터링을 하도 많이 해서 시간이 매우 촉박했다는,, ㅠㅠ
@@ -0,0 +1,39 @@
+package christmas.domain;
+
+import java.util.Arrays;
+import java.util.List;
+
+public enum MenuType {
+    APPETIZER("애피타이저", Arrays.asList(Menu.MUSHROOM_SOUP, Menu.TAPAS, Menu.CAESAR_SALAD)),
+    MAIN("메인", Arrays.asList(Menu.T_BONE_STAKE, Menu.BARBECUE_LIP, Menu.SEAFOOD_PASTA, Menu.CHRISTMAS_PASTA)),
+    DESSERT("디저트", Arrays.asList(Menu.CHOCOLATE_CAKE, Menu.ICE_CREAM)),
+    BEVERAGE("음료", Arrays.asList(Menu.ZERO_COKE, Menu.RED_WINE, Menu.CHAMPAGNE));
+
+    private final String name;
+    private final List<Menu> menus;
+
+    MenuType(String name, List<Menu> menus) {
+        this.name = name;
+        this.menus = menus;
+    }
+
+    public static MenuType decideMenuType(Menu menu) {
+        MenuType[] menuTypes = values();
+
+        for (MenuType menuType : menuTypes) {
+            if (menuType.getMenus().contains(menu)) {
+                return menuType;
+            }
+        }
+
+        return null;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public List<Menu> getMenus() {
+        return menus;
+    }
+}
\ No newline at end of file

리뷰: 저한테 남겨주셨던 코드 리뷰에서 언급하신 패턴이네요! 좋은 공부가 된 것 같습니다.
@@ -0,0 +1,21 @@
+package christmas.domain;
+
+public enum OrderResultType {
+    ORDER_MENU("<주문 메뉴>"),
+    TOTAL_ORDER_PRICE("<할인 전 총주문 금액>"),
+    GIFT_MENU("<증정 메뉴>"),
+    BENEFIT_STATISTICS("<혜택 내역>"),
+    TOTAL_BENEFIT_AMOUNT("<총혜택 금액>"),
+    ESTIMATED_PAYMENT("<할인 후 예상 결제 금액>"),
+    EVENT_BADGE("<12월 이벤트 배지>");
+
+    private final String name;
+
+    OrderResultType(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

리뷰: 🤔 `OrderResultType`의 제목은 그렇다 쳐도, < > 같은 character 들은 View의 책임에 가까워 보여요.
View에서`"<%s>"` 와 같은 방법으로 책임을 분리하고 formatting을 이용해 출력하는 방법이 더 변경에 강한 설계 아닐까요?
@@ -0,0 +1,45 @@
+package christmas.domain;
+
+public class OrderedMenu {
+    public static final String ORDER_RE_READ_REQUEST_MESSAGE = "유효하지 않은 주문입니다. 다시 입력해 주세요.";
+    private static final int AMOUNT_MINIMUM_QUANTITY = 1;
+
+    private final String menuName;
+    private final int quantity;
+
+    public OrderedMenu(String menuName, int quantity) {
+        validateOrderNameExistInMenu(menuName);
+        validateOrderAmountQuantity(quantity);
+
+        this.menuName = menuName;
+        this.quantity = quantity;
+    }
+
+    private void validateOrderNameExistInMenu(String name) {
+        if (Menu.decideMenu(name) == Menu.NONE) {
+            throw new IllegalArgumentException(ORDER_RE_READ_REQUEST_MESSAGE);
+        }
+    }
+
+    private void validateOrderAmountQuantity(int amount) {
+        if (amount < AMOUNT_MINIMUM_QUANTITY) {
+            throw new IllegalArgumentException(ORDER_RE_READ_REQUEST_MESSAGE);
+        }
+    }
+
+    public boolean isBeverage() {
+        return MenuType.decideMenuType(Menu.decideMenu(menuName)) == MenuType.BEVERAGE;
+    }
+
+    public int calculatePrice() {
+        return Menu.decideMenu(menuName).getPrice() * quantity;
+    }
+
+    public String getMenuName() {
+        return menuName;
+    }
+
+    public int getQuantity() {
+        return quantity;
+    }
+}
\ No newline at end of file

리뷰: `Menu` 에 속하는 것으로 검증이 되었다면, field를 `String`이 아닌 `Menu`로 저장하는게 더 좋았을 것 같아요.
enum 사용의 의미가 약간 퇴색되지 않았나 싶네요!
@@ -0,0 +1,52 @@
+package christmas.ui;
+
+import static christmas.domain.Date.DATE_RE_READ_REQUEST_MESSAGE;
+import static christmas.domain.OrderedMenu.ORDER_RE_READ_REQUEST_MESSAGE;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Converter {
+    private static final String ORDER_DELIMITER = ",";
+    private static final String NAME_AND_AMOUNT_DELIMITER = "-";
+
+    public static int convertDateNumeric(String Input) {
+        try {
+            return Integer.parseInt(Input);
+        } catch (NumberFormatException e) {
+            throw new IllegalArgumentException(DATE_RE_READ_REQUEST_MESSAGE);
+        }
+    }
+
+    public static List<String> separateOrder(String order) {
+        return new ArrayList<>(List.of(order.split(ORDER_DELIMITER)));
+    }
+
+    public static List<String> separateNameAndAmount(String orderedMenu) {
+        validateAppropriateDelimiter(orderedMenu);
+        List<String> separatedNameAndAmount = new ArrayList<>(List.of(orderedMenu.split(NAME_AND_AMOUNT_DELIMITER)));
+        validateAppropriateForm(separatedNameAndAmount);
+
+        return separatedNameAndAmount;
+    }
+
+    private static void validateAppropriateDelimiter(String orderedMenu) {
+        if (!orderedMenu.contains(NAME_AND_AMOUNT_DELIMITER)) {
+            throw new IllegalArgumentException(ORDER_RE_READ_REQUEST_MESSAGE);
+        }
+    }
+
+    private static void validateAppropriateForm(List<String> separatedNameAndAmount) {
+        if (separatedNameAndAmount.size() != 2) {
+            throw new IllegalArgumentException(ORDER_RE_READ_REQUEST_MESSAGE);
+        }
+    }
+
+    public static int convertAmountNumeric(String input) {
+        try {
+            return Integer.parseInt(input);
+        } catch (NumberFormatException e) {
+            throw new IllegalArgumentException(ORDER_RE_READ_REQUEST_MESSAGE);
+        }
+    }
+}
\ No newline at end of file

리뷰: String을 오브젝트로 바꾸는 클래스는 `Parser`라고 이름 짓는 것이 더 convention에 가까울 것 같은데, 어떻게 생각하시나요?
@@ -0,0 +1,63 @@
+package christmas.ui;
+
+import camp.nextstep.edu.missionutils.Console;
+import christmas.domain.Date;
+import christmas.domain.Order;
+import christmas.domain.OrderedMenu;
+import java.util.ArrayList;
+import java.util.List;
+
+public class InputView {
+    private static final String OPENING_MESSAGE = "안녕하세요! 우테코 식당 12월 이벤트 플래너입니다.";
+    private static final String DATE_REQUEST_MESSAGE = "12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)";
+    private static final String ORDER_REQUEST_MESSAGE
+            = "주문하실 메뉴를 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)";
+
+    public static void notifyProgramStarted() {
+        System.out.println(OPENING_MESSAGE);
+    }
+
+    public static Date inputDate() {
+        try {
+            return readDate();
+        } catch (IllegalArgumentException e) {
+            OutputView.printErrorMessage(e);
+            return inputDate();
+        }
+    }
+
+    private static Date readDate() {
+        System.out.println(DATE_REQUEST_MESSAGE);
+
+        String input = Console.readLine();
+        int dayNumber = Converter.convertDateNumeric(input);
+
+        return new Date(dayNumber);
+    }
+
+    public static Order inputOrder() {
+        try {
+            return new Order(readOrder());
+        } catch (IllegalArgumentException e) {
+            OutputView.printErrorMessage(e);
+            return inputOrder();
+        }
+    }
+
+    private static List<OrderedMenu> readOrder() {
+        System.out.println(ORDER_REQUEST_MESSAGE);
+
+        String input = Console.readLine();
+        List<String> separatedOrder = Converter.separateOrder(input);
+        List<OrderedMenu> order = new ArrayList<>();
+
+        for (String orderedMenu : separatedOrder) {
+            List<String> separatedNameAndAmount = Converter.separateNameAndAmount(orderedMenu);
+            String name = separatedNameAndAmount.get(0);
+            int amount = Converter.convertAmountNumeric(separatedNameAndAmount.get(1));
+            order.add(new OrderedMenu(name, amount));
+        }
+
+        return order;
+    }
+}
\ No newline at end of file

리뷰: Supplier의 형태로 handling 하는 방법도 있어요. inputDate와 inputOrder의 형태가 굉장히 닮아있어서, 재사용성을 높이는 방법으로 적용 가능할 것 같으니 이 자료 한번 읽어보시길 추천합니다.
https://hwan33.tistory.com/17
@@ -0,0 +1,85 @@
+package christmas.domain;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+public class EventResult {
+    private static final String NON_BADGE = "없음";
+    private static final String STAR_BADGE = "별";
+    private static final String TREE_BADGE = "트리";
+    private static final String SANTA_BADGE = "산타";
+    private static final int STAR_BADGE_MINIMUM_AMOUNT = 5000;
+    private static final int STAR_BADGE_MAXIMUM_AMOUNT = 10000;
+    private static final int TREE_BADGE_MINIMUM_AMOUNT = 10000;
+    private static final int TREE_BADGE_MAXIMUM_AMOUNT = 20000;
+    private static final int SANTA_BADGE_MINIMUM_AMOUNT = 20000;
+
+    private final Map<BenefitType, Integer> allBenefit;
+
+    public EventResult(Map<BenefitType, Integer> allBenefit) {
+        this.allBenefit = allBenefit;
+    }
+
+    public int calculateTotalBenefitAmount() {
+        int totalBenefitAmount = 0;
+        List<BenefitType> benefitTypes = List.of(BenefitType.values());
+
+        for (BenefitType benefitType : benefitTypes) {
+            totalBenefitAmount += allBenefit.get(benefitType);
+        }
+
+        return totalBenefitAmount;
+    }
+
+    public int calculateTotalDiscountAmount() {
+        int totalDiscountAmount = 0;
+        List<BenefitType> benefitTypes = List.of(BenefitType.values());
+
+        for (BenefitType benefitType : benefitTypes) {
+            totalDiscountAmount += allBenefit.get(benefitType);
+        }
+        if (allBenefit.get(BenefitType.GIFT) == Menu.CHAMPAGNE.getPrice()) {
+            totalDiscountAmount -= Menu.CHAMPAGNE.getPrice();
+        }
+
+        return totalDiscountAmount;
+    }
+
+    public boolean isReceivedGiftBenefit() {
+        return allBenefit.get(BenefitType.GIFT) == Menu.CHAMPAGNE.getPrice();
+    }
+
+    public List<BenefitType> checkWhichBenefitExist() {
+        List<BenefitType> existingBenefit = new ArrayList<>();
+        BenefitType[] benefitTypes = BenefitType.values();
+
+        for (BenefitType benefitType : benefitTypes) {
+            if (allBenefit.get(benefitType) != 0) {
+                existingBenefit.add(benefitType);
+            }
+        }
+
+        return existingBenefit;
+    }
+
+    public String decideEventBadge() {
+        int totalBenefitAmount = calculateTotalBenefitAmount();
+
+        if ((totalBenefitAmount >= STAR_BADGE_MINIMUM_AMOUNT) && (totalBenefitAmount < STAR_BADGE_MAXIMUM_AMOUNT)) {
+            return STAR_BADGE;
+        }
+        if ((totalBenefitAmount >= TREE_BADGE_MINIMUM_AMOUNT) && (totalBenefitAmount < TREE_BADGE_MAXIMUM_AMOUNT)) {
+            return TREE_BADGE;
+        }
+        if ((totalBenefitAmount >= SANTA_BADGE_MINIMUM_AMOUNT)) {
+            return SANTA_BADGE;
+        }
+        return NON_BADGE;
+    }
+
+    public Map<BenefitType, Integer> getAllBenefit() {
+        return Collections.unmodifiableMap(allBenefit);
+    }
+}
\ No newline at end of file

리뷰: 추가) NON_BADGE도 변수명 통일성을 위해 NONE_BADGE로 작성하셨다면 더 좋을 것 같습니다.
@@ -0,0 +1,39 @@
+package christmas.domain;
+
+import java.util.Arrays;
+import java.util.List;
+
+public enum MenuType {
+    APPETIZER("애피타이저", Arrays.asList(Menu.MUSHROOM_SOUP, Menu.TAPAS, Menu.CAESAR_SALAD)),
+    MAIN("메인", Arrays.asList(Menu.T_BONE_STAKE, Menu.BARBECUE_LIP, Menu.SEAFOOD_PASTA, Menu.CHRISTMAS_PASTA)),
+    DESSERT("디저트", Arrays.asList(Menu.CHOCOLATE_CAKE, Menu.ICE_CREAM)),
+    BEVERAGE("음료", Arrays.asList(Menu.ZERO_COKE, Menu.RED_WINE, Menu.CHAMPAGNE));
+
+    private final String name;
+    private final List<Menu> menus;
+
+    MenuType(String name, List<Menu> menus) {
+        this.name = name;
+        this.menus = menus;
+    }
+
+    public static MenuType decideMenuType(Menu menu) {
+        MenuType[] menuTypes = values();
+
+        for (MenuType menuType : menuTypes) {
+            if (menuType.getMenus().contains(menu)) {
+                return menuType;
+            }
+        }
+
+        return null;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public List<Menu> getMenus() {
+        return menus;
+    }
+}
\ No newline at end of file

리뷰: 맞아요 다시 물어보셨어서 댓글에 정보를 얻은 링크 남겨드렸었는데요 못 보신 것 같아 다시 남겨드려요..!!
https://techblog.woowahan.com/2527/
@Uniaut
@@ -0,0 +1,21 @@
+package christmas.domain;
+
+public enum OrderResultType {
+    ORDER_MENU("<주문 메뉴>"),
+    TOTAL_ORDER_PRICE("<할인 전 총주문 금액>"),
+    GIFT_MENU("<증정 메뉴>"),
+    BENEFIT_STATISTICS("<혜택 내역>"),
+    TOTAL_BENEFIT_AMOUNT("<총혜택 금액>"),
+    ESTIMATED_PAYMENT("<할인 후 예상 결제 금액>"),
+    EVENT_BADGE("<12월 이벤트 배지>");
+
+    private final String name;
+
+    OrderResultType(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

리뷰: 더 좋은 방법인것 같네요!! 좋은 의견 감사합니다
@@ -0,0 +1,45 @@
+package christmas.domain;
+
+public class OrderedMenu {
+    public static final String ORDER_RE_READ_REQUEST_MESSAGE = "유효하지 않은 주문입니다. 다시 입력해 주세요.";
+    private static final int AMOUNT_MINIMUM_QUANTITY = 1;
+
+    private final String menuName;
+    private final int quantity;
+
+    public OrderedMenu(String menuName, int quantity) {
+        validateOrderNameExistInMenu(menuName);
+        validateOrderAmountQuantity(quantity);
+
+        this.menuName = menuName;
+        this.quantity = quantity;
+    }
+
+    private void validateOrderNameExistInMenu(String name) {
+        if (Menu.decideMenu(name) == Menu.NONE) {
+            throw new IllegalArgumentException(ORDER_RE_READ_REQUEST_MESSAGE);
+        }
+    }
+
+    private void validateOrderAmountQuantity(int amount) {
+        if (amount < AMOUNT_MINIMUM_QUANTITY) {
+            throw new IllegalArgumentException(ORDER_RE_READ_REQUEST_MESSAGE);
+        }
+    }
+
+    public boolean isBeverage() {
+        return MenuType.decideMenuType(Menu.decideMenu(menuName)) == MenuType.BEVERAGE;
+    }
+
+    public int calculatePrice() {
+        return Menu.decideMenu(menuName).getPrice() * quantity;
+    }
+
+    public String getMenuName() {
+        return menuName;
+    }
+
+    public int getQuantity() {
+        return quantity;
+    }
+}
\ No newline at end of file

리뷰: 맞네요..! 좋은 의견 감사합니다!! Menu열거에서 메뉴에 속하지 않는 입력을 처리하기 위해 "없음"을 만들었었는데, 만약 null로 처리했었다면 Menu에 속하는 것으로 아직 검증이 안되었던 거니까 지금처럼 String으로 하는 것이 맞을까요? 제가 이해한 것이 맞는지 궁금해요 @Uniaut
@@ -0,0 +1,58 @@
+package christmas.domain;
+
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+
+public class Date {
+    public static final String DATE_RE_READ_REQUEST_MESSAGE = "유효하지 않은 날짜입니다. 다시 입력해 주세요.";
+    private static final LocalDate CHRISTMAS_DAY = LocalDate.of(2023, 12, 25);
+    private static final int YEAR = 2023;
+    private static final int MONTH = 12;
+    private static final int DATE_MIN_NUMBER = 1;
+    private static final int DATE_MAX_NUMBER = 31;
+
+    private final int dayNumber;
+
+    public Date(int dayNumber) {
+        validateRange(dayNumber);
+        this.dayNumber = dayNumber;
+    }
+
+    private void validateRange(int dayNumber) {
+        if ((dayNumber < DATE_MIN_NUMBER) || (dayNumber > DATE_MAX_NUMBER)) {
+            throw new IllegalArgumentException(DATE_RE_READ_REQUEST_MESSAGE);
+        }
+    }
+
+    public boolean isDDayDiscountActive() {
+        LocalDate localDate = LocalDate.of(YEAR, MONTH, dayNumber);
+
+        return localDate.isBefore(CHRISTMAS_DAY.plusDays(1));
+    }
+
+    public boolean isWeekdayDiscountActive() {
+        LocalDate localDate = LocalDate.of(YEAR, MONTH, dayNumber);
+        DayOfWeek day = localDate.getDayOfWeek();
+
+        return (day.equals(DayOfWeek.MONDAY) || day.equals(DayOfWeek.TUESDAY) || day.equals(DayOfWeek.WEDNESDAY)
+                || day.equals(DayOfWeek.THURSDAY) || day.equals(DayOfWeek.SUNDAY));
+    }
+
+    public boolean isWeekendDiscountActive() {
+        LocalDate localDate = LocalDate.of(YEAR, MONTH, dayNumber);
+        DayOfWeek day = localDate.getDayOfWeek();
+
+        return (day.equals(DayOfWeek.FRIDAY) || day.equals(DayOfWeek.SATURDAY));
+    }
+
+    public boolean isSpecialDiscountActive() {
+        LocalDate localDate = LocalDate.of(YEAR, MONTH, dayNumber);
+        DayOfWeek day = localDate.getDayOfWeek();
+
+        return (day.equals(DayOfWeek.SUNDAY) || localDate.equals(CHRISTMAS_DAY));
+    }
+
+    public int getDayNumber() {
+        return dayNumber;
+    }
+}
\ No newline at end of file

리뷰: @JaeHongDev 
저도 새롭게 배워갑니다..!
@@ -0,0 +1,85 @@
+package christmas.domain;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+public class EventResult {
+    private static final String NON_BADGE = "없음";
+    private static final String STAR_BADGE = "별";
+    private static final String TREE_BADGE = "트리";
+    private static final String SANTA_BADGE = "산타";
+    private static final int STAR_BADGE_MINIMUM_AMOUNT = 5000;
+    private static final int STAR_BADGE_MAXIMUM_AMOUNT = 10000;
+    private static final int TREE_BADGE_MINIMUM_AMOUNT = 10000;
+    private static final int TREE_BADGE_MAXIMUM_AMOUNT = 20000;
+    private static final int SANTA_BADGE_MINIMUM_AMOUNT = 20000;
+
+    private final Map<BenefitType, Integer> allBenefit;
+
+    public EventResult(Map<BenefitType, Integer> allBenefit) {
+        this.allBenefit = allBenefit;
+    }
+
+    public int calculateTotalBenefitAmount() {
+        int totalBenefitAmount = 0;
+        List<BenefitType> benefitTypes = List.of(BenefitType.values());
+
+        for (BenefitType benefitType : benefitTypes) {
+            totalBenefitAmount += allBenefit.get(benefitType);
+        }
+
+        return totalBenefitAmount;
+    }
+
+    public int calculateTotalDiscountAmount() {
+        int totalDiscountAmount = 0;
+        List<BenefitType> benefitTypes = List.of(BenefitType.values());
+
+        for (BenefitType benefitType : benefitTypes) {
+            totalDiscountAmount += allBenefit.get(benefitType);
+        }
+        if (allBenefit.get(BenefitType.GIFT) == Menu.CHAMPAGNE.getPrice()) {
+            totalDiscountAmount -= Menu.CHAMPAGNE.getPrice();
+        }
+
+        return totalDiscountAmount;
+    }
+
+    public boolean isReceivedGiftBenefit() {
+        return allBenefit.get(BenefitType.GIFT) == Menu.CHAMPAGNE.getPrice();
+    }
+
+    public List<BenefitType> checkWhichBenefitExist() {
+        List<BenefitType> existingBenefit = new ArrayList<>();
+        BenefitType[] benefitTypes = BenefitType.values();
+
+        for (BenefitType benefitType : benefitTypes) {
+            if (allBenefit.get(benefitType) != 0) {
+                existingBenefit.add(benefitType);
+            }
+        }
+
+        return existingBenefit;
+    }
+
+    public String decideEventBadge() {
+        int totalBenefitAmount = calculateTotalBenefitAmount();
+
+        if ((totalBenefitAmount >= STAR_BADGE_MINIMUM_AMOUNT) && (totalBenefitAmount < STAR_BADGE_MAXIMUM_AMOUNT)) {
+            return STAR_BADGE;
+        }
+        if ((totalBenefitAmount >= TREE_BADGE_MINIMUM_AMOUNT) && (totalBenefitAmount < TREE_BADGE_MAXIMUM_AMOUNT)) {
+            return TREE_BADGE;
+        }
+        if ((totalBenefitAmount >= SANTA_BADGE_MINIMUM_AMOUNT)) {
+            return SANTA_BADGE;
+        }
+        return NON_BADGE;
+    }
+
+    public Map<BenefitType, Integer> getAllBenefit() {
+        return Collections.unmodifiableMap(allBenefit);
+    }
+}
\ No newline at end of file

리뷰: if문 전까지가 calculateTotalBenefitAmount랑 같아서 같은 코드를 적을 필요없이 메서드를 사용해도 될 것 같아요!