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

리뷰: > 할인액을 계산하는 로직이 외부로 노출되어 있어요. enum을 활용하셨으니 잘 다듬으면 이렇게 바꿀 수 있어요.
> 
> 이러면 메소드로 분리할 필요도 없어지고 좋아요. 이벤트 enum마다 람다식을 작성해서 혜택액을 계산해보세요.

enum에 람다식이 요소로 들어갈 수 있다는걸 클라우드님 코드 보고 알았습니다! 만약 enum 상수들이 할인금액을 계산할 수 있는 람다식을 갖고 있으면 if를 두번 사용할 일도 없겠네요! 말씀해주신 힌트로 리팩토링 한 번 진행해볼게요! 감사합니다 ㅎㅎ