@@ -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;
+    }
+}

리뷰: > 이런 자명한 코드들은 메소드로 분리할 필요가 없어요. 서비스 객체까지 이용할 필요는 더더욱 없어요.

이 부분도 Controller에서 바로 호출할지 고민했던 부분입니다. Controller에 Model(도메인)에 관련된 코드가 있어도 되긴하지만 Service만 의존하게끔 하고싶었거든요! 근데 말씀하신대로 이런 자명한 코드들은 불필요하긴 하네요.. 고민을 한번 해봐야겠습니다 ㅠ