@@ -0,0 +1,83 @@
+package christmas.service;
+
+import christmas.constant.Constant;
+import christmas.domain.Badge;
+import christmas.domain.Benefit;
+import christmas.domain.Event;
+import christmas.domain.OrderMenu;
+import christmas.view.input.template.InputCallback;
+import christmas.view.input.template.InputTemplate;
+
+public class ChristmasService {
+
+    private final InputTemplate inputTemplate;
+
+    public ChristmasService() {
+        this.inputTemplate = new InputTemplate();
+    }
+
+    public <T> T getInputRequestResult(InputCallback<T> callback) {
+        return inputTemplate.execute(callback);
+    }
+
+    public Benefit getBenefit(OrderMenu orderMenu, int day) {
+        Benefit benefit = new Benefit();
+        addDiscountIntoBenefitDetails(orderMenu, benefit, day);
+        return benefit;
+    }
+
+    public String getOrderMenuDetails(OrderMenu orderMenu) {
+        return orderMenu.detailsToString();
+    }
+
+    public String getTotalPriceBeforeDiscount(OrderMenu orderMenu) {
+        return String.format(Constant.PRICE_UNIT + System.lineSeparator(), orderMenu.calculateTotalPrice());
+    }
+
+    public String getPresentationMenu(Benefit benefit) {
+        return benefit.presentationMenuToString();
+    }
+
+    public String getBenefitDetails(Benefit benefit) {
+        return benefit.detailsToString();
+    }
+
+    public String getTotalDiscount(Benefit benefit) {
+        return String.format(Constant.PRICE_UNIT + System.lineSeparator(), benefit.calculateTotalDiscount());
+    }
+
+    public String getTotalPriceAfterDiscount(OrderMenu orderMenu, Benefit benefit) {
+        int totalPrice = orderMenu.calculateTotalPrice();
+        int totalDiscount = benefit.calculateTotalDiscount();
+        totalPrice += (totalDiscount - benefit.calculatePresentationPrice());
+        return String.format(Constant.PRICE_UNIT + System.lineSeparator(), totalPrice);
+    }
+
+    public String getBadge(Benefit benefit) {
+        return Badge.findByTotalDiscount(benefit.calculateTotalDiscount());
+    }
+
+
+    private void addDiscountIntoBenefitDetails(OrderMenu orderMenu, Benefit benefit, int day) {
+        Event.findAllByDay(day)
+                .stream()
+                .filter(event -> orderMenu.calculateTotalPrice() > event.getCondition())
+                .forEach(event -> benefit.addDiscountIntoDetails(event, calculateDiscount(orderMenu, event, day)));
+    }
+
+    private int calculateDiscount(OrderMenu orderMenu, Event event, int day) {
+        int result = 0;
+        int orderMenuCount = orderMenu.countMenuByEventTarget(event.getTarget());
+        int discount = event.getDiscount();
+        int discountFromTotal = event.getDiscountFromTotal();
+        result -= (discount * orderMenuCount) + discountFromTotal;
+
+        if (event == Event.CHRISTMAS && day <= 25) {
+            result -= discount * (day - 1) + 1000;
+        }
+        if (event == Event.PRESENTATION) {
+            result -= discount;
+        }
+        return result;
+    }
+}

리뷰: > 위에서 inputView의 메소드를 넘겨받고 실행하는 모습이던데, 그냥 ChristmasController에서 진행하는 게 좋았을 것 같아요. 굳이 서비스까지 걸칠 필요가 없었을 것 같아요. 서비스 객체 내에서 해당 메소드가 쓰인 것도 아니고, 오로지 컨트롤러에서만 이 메소드가 호출되고 있어요.

저 메서드는 말씀하신대로 Controller에 있어도 무방하긴 합니다 :) 
하지만 Controller가 View, Service외에 다른 객체에 의존하지 않게끔 InputTemplate를 Service에 둔거였습니다!