ewhk9887/korean_code_reviews_from_github huggingface dataset:
@@ -0,0 +1,76 @@
+package christmas.domain;
+
+import static christmas.config.message.ErrorMessage.INVALID_DATE;
+import static christmas.domain.constant.DateConstant.CHRISTMAS_D_DAY_DISCOUNT_END_DATE;
+import static christmas.domain.constant.DateConstant.CHRISTMAS_D_DAY_DISCOUNT_START_DATE;
+import static christmas.domain.constant.DateConstant.MONTH;
+import static christmas.domain.constant.DateConstant.SPECIAL_DAYS;
+import static christmas.domain.constant.DateConstant.WEEKDAYS;
+import static christmas.domain.constant.DateConstant.WEEKEND;
+import static christmas.domain.constant.DateConstant.YEARS;
+
+import christmas.validator.InputValidator;
+import christmas.validator.NumberValidator;
+import java.time.DateTimeException;
+import java.time.LocalDate;
+
+public class VisitDate {
+
+	private final int date;
+
+	public VisitDate(String date) {
+		validate(date);
+
+		this.date = convertToInt(date);
+	}
+
+	private void validate(String date) {
+		if (!NumberValidator.isNumeric(date)) {
+			throw new IllegalArgumentException(INVALID_DATE.getMessage());
+		}
+
+		if (InputValidator.isBlank(date)) {
+			throw new IllegalArgumentException(INVALID_DATE.getMessage());
+		}
+
+		if (!isValidDay(date)) {
+			throw new IllegalArgumentException(INVALID_DATE.getMessage());
+		}
+	}
+
+	private static boolean isValidDay(String date) {
+		try {
+			int day = Integer.parseInt(date);
+			LocalDate.of(YEARS, MONTH, day);
+			return true;
+		} catch (DateTimeException e) {
+			return false;
+		}
+	}
+
+	private int convertToInt(String date) {
+		return Integer.parseInt(date);
+	}
+
+	public boolean isWeekday() {
+		LocalDate day = LocalDate.of(YEARS, MONTH, date);
+		return WEEKDAYS.contains(day.getDayOfWeek());
+	}
+
+	public boolean isWeekend() {
+		LocalDate day = LocalDate.of(YEARS, MONTH, date);
+		return WEEKEND.contains(day.getDayOfWeek());
+	}
+
+	public boolean isSpecialDate() {
+		return SPECIAL_DAYS.contains(date);
+	}
+
+	public boolean isChristmasDdayPeriod() {
+		return CHRISTMAS_D_DAY_DISCOUNT_START_DATE <= date && date <= CHRISTMAS_D_DAY_DISCOUNT_END_DATE;
+	}
+
+	public int getChristmasDiscountAccrueDate() {
+		return date - 1;
+	}
+}
\ No newline at end of file

리뷰: 저도 몰랐습니다..😭 좋은 방법이 있었네요!!
@@ -0,0 +1,24 @@
+package christmas.domain.amount;
+
+import christmas.config.menu.Menu;
+import java.util.Map;
+
+public class TotalOrderAmount implements Amount {
+
+	private int totalOrderAmount;
+
+	public TotalOrderAmount(Map<Menu, Integer> order) {
+		for (Map.Entry<Menu, Integer> menu : order.entrySet()) {
+			totalOrderAmount += menu.getKey().getPrice() * menu.getValue();
+		}
+	}
+
+	@Override
+	public int getAmount() {
+		return totalOrderAmount;
+	}
+
+	public boolean isPresentAvailable(int baseAmount) {
+		return totalOrderAmount >= baseAmount;
+	}
+}
\ No newline at end of file

리뷰: Order 클래스에서 인자로 menus로 주셨는데, 여기서도 인자명을 order말고 menus로 하는건 어떨까요??
@@ -0,0 +1,23 @@
+package christmas.config;
+
+public enum Badge {
+	STAR(5_000, "별"),
+	TREE(10_000, "트리"),
+	SANTA(20_000, "산타");
+
+	private final int baseAmount;
+	private final String name;
+
+	Badge(int baseAmount, String name) {
+		this.baseAmount = baseAmount;
+		this.name = name;
+	}
+
+	public int getBaseAmount() {
+		return baseAmount;
+	}
+
+	public String getName() {
+		return name;
+	}
+}
\ No newline at end of file

