@@ -0,0 +1,76 @@
+package christmas.controller;
+
+import christmas.domain.Badge;
+import christmas.domain.Benefits;
+import christmas.domain.Convertor;
+import christmas.domain.Date;
+import christmas.domain.EventManager;
+import christmas.domain.Orders;
+import christmas.view.InputView;
+import christmas.view.OutputView;
+
+public class EventController {
+    public void start() {
+        OutputView.printWelcome();
+        Date date = createDate();
+        Orders orders = createOrders();
+        int totalOrderAmount = createTotalOrderAmount(orders);
+        OutputView.printGift(orders.hasGift());
+        Benefits benefits = createBenefits(orders, date);
+        int totalBenefitAmount = createTotalBenefitAmount(benefits);
+        createPaymentAmount(orders, totalOrderAmount, totalBenefitAmount);
+        createBadge(benefits, totalBenefitAmount);
+    }
+
+    private Date createDate() {
+        while (true) {
+            try {
+                Date date = new Date(InputView.readDate());
+                OutputView.printPreview(date);
+                return date;
+            } catch (IllegalArgumentException e) {
+                OutputView.printError(e);
+            }
+        }
+    }
+
+    private Orders createOrders() {
+        while (true) {
+            try {
+                Orders orders = Convertor.toOrders(InputView.readOrder());
+                OutputView.printOrders(orders);
+                return orders;
+            } catch (IllegalArgumentException e) {
+                OutputView.printError(e);
+            }
+        }
+    }
+
+    private int createTotalOrderAmount(Orders orders) {
+        int totalOrderAmount = orders.calculateTotalAmount();
+        OutputView.printTotalOrderAmount(totalOrderAmount);
+        return totalOrderAmount;
+    }
+
+    private Benefits createBenefits(Orders orders, Date date) {
+        Benefits benefits = EventManager.toBenefits(orders, date);
+        OutputView.printBenefitDetail(benefits);
+        return benefits;
+    }
+
+    private int createTotalBenefitAmount(Benefits benefits) {
+        int totalBenefitAmount = benefits.calculateTotalBenefitAmount();
+        OutputView.printTotalBenefitAmount(totalBenefitAmount);
+        return totalBenefitAmount;
+    }
+
+    private void createPaymentAmount(Orders orders, int totalOrderAmount, int totalBenefitAmount) {
+        int paymentAmount = orders.calculatePaymentAmount(totalOrderAmount, totalBenefitAmount);
+        OutputView.printPaymentAmount(paymentAmount);
+    }
+
+    private void createBadge(Benefits benefits, int totalBenefitAmount) {
+        Badge badge = benefits.toEventBadge(totalBenefitAmount);
+        OutputView.printEventBadge(badge);
+    }
+}

리뷰: ![스크린샷 2023-11-17 오전 10 16 39](https://github.com/parksangchu/java-christmas-6-parksangchu/assets/112257466/f75ebc13-0ec4-4cf1-976c-766f1db54275)

상추님께서 리뷰 주셨던 내용에 대해서, 한번 여쭙고 싶은 부분이 생겨 여기에도 글을 남겨봅니다.

1. 컨트롤러가 전체 비즈니스 로직을 관할하고 있어요.
`컨트롤러 Layer 단위테스트 = 통합테스트`의 역할을 수행할 것 같은데, 컨트롤러의 분리가 필요하지 않을까요?

1-1. 컨트롤러의 분리가 필요하다고 판단되면, EventController(Main의 기능)가 다른 컨트롤러를 의존하게 되는데
컨트롤러는 View와 Domain을 연결하는 역할인데, 컨트롤러간 호출이 잦아질 것 같아요.

1-2. EventController에서 모든 로직을 호출하는 것과, Application.main에서 모든 로직을 호출하는 것
어떤 차이가 있을까요?