@@ -0,0 +1,88 @@
+package christmas.controller;
+
+import christmas.domain.Badge;
+import christmas.domain.day.Day;
+import christmas.domain.order.OrderSheet;
+import christmas.domain.Price;
+import christmas.domain.event.TotalEventResult;
+import christmas.domain.event.discount.DiscountEventManager;
+import christmas.domain.event.discount.DiscountResult;
+import christmas.domain.event.present.PresentEventManager;
+import christmas.domain.event.present.PresentResult;
+import christmas.dto.BadgeDTO;
+import christmas.dto.PriceDTO;
+import christmas.view.InputView;
+import christmas.view.OutputView;
+
+import java.util.Map;
+
+public class PromotionController {
+    private final InputView inputView;
+    private final OutputView outputView;
+
+    public PromotionController(InputView inputView, OutputView outputView) {
+        this.inputView = inputView;
+        this.outputView = outputView;
+    }
+
+    public void run() {
+        outputView.printStart();
+        Day orderDay = getOrderDay();
+        OrderSheet orderSheet = getOrderSheet();
+        printPreview(orderDay, orderSheet);
+    }
+
+    private Day getOrderDay() {
+        boolean isInValidInput = true;
+        Day orderDay = null;
+        while (isInValidInput) {
+            try {
+                int dayNumber = inputView.readDate();
+                orderDay = new Day(dayNumber);
+                isInValidInput = false;
+            } catch (IllegalArgumentException e) {
+                outputView.printErrorMessage(e.getMessage());
+            }
+        }
+        return orderDay;
+    }
+
+    private OrderSheet getOrderSheet() {
+        boolean isInValidInput = true;
+        OrderSheet orderSheet = null;
+        while (isInValidInput) {
+            try {
+                Map<String, Integer> orderMenus = inputView.readMenu();
+                orderSheet = new OrderSheet(orderMenus);
+                isInValidInput = false;
+            } catch (IllegalArgumentException e) {
+                outputView.printErrorMessage(e.getMessage());
+            }
+        }
+        return orderSheet;
+    }
+
+    private void printPreview(Day orderDay, OrderSheet orderSheet) {
+        printBeforeEvent(orderSheet);
+        printAfterEvent(orderDay, orderSheet);
+    }
+
+    private void printBeforeEvent(OrderSheet orderSheet) {
+        outputView.printPreviewStart();
+        outputView.printOrderSheet(orderSheet.getOrderSheet());
+        outputView.printTotalPriceBeforeDiscount(PriceDTO.from(orderSheet.getTotalPrice()));
+    }
+
+    private void printAfterEvent(Day orderDay, OrderSheet orderSheet) {
+        DiscountResult discountResult = DiscountEventManager.getDiscountResult(orderDay, orderSheet);
+        PresentResult presentResult = PresentEventManager.getPresentResult(orderSheet);
+        outputView.printPresents(presentResult.getPresents());
+        outputView.printEvents(discountResult.getDiscountResults(), PriceDTO.from(presentResult.getTotalPresentPrice()));
+
+        TotalEventResult totalEventResult = new TotalEventResult(discountResult, presentResult);
+        outputView.printTotalDiscountPrice(totalEventResult.getDiscountPrice());
+        outputView.printTotalDiscountedPrice(totalEventResult.getDiscountedPrice(orderSheet.getTotalPrice()));
+        BadgeDTO badge = totalEventResult.getBadge();
+        outputView.printBadge(badge);
+    }
+}

리뷰: 이런 꿀팁 고맙습니다. 저도 Intellij를 사용하고 있는데 매번 리팩토링할 때마다 필요가 없는 `import`를 놓치곤 했습니다.
공유해주신 포스트 보고 방금 적용했습니다. 
그리고 제 코드를 직접 받으셔서 리뷰를 하신 노고에 감사드립니다.

끝으로 4주차 미션이 public으로 변경되었지만 pull request가 없는 것을 보았습니다. 리뷰 용 pull request 날리시면 리뷰하러 가겠습니다