@@ -0,0 +1,126 @@
+package christmas.controller;
+
+import christmas.domain.customer.CustomerInfo;
+import christmas.domain.customer.VisitDate;
+import christmas.domain.order.Orders;
+import christmas.service.EventService;
+import christmas.service.RestaurantService;
+import christmas.view.InputView;
+import christmas.view.OutputView;
+
+import java.util.Collections;
+
+public class RestaurantController {
+    private final InputView inputView;
+    private final OutputView outputView;
+    private final RestaurantService restaurantService;
+    private EventService eventService;
+
+    private RestaurantController(InputView inputView, OutputView outputView, RestaurantService restaurantService) {
+        this.inputView = inputView;
+        this.outputView = outputView;
+        this.restaurantService = restaurantService;
+    }
+
+    public static RestaurantController of(InputView inputView, OutputView outputView, RestaurantService restaurantService) {
+        return new RestaurantController(inputView, outputView, restaurantService);
+    }
+
+    public void run() {
+        inputView.printInitialMessage();
+        createCustomerInfo();
+        eventService = EventService.of(
+                getCustomerInfoFromRestaurantService()
+        );
+        applyDiscount();
+        printApplyEvent();
+    }
+
+    public void createCustomerInfo() {
+        restaurantService.createCustomerInfo(createVisitDate(), createOrdersFromMenuAndNum());
+    }
+
+    private VisitDate createVisitDate() {
+        while (true) {
+            try {
+                return restaurantService.createVisitDate(Integer.parseInt(inputView.readVisitDate()));
+            } catch (IllegalArgumentException e) {
+                outputView.printErrorMessage(e);
+            }
+        }
+    }
+
+    private Orders createOrdersFromMenuAndNum() {
+        while (true) {
+            try {
+                String inputMenuAndNum = inputView.readMenuAndNum();
+                return restaurantService.processCreateOrders(inputMenuAndNum);
+            } catch (IllegalArgumentException e) {
+                outputView.printErrorMessage(e);
+            }
+        }
+    }
+
+    private CustomerInfo getCustomerInfoFromRestaurantService() {
+        return restaurantService.getCustomerInfo();
+    }
+
+    public void applyDiscount() {
+        eventService.applyDiscount();
+    }
+
+    public void printApplyEvent() {
+        printPreviewMessage();
+        printOrders();
+        printTotalOrderAmountWithoutDiscount();
+        printGiveawayMenu();
+        printBenefits();
+        printTotalBenefitAmount();
+        printExpectedPaymentAmount();
+        printEventBadge();
+    }
+
+    private void printPreviewMessage() {
+        outputView.printBenefitPreview();
+    }
+
+    private void printOrders() {
+        outputView.printOrders(eventService.getOrderList());
+    }
+
+    private void printTotalOrderAmountWithoutDiscount() {
+        outputView.printTotalOrderAmountWithoutDiscount(eventService.getTotalOrderAmount());
+    }
+
+    private void printGiveawayMenu() {
+        outputView.printGiveawayMenu(eventService.getGiveaway());
+    }
+
+    private void printTotalBenefitAmount() {
+        outputView.printTotalBenefitAmount(eventService.getTotalBenefitAmount());
+    }
+
+    private void printBenefits() {
+        if (eventService.getBenefits().size() == 0) {
+            outputView.printBenefits(Collections.emptyMap());
+            return;
+        }
+        outputView.printBenefits(eventService.getBenefits());
+    }
+
+    private void printExpectedPaymentAmount() {
+        outputView.printExpectedPaymentAmount(
+                expectedPaymentAmount(
+                        eventService.getTotalOrderAmount(),
+                        eventService.getTotalDiscountAmount()
+                ));
+    }
+
+    private int expectedPaymentAmount(int orderAmount, int benefitAmount) {
+        return orderAmount + benefitAmount;
+    }
+
+    private void printEventBadge() {
+        outputView.printEventBadge(eventService.getBadge());
+    }
+}

리뷰: 프로그램의 전체 흐름을 나타내는 메서드인데 어떤 식으로 분리하는게 좋을까요....?
저는 일단 프로그램이 돌아가긴 해야하니 하나의 메서드에선 프로그램 전체의 흐름에 대해 다뤄야 한다고 생각했거든요!
지금 보니 EventService객체의 생성을 메서드로 따로 빼는것도 좋았을거같네요