@@ -0,0 +1,152 @@
+package christmas.domain;
+
+import christmas.domain.constants.Badge;
+import christmas.domain.constants.Gift;
+import christmas.domain.constants.event.EventDiscount;
+import christmas.domain.constants.event.EventValue;
+import christmas.domain.constants.menu.MenuGroup;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Event {
+    private final Map<EventDiscount, Integer> eventDiscountGroup;
+    private final Map<Gift, Integer> gifts;
+
+    public Event() {
+        this.eventDiscountGroup = initEventDiscounts();
+        this.gifts = initGifts();
+    }
+
+    private Map<EventDiscount, Integer> initEventDiscounts() {
+        Map<EventDiscount, Integer> result = new HashMap<>();
+        Arrays.stream(EventDiscount.values())
+                .forEach(rank -> result.put(rank, 0));
+        return result;
+    }
+
+    private Map<Gift, Integer> initGifts() {
+        return new HashMap<>();
+    }
+
+    public void eventSetting(VisitDate visitDate, EventCalendar eventCalendar, StarDate starDate, Menu menu) {
+        if (menu.getTotalMenuPrice() >= EventValue.ORDER_MIN_PRICE.getValue()) {
+            giftSetting(visitDate, eventCalendar, menu);
+            eventDiscountSetting(visitDate, eventCalendar, starDate, menu);
+        }
+    }
+
+    public void eventDiscountSetting(VisitDate visitDate, EventCalendar eventCalendar, StarDate starDate, Menu menu) {
+        weekdayDiscountSetting(visitDate, eventCalendar, menu);
+        weekendDiscountSetting(visitDate, eventCalendar, menu);
+        christmasDDayDiscountSetting(visitDate, eventCalendar);
+        specialDiscountSetting(visitDate, starDate);
+        eventDiscountGroupAddGift();
+    }
+
+    public void giftSetting(VisitDate visitDate, EventCalendar eventCalendar, Menu menu) {
+        if (isVisitDateAllDateEvent(visitDate, eventCalendar)) {
+            Arrays.stream(Gift.values())
+                    .filter(gift -> gift.isGiftApplicable(menu.getTotalMenuPrice()))
+                    .filter(Gift::getGift)
+                    .forEach(gift -> gifts.put(gift, gift.getCount() * gift.getPrice()));
+        }
+    }
+
+    public void eventDiscountGroupAddGift() {
+        this.gifts.forEach((key, value) -> this.eventDiscountGroup.put(
+                EventDiscount.GIFT,
+                this.eventDiscountGroup.getOrDefault(EventDiscount.GIFT, 0) + value
+        ));
+    }
+
+    public void weekdayDiscountSetting(VisitDate visitDate, EventCalendar eventCalendar, Menu menu) {
+        if (!visitDate.isWeekend(eventCalendar) && isVisitDateAllDateEvent(visitDate, eventCalendar)) {
+            this.eventDiscountGroup.put(EventDiscount.WEEKDAY,
+                    this.eventDiscountGroup.getOrDefault(
+                            EventDiscount.WEEKDAY, 0) +
+                            menu.categoryMenuCount(MenuGroup.DESSERT) * EventDiscount.WEEKDAY.getDiscount()
+            );
+        }
+    }
+
+    public void weekendDiscountSetting(VisitDate visitDate, EventCalendar eventCalendar, Menu menu) {
+        if (visitDate.isWeekend(eventCalendar) && isVisitDateAllDateEvent(visitDate, eventCalendar)) {
+            this.eventDiscountGroup.put(EventDiscount.WEEKEND,
+                    this.eventDiscountGroup.getOrDefault(
+                            EventDiscount.WEEKEND, 0) +
+                            menu.categoryMenuCount(MenuGroup.MAIN) * EventDiscount.WEEKEND.getDiscount());
+        }
+    }
+
+    public void christmasDDayDiscountSetting(VisitDate visitDate, EventCalendar eventCalendar) {
+        if (isVisitDateChristmasDDay(visitDate, eventCalendar)) {
+            this.eventDiscountGroup.put(EventDiscount.CHRISTMAS,
+                    this.eventDiscountGroup.getOrDefault(
+                            EventDiscount.CHRISTMAS, 0) + christmasDDayCalculate(visitDate)
+            );
+        }
+    }
+
+    public void specialDiscountSetting(VisitDate visitDate, StarDate starDate) {
+        if (visitDate.containsStarDate(starDate)) {
+            this.eventDiscountGroup.put(EventDiscount.SPECIAL,
+                    this.eventDiscountGroup.getOrDefault(
+                            EventDiscount.SPECIAL, 0) + EventDiscount.SPECIAL.getDiscount()
+            );
+        }
+    }
+
+    public int christmasDDayCalculate(VisitDate visitDate) {
+        return EventDiscount.CHRISTMAS.getDiscount() +
+                (EventValue.CHRISTMAS_ON_THE_RISE_FORM_DAY.getValue() *
+                        visitDate.christmasDDayCalculate());
+    }
+
+    public int getTotalGiftAmount() {
+        return this.gifts.values()
+                .stream()
+                .mapToInt(amount -> amount)
+                .sum();
+    }
+
+    public int getTotalEventDiscount() {
+        return this.eventDiscountGroup.entrySet()
+                .stream()
+                .filter(entry -> entry.getKey() != EventDiscount.GIFT)
+                .mapToInt(Map.Entry::getValue)
+                .sum();
+    }
+
+    public int getTotalBenefitsAmount() {
+        return this.eventDiscountGroup.values()
+                .stream()
+                .mapToInt(amount -> amount)
+                .sum();
+    }
+
+    public Badge getBadge() {
+        return Arrays.stream(Badge.values())
+                .filter(badge -> badge.getWhichBadgeFromAmount(getTotalBenefitsAmount()))
+                .findFirst()
+                .orElse(Badge.NONE);
+    }
+
+    public boolean isVisitDateChristmasDDay(VisitDate visitDate, EventCalendar eventCalendar) {
+        return visitDate.isChristmasDDay(eventCalendar);
+    }
+
+    public boolean isVisitDateAllDateEvent(VisitDate visitDate, EventCalendar eventCalendar) {
+        return visitDate.containsAllDay(eventCalendar);
+    }
+
+    public Map<EventDiscount, Integer> getEventDiscountGroup() {
+        return Collections.unmodifiableMap(eventDiscountGroup);
+    }
+
+    public Map<Gift, Integer> getGifts() {
+        return Collections.unmodifiableMap(gifts);
+    }
+}

리뷰: 개인적으로 `Event` 클래스가 너무 많은 책임을 가지고 있다고 생각합니다. 

현재 `Event` 클래스는 

1. 방문하는 날짜와 매뉴를 가지고 존재하는 4개의 이벤트들에 해당하는지 여부 판별
2. 각종 할인금액 계산 
3. 사용자의 방문에 따른 이벤트 결과객체 생성
4. 증정품 정보 추가
5. 할인 금액에 따른 배지 정보 추가

의 기능들을 하고 있는것으로 보입니다. 물론 하나의 클래스에 많은 기능을 넣으면 봐야할 클래스들이 상대적으로 적어지기 때문에 편할 수도 있지만 추후 Event 의 요구사항이 바뀌거나 할 경우 손봐야할 부분이 많아질것 같습니다. 코드 자체도 150 줄에 달하고 있어서 역할과 책임의 분리를 고려하시는게 좋을 것 같습니다!