리뷰: 저도 이게 좀 이상한거 같다고는 생각했는데 config에 프로젝트에 설정정보를 담고 있는 패키지를 구상을 했는데
따로 constant를 안만들고 config에 다 넣는게 더 좋았을거같네요..
@@ -0,0 +1,18 @@
+package christmas.config.message;
+
+import static christmas.domain.constant.MenuConstant.MAXIMUM_ORDER_QUANTITY;
+
+public enum ErrorMessage {
+	INVALID_DATE("[ERROR] 유효하지 않은 날짜입니다. 다시 입력해 주세요."),
+	INVALID_ORDER("[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."),
+	EXCEEDED_ORDER_QUANTITY_LIMIT(String.format("[ERROR] 메뉴는 한 번에 최대 %d개까지만 주문할 수 있습니다.", MAXIMUM_ORDER_QUANTITY));
+	private final String message;
+
+	ErrorMessage(String message) {
+		this.message = message;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+}
\ No newline at end of file

리뷰: 분리하는 방법은 생각안하고 있었는데 재홍님 코드보고 이런방법도 있구나 ! 깨닳았습니다! 감사합니다
@@ -0,0 +1,71 @@
+package christmas.config.message;
+
+import christmas.util.NumberFormatter;
+
+public enum ResultMessage {
+	ORDER_MENU("<주문 메뉴>"),
+	TOTAL_ORDER_AMOUNT_BEFORE_DISCOUNT("<할인 전 총주문 금액>"),
+	GIFT_MENU("<증정 메뉴>"),
+	BENEFIT_DETAILS("<혜택 내역>"),
+	TOTAL_BENEFIT_AMOUNT("<총혜택 금액>"),
+	ESTIMATED_PAYMENT_AFTER_DISCOUNT("<할인 후 예상 결제 금액>"),
+	DECEMBER_EVENT_BADGE("<12월 이벤트 배지>"),
+	NONE("없음"),
+	MONETARY_UNIT("원"),
+	ORDER_MENU_FORMAT("%s %s개"),
+	BENEFIT_FORMAT("%s: -%s원"),
+	TOTAL_BENEFIT_FORMAT("-%s원"),
+	NEW_LINE("\n");
+
+	private final String message;
+
+	ResultMessage(String message) {
+		this.message = message;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+	public static String getOrderMenuFormat(String orderMenuList) {
+		return NEW_LINE.getMessage() + ORDER_MENU.getMessage() + NEW_LINE.getMessage() + orderMenuList;
+	}
+
+	public static String getTotalOrderAmountFormat(int totalOrderAmount) {
+		return TOTAL_ORDER_AMOUNT_BEFORE_DISCOUNT.getMessage() + NEW_LINE.getMessage()
+			+ NumberFormatter.getNumberFormat(totalOrderAmount) + MONETARY_UNIT.getMessage() + NEW_LINE.getMessage();
+	}
+
+	public static String getGiftFormat(String gifts) {
+		return GIFT_MENU.getMessage() + NEW_LINE.getMessage() + gifts + NEW_LINE.getMessage();
+	}
+
+	public static String getTotalBenefitAmountFormat(String totalBenefitAmount) {
+		return TOTAL_BENEFIT_AMOUNT.getMessage() + NEW_LINE.getMessage() + totalBenefitAmount + NEW_LINE.getMessage();
+	}
+
+	public static String getFinalPaymentAmountFormat(int finalPaymentAmount) {
+		return ESTIMATED_PAYMENT_AFTER_DISCOUNT.getMessage() + NEW_LINE.getMessage()
+			+ NumberFormatter.getNumberFormat(finalPaymentAmount) + MONETARY_UNIT.getMessage() + NEW_LINE.getMessage();
+	}
+
+	public static String getBadgeEventFormat(String badge) {
+		return DECEMBER_EVENT_BADGE.getMessage() + NEW_LINE.getMessage() + badge;
+	}
+
+	public static String getOrderMenuFormat(String menuName, int count) {
+		return String.format(ORDER_MENU_FORMAT.getMessage(), menuName, NumberFormatter.getNumberFormat(count)) + NEW_LINE.getMessage();
+	}
+
+	public static String getPresentFormat(String menuName, int count) {
+		return String.format(ORDER_MENU_FORMAT.getMessage(), menuName, NumberFormatter.getNumberFormat(count)) + NEW_LINE.getMessage();
+	}
+
+	public static String getBenefitFormat(String eventName, int discountAmount) {
+		return String.format(BENEFIT_FORMAT.getMessage(), eventName, NumberFormatter.getNumberFormat(discountAmount));
+	}
+
+	public static String getTotalBenefitFormat(int totalBenefitAmount) {
+		return String.format(TOTAL_BENEFIT_FORMAT.getMessage(), NumberFormatter.getNumberFormat(totalBenefitAmount));
+	}
+}
\ No newline at end of file

리뷰: 아.. 그렇군요 같은 의미의 상수도 그렇고 .. 단순 메시지를 관리하는 곳이라고 생각해서 구현을 했는데 조금더 깊게 생각을 해야할 필요가 있군요
@@ -0,0 +1,76 @@
+package christmas.domain;
+
+import static christmas.config.message.ErrorMessage.INVALID_DATE;
+import static christmas.domain.constant.DateConstant.CHRISTMAS_D_DAY_DISCOUNT_END_DATE;
+import static christmas.domain.constant.DateConstant.CHRISTMAS_D_DAY_DISCOUNT_START_DATE;
+import static christmas.domain.constant.DateConstant.MONTH;
+import static christmas.domain.constant.DateConstant.SPECIAL_DAYS;
+import static christmas.domain.constant.DateConstant.WEEKDAYS;
+import static christmas.domain.constant.DateConstant.WEEKEND;
+import static christmas.domain.constant.DateConstant.YEARS;
+
+import christmas.validator.InputValidator;
+import christmas.validator.NumberValidator;
+import java.time.DateTimeException;
+import java.time.LocalDate;
+
+public class VisitDate {
+
+	private final int date;
+
+	public VisitDate(String date) {
+		validate(date);
+
+		this.date = convertToInt(date);
+	}
+
+	private void validate(String date) {
+		if (!NumberValidator.isNumeric(date)) {
+			throw new IllegalArgumentException(INVALID_DATE.getMessage());
+		}
+
+		if (InputValidator.isBlank(date)) {
+			throw new IllegalArgumentException(INVALID_DATE.getMessage());
+		}
+
+		if (!isValidDay(date)) {
+			throw new IllegalArgumentException(INVALID_DATE.getMessage());
+		}
+	}
+
+	private static boolean isValidDay(String date) {
+		try {
+			int day = Integer.parseInt(date);
+			LocalDate.of(YEARS, MONTH, day);
+			return true;
+		} catch (DateTimeException e) {
+			return false;
+		}
+	}
+
+	private int convertToInt(String date) {
+		return Integer.parseInt(date);
+	}
+
+	public boolean isWeekday() {
+		LocalDate day = LocalDate.of(YEARS, MONTH, date);
+		return WEEKDAYS.contains(day.getDayOfWeek());
+	}
+
+	public boolean isWeekend() {
+		LocalDate day = LocalDate.of(YEARS, MONTH, date);
+		return WEEKEND.contains(day.getDayOfWeek());
+	}
+
+	public boolean isSpecialDate() {
+		return SPECIAL_DAYS.contains(date);
+	}
+
+	public boolean isChristmasDdayPeriod() {
+		return CHRISTMAS_D_DAY_DISCOUNT_START_DATE <= date && date <= CHRISTMAS_D_DAY_DISCOUNT_END_DATE;
+	}
+
+	public int getChristmasDiscountAccrueDate() {
+		return date - 1;
+	}
+}
\ No newline at end of file

리뷰: 아 이부분은 제가 놓쳤네요...
@@ -0,0 +1,61 @@
+package christmas.controller;
+
+import christmas.domain.VisitDate;
+import christmas.domain.order.Order;
+import christmas.view.InputView;
+import christmas.view.OutputView;
+import java.util.function.Function;
+
+public class Controller {
+
+	private VisitDate visitDate;
+	private Order order;
+	private final OutputView outputView = new OutputView();
+	private final InputView inputView = new InputView();
+
+	public void run() {
+		askVisitDate();
+
+		askOrderMenu();
+
+		showPreviewBenefit();
+	}
+
+
+	private void askVisitDate() {
+		outputView.askVisitDate();
+
+		String userInput = getValidInput(VisitDate::new);
+
+		visitDate = new VisitDate(userInput);
+	}
+
+	private void askOrderMenu() {
+		outputView.askOrderMenu();
+
+		String userInput = getValidInput(Order::new);
+
+		order = new Order(userInput);
+	}
+
+	private void showPreviewBenefit() {
+		outputView.showBenefit();
+		outputView.showPreviewBenefit(order, visitDate);
+	}
+
+	private <T> String getValidInput(Function<String, T> constructor) {
+		String input;
+
+		do {
+			input = inputView.getUserInput().trim();
+			try {
+				constructor.apply(input);
+			} catch (IllegalArgumentException e) {
+				outputView.printExceptionMessage(e.getMessage());
+				input = null;
+			}
+		} while (input == null);
+
+		return input;
+	}
+}
\ No newline at end of file

리뷰: 말씀들어보니 맞는 말씀이네요! 굳이 한번더 생성하는 과정이 아쉽네요... 리펙토링 과정에서 한번 수정해봐야겠습니다. 고급의견 감사합니다!
@@ -0,0 +1,71 @@
+package christmas.config.message;
+
+import christmas.util.NumberFormatter;
+
+public enum ResultMessage {
+	ORDER_MENU("<주문 메뉴>"),
+	TOTAL_ORDER_AMOUNT_BEFORE_DISCOUNT("<할인 전 총주문 금액>"),
+	GIFT_MENU("<증정 메뉴>"),
+	BENEFIT_DETAILS("<혜택 내역>"),
+	TOTAL_BENEFIT_AMOUNT("<총혜택 금액>"),
+	ESTIMATED_PAYMENT_AFTER_DISCOUNT("<할인 후 예상 결제 금액>"),
+	DECEMBER_EVENT_BADGE("<12월 이벤트 배지>"),
+	NONE("없음"),
+	MONETARY_UNIT("원"),
+	ORDER_MENU_FORMAT("%s %s개"),
+	BENEFIT_FORMAT("%s: -%s원"),
+	TOTAL_BENEFIT_FORMAT("-%s원"),
+	NEW_LINE("\n");
+
+	private final String message;
+
+	ResultMessage(String message) {
+		this.message = message;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+	public static String getOrderMenuFormat(String orderMenuList) {
+		return NEW_LINE.getMessage() + ORDER_MENU.getMessage() + NEW_LINE.getMessage() + orderMenuList;
+	}
+
+	public static String getTotalOrderAmountFormat(int totalOrderAmount) {
+		return TOTAL_ORDER_AMOUNT_BEFORE_DISCOUNT.getMessage() + NEW_LINE.getMessage()
+			+ NumberFormatter.getNumberFormat(totalOrderAmount) + MONETARY_UNIT.getMessage() + NEW_LINE.getMessage();
+	}
+
+	public static String getGiftFormat(String gifts) {
+		return GIFT_MENU.getMessage() + NEW_LINE.getMessage() + gifts + NEW_LINE.getMessage();
+	}
+
+	public static String getTotalBenefitAmountFormat(String totalBenefitAmount) {
+		return TOTAL_BENEFIT_AMOUNT.getMessage() + NEW_LINE.getMessage() + totalBenefitAmount + NEW_LINE.getMessage();
+	}
+
+	public static String getFinalPaymentAmountFormat(int finalPaymentAmount) {
+		return ESTIMATED_PAYMENT_AFTER_DISCOUNT.getMessage() + NEW_LINE.getMessage()
+			+ NumberFormatter.getNumberFormat(finalPaymentAmount) + MONETARY_UNIT.getMessage() + NEW_LINE.getMessage();
+	}
+
+	public static String getBadgeEventFormat(String badge) {
+		return DECEMBER_EVENT_BADGE.getMessage() + NEW_LINE.getMessage() + badge;
+	}
+
+	public static String getOrderMenuFormat(String menuName, int count) {
+		return String.format(ORDER_MENU_FORMAT.getMessage(), menuName, NumberFormatter.getNumberFormat(count)) + NEW_LINE.getMessage();
+	}
+
+	public static String getPresentFormat(String menuName, int count) {
+		return String.format(ORDER_MENU_FORMAT.getMessage(), menuName, NumberFormatter.getNumberFormat(count)) + NEW_LINE.getMessage();
+	}
+
+	public static String getBenefitFormat(String eventName, int discountAmount) {
+		return String.format(BENEFIT_FORMAT.getMessage(), eventName, NumberFormatter.getNumberFormat(discountAmount));
+	}
+
+	public static String getTotalBenefitFormat(int totalBenefitAmount) {
+		return String.format(TOTAL_BENEFIT_FORMAT.getMessage(), NumberFormatter.getNumberFormat(totalBenefitAmount));
+	}
+}
\ No newline at end of file

리뷰: View에서는 단순 출력만 하도록 구현을 했습니다. 정보를 가져오는 것은 View가 아닌 곳에서 가져오는 방법을 생각해서.. 원래 View에서 다 처리를 했었는데 가독성도 않좋고 그래서 enum에서 원하는 값을 반환하도록 구현했습니다!
@@ -0,0 +1,26 @@
+package christmas.domain;
+
+import christmas.config.menu.Appetizer;
+import christmas.config.menu.Beverage;
+import christmas.config.menu.Dessert;
+import christmas.config.menu.MainDish;
+import christmas.config.menu.Menu;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class MenuCategory {
+
+	private final List<Menu> menuCategory = new ArrayList<>();
+
+	public MenuCategory() {
+		menuCategory.addAll(Arrays.asList(Appetizer.values()));
+		menuCategory.addAll(Arrays.asList(Beverage.values()));
+		menuCategory.addAll(Arrays.asList(Dessert.values()));
+		menuCategory.addAll(Arrays.asList(MainDish.values()));
+	}
+
+	public List<Menu> getMenuCategory() {
+		return menuCategory;
+	}
+}
\ No newline at end of file

리뷰: 그것도 좋은 방법인거 같네요! 솔직히 이부분도 조금 수정이 필요하다고 생각하고있었는데 ㅎㅎ 감사합니다
@@ -0,0 +1,58 @@
+package christmas.domain;
+
+import java.util.Map;
+
+public class Bill {
+
+    private int numberOfDessert;
+    private int numberOfMain;
+    private int totalAmount;
+
+    public Bill() {
+        this.numberOfDessert = 0;
+        this.numberOfMain = 0;
+        this.totalAmount = 0;
+    }
+
+    public static Bill getBill() {
+        return new Bill();
+    }
+
+    public void calculate(Map<String, Integer> orderInfo) {
+        for (String menu : orderInfo.keySet()) {
+            this.totalAmount += getPrice(menu, orderInfo) * orderInfo.get(menu);
+        }
+    }
+
+    private int getPrice(String menu, Map<String, Integer> orderInfo) {
+        for (Menu type : Menu.values()) {
+            if (type.getMenuName().contains(menu)) {
+                int index = type.getMenuName().indexOf(menu);
+                checkType(type, menu, orderInfo);
+                return type.getMenuPrice().get(index);
+            }
+        }
+        return 0;
+    }
+
+    private void checkType(Menu type, String menu, Map<String, Integer> orderInfo) {
+        if (type == Menu.DESSERT) {
+            this.numberOfDessert += orderInfo.get(menu);
+        }
+        if (type == Menu.MAIN) {
+            this.numberOfMain += orderInfo.get(menu);
+        }
+    }
+
+    public int getNumberOfDessert() {
+        return numberOfDessert;
+    }
+
+    public int getNumberOfMain() {
+        return numberOfMain;
+    }
+
+    public int getTotalAmount() {
+        return totalAmount;
+    }
+}

리뷰: 3주차 리뷰에서 필드 줄이기를 봤었는데 Bill 클래스에서 이 세가지 필드를 굳이 가지고 가야하나 생각이 들었습니다. 예를 들어서 calculate method에서 return void 대신에 계산한 totalAmount를 return 해줘도 될테니깐요
@@ -0,0 +1,35 @@
+package christmas.domain;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Stream;
+
+public enum Menu {
+
+    APPETIZER(List.of("양송이수프", "타파스", "시저샐러드"), List.of(6000, 5500, 8000)),
+    MAIN(List.of("티본스테이크", "바비큐립", "해산물파스타", "크리스마스파스타"), List.of(55000, 54000, 35000, 25000)),
+    DESSERT(List.of("초코케이크", "아이스크림"), List.of(15000, 5000)),
+    BEVERAGE(List.of("제로콜라", "레드와인", "샴페인"), List.of(3000, 60000, 25000));
+
+    private static final List<String> ALL_MENU = Stream.of(APPETIZER.menuName, MAIN.menuName,
+            DESSERT.menuName, BEVERAGE.menuName).flatMap(Collection::stream).toList();
+    private final List<String> menuName;
+    private final List<Integer> menuPrice;
+
+    Menu(List<String> menuName, List<Integer> menuPrice) {
+        this.menuName = menuName;
+        this.menuPrice = menuPrice;
+    }
+
+    public List<String> getMenuName() {
+        return menuName;
+    }
+
+    public List<Integer> getMenuPrice() {
+        return menuPrice;
+    }
+
+    public static boolean isExistMenu(String menu) {
+        return ALL_MENU.contains(menu);
+    }
+}

리뷰: 메뉴와 금액을 각자 순서대로 따로 저장하는것보다 {양송이수프, 6000} 이런식으로 저장시키는게 더 가독성에 좋지 않을까요 !?
@@ -0,0 +1,25 @@
+package christmas.domain.event.badge;
+
+public class BenefitAmountEvent {
+
+    private static final String STAR_BADGE = "별";
+    private static final String TREE_BADGE = "트리";
+    private static final String SANTA_BADGE = "산타";
+    private static final String NONE = "없음";
+    private static final int STAR_STANDARD_AMOUNT = 5000;
+    private static final int TREE_STANDARD_AMOUNT = 10000;
+    private static final int SANTA_STANDARD_AMOUNT = 20000;
+
+    public String giveBadge(int benefitAmount) {
+        if (benefitAmount < STAR_STANDARD_AMOUNT) {
+            return NONE;
+        }
+        if (benefitAmount < TREE_STANDARD_AMOUNT) {
+            return STAR_BADGE;
+        }
+        if (benefitAmount < SANTA_STANDARD_AMOUNT) {
+            return TREE_BADGE;
+        }
+        return SANTA_BADGE;
+    }
+}

리뷰: 여기서도 {별, 5000}처럼 Badge Type별로 이름과 금액을 한번에 저장해뒀으면 더 좋았을 거 같아요
@@ -0,0 +1,23 @@
+package christmas.domain.event.giveaway;
+
+public class ChampagneEvent implements GiveawayEvent {
+
+    private static final int STANDARD_AMOUNT = 120000;
+    private static final String GIVEAWAY_NAME = "샴페인";
+    private static final int GIVEAWAY_AMOUNT = 25000;
+    private static final int GIVEAWAY_QUANTITY = 1;
+    private static final String NO_GIVEAWAY = "없음";
+    private static final int LESS_THAN_STANDARD_AMOUNT = 0;
+    private static final int NO_QUANTITY = 0;
+
+    public String getChampagneEventName() {
+        return "증정 이벤트";
+    }
+
+    public Giveaway give(int amount) {
+        if (amount >= STANDARD_AMOUNT) {
+            return new Giveaway(GIVEAWAY_NAME, GIVEAWAY_AMOUNT, GIVEAWAY_QUANTITY);
+        }
+        return new Giveaway(NO_GIVEAWAY, LESS_THAN_STANDARD_AMOUNT, NO_QUANTITY);
+    }
+}

리뷰: Menu에서 enum 같은 자료구조(?...)를 사용해서 처리했었다면 champagneEvent내에서 이렇게 static 으로 별도 이름을 다시 생성하지 않아도 해당메뉴를 가져와서 끌어다 사용할 수 있었을 거 같아요
@@ -0,0 +1,63 @@
+package christmas.controller;
+
+import christmas.domain.BenefitDetails;
+import christmas.domain.Bill;
+import christmas.view.InputView;
+import christmas.view.OutputView;
+import java.util.Map;
+
+public class EventController {
+
+    private final InputView inputView;
+    private final OutputView outputView;
+
+    public EventController(InputView inputView, OutputView outputView) {
+        this.inputView = inputView;
+        this.outputView = outputView;
+    }
+
+    public void hold() {
+        int date = getDate();
+        Map<String, Integer> orderInfo = getOrder(date);
+        Bill bill = getBill(orderInfo);
+        BenefitDetails benefitDetails = getBenefitDetails(date, bill);
+        getResult(bill, benefitDetails);
+    }
+
+    private void getResult(Bill bill, BenefitDetails benefitDetails) {
+        int paymentAmount = bill.getTotalAmount() - benefitDetails.getTotalDiscountAmount() +
+                benefitDetails.getGiveaway().price();
+        outputView.printAmountOfPayment(paymentAmount);
+        outputView.printEventBadge(benefitDetails);
+    }
+
+    private BenefitDetails getBenefitDetails(int date, Bill bill) {
+        BenefitDetails benefitDetails = BenefitDetails.getBenefitDetails();
+        benefitDetails.receive(date, bill);
+
+        outputView.printGiveaway(benefitDetails);
+        outputView.printBenefitDetails(benefitDetails);
+        outputView.printTotalDiscountAmount(benefitDetails);
+        return benefitDetails;
+    }
+
+    private Bill getBill(Map<String, Integer> orderInfo) {
+        Bill bill = Bill.getBill();
+        bill.calculate(orderInfo);
+        outputView.printTotalAmount(bill.getTotalAmount());
+        return bill;
+    }
+
+    private Map<String, Integer> getOrder(int date) {
+        outputView.printReadMenu();
+        Map<String, Integer> orderInfo = inputView.readMenu();
+        outputView.printEventPreview(date);
+        outputView.printOrderMenu(orderInfo);
+        return orderInfo;
+    }
+
+    private int getDate() {
+        outputView.printReadDate();
+        return inputView.readDate();
+    }
+}

리뷰: 대부분의 분들이 콘트롤러에서 사용하는 메소드를 get으로 명명하시는군요. 저는 컨트롤러 내부에서 객체를 생성한다는 의미로 create로 사용했는데 이 부분에 대해서 말씀 나누면 좋을거 같습니다!
@@ -0,0 +1,63 @@
+package christmas.controller;
+
+import christmas.domain.BenefitDetails;
+import christmas.domain.Bill;
+import christmas.view.InputView;
+import christmas.view.OutputView;
+import java.util.Map;
+
+public class EventController {
+
+    private final InputView inputView;
+    private final OutputView outputView;
+
+    public EventController(InputView inputView, OutputView outputView) {
+        this.inputView = inputView;
+        this.outputView = outputView;
+    }
+
+    public void hold() {
+        int date = getDate();
+        Map<String, Integer> orderInfo = getOrder(date);
+        Bill bill = getBill(orderInfo);
+        BenefitDetails benefitDetails = getBenefitDetails(date, bill);
+        getResult(bill, benefitDetails);
+    }
+
+    private void getResult(Bill bill, BenefitDetails benefitDetails) {
+        int paymentAmount = bill.getTotalAmount() - benefitDetails.getTotalDiscountAmount() +
+                benefitDetails.getGiveaway().price();
+        outputView.printAmountOfPayment(paymentAmount);
+        outputView.printEventBadge(benefitDetails);
+    }
+
+    private BenefitDetails getBenefitDetails(int date, Bill bill) {
+        BenefitDetails benefitDetails = BenefitDetails.getBenefitDetails();
+        benefitDetails.receive(date, bill);
+
+        outputView.printGiveaway(benefitDetails);
+        outputView.printBenefitDetails(benefitDetails);
+        outputView.printTotalDiscountAmount(benefitDetails);
+        return benefitDetails;
+    }
+
+    private Bill getBill(Map<String, Integer> orderInfo) {
+        Bill bill = Bill.getBill();
+        bill.calculate(orderInfo);
+        outputView.printTotalAmount(bill.getTotalAmount());
+        return bill;
+    }
+
+    private Map<String, Integer> getOrder(int date) {
+        outputView.printReadMenu();
+        Map<String, Integer> orderInfo = inputView.readMenu();
+        outputView.printEventPreview(date);
+        outputView.printOrderMenu(orderInfo);
+        return orderInfo;
+    }
+
+    private int getDate() {
+        outputView.printReadDate();
+        return inputView.readDate();
+    }
+}

리뷰: 메서드를 사용 순서에 따라 배치하시면 가독성 향상에 좀더 도움이 될거같습니다!