ewhk9887/korean_code_reviews_from_github huggingface dataset:
@@ -0,0 +1,55 @@
+package christmas.domain.event;
+
+import christmas.domain.calendar.Date;
+import christmas.domain.calendar.Order;
+import christmas.domain.menu.Menu;
+import christmas.domain.menu.MenuType;
+
+public final class FreeGiftEvent implements Event {
+
+    private static final int CHRISTMAS_EVENT_MONTH = 12;
+    private static final int CHRISTMAS_EVENT_MIN_DAY = 1;
+    private static final int CHRISTMAS_EVENT_MAX_DAY = 31;
+    private static final int CHRISTMAS_EVENT_FREE_STANDARD = 120_000;
+    private static final String CHRISTMAS_EVENT_FREE_QUANTITY = "1";
+    private static final String FREE_GIFT_EVENT_TITLE = "증정 이벤트";
+    private Menu benefitGift = new Menu(MenuType.EMPTY.getTitle(), CHRISTMAS_EVENT_FREE_QUANTITY);
+    private int benefit;
+
+    @Override
+    public boolean isApplicable(Date date) {
+        return isEventPeriod(date);
+    }
+
+    private static boolean isEventPeriod(Date date) {
+        return date.getMonth() == CHRISTMAS_EVENT_MONTH &&
+                date.getDay() >= CHRISTMAS_EVENT_MIN_DAY
+                && date.getDay() <= CHRISTMAS_EVENT_MAX_DAY;
+    }
+
+    @Override
+    public int calculateDiscount(Date date, Order order) {
+        int beforeMoney = order.getBeforeMoney();
+        if (beforeMoney >= CHRISTMAS_EVENT_FREE_STANDARD) {
+            MenuType champagne = MenuType.CHAMPAGNE;
+            benefitGift = new Menu(champagne.getTitle(), CHRISTMAS_EVENT_FREE_QUANTITY);
+            benefit = champagne.getPrice();
+        }
+        return benefit;
+    }
+
+    public Menu getBenefitGift() {
+        return benefitGift;
+    }
+
+    @Override
+    public int getBenefit() {
+        return benefit;
+    }
+
+    @Override
+    public String getEventName() {
+        return FREE_GIFT_EVENT_TITLE;
+    }
+
+}

리뷰: 이 부분은 인터페이스 구현체가 모두 동일한 로직을 갖기 때문에 Event를 추상클래스로 관리하면 코드 중복을 제거할 수 있어 더 좋을 것 같습니다!
@@ -0,0 +1,65 @@
+package christmas.domain.calendar;
+
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.format.TextStyle;
+import java.util.Locale;
+
+public class Date {
+    private static final int VISIT_YEAR = 2023;
+    private static final int VISIT_MONTH = 12;
+    private Year year;
+    private Month month;
+    private Day day;
+    private String dayFormat;
+
+    public Date(int day) {
+        this.year = new Year(VISIT_YEAR);
+        this.month = new Month(VISIT_MONTH);
+        this.day = new Day(day);
+        this.dayFormat = createVisitingDayFormat();
+    }
+
+    public String createVisitingDayFormat() {
+        LocalDate visitDay = createDateTimeFormat();
+        DayOfWeek dayOfWeek = visitDay.getDayOfWeek();
+        return dayOfWeek.getDisplayName(TextStyle.FULL, Locale.KOREA);
+    }
+
+    public boolean isWeekend() {
+        LocalDate visitDay = createDateTimeFormat();
+        DayOfWeek dayOfWeek = visitDay.getDayOfWeek();
+        return dayOfWeek == DayOfWeek.FRIDAY || dayOfWeek == DayOfWeek.SATURDAY;
+    }
+
+    public boolean isSunday() {
+        LocalDate visitDay = createDateTimeFormat();
+        DayOfWeek dayOfWeek = visitDay.getDayOfWeek();
+        return dayOfWeek == DayOfWeek.SUNDAY;
+    }
+
+    public LocalDate createDateTimeFormat() {
+        return LocalDate.of(getYear(), getMonth(), getDay());
+    }
+
+    @Override
+    public String toString() {
+        return String.format("%s월 %s일", month.month(), day.day());
+    }
+
+    public int getYear() {
+        return year.year();
+    }
+
+    public int getMonth() {
+        return month.month();
+    }
+
+    public int getDay() {
+        return day.day();
+    }
+
+    public String getDayFormat() {
+        return dayFormat;
+    }
+}

리뷰: 저도 한수 배우고갑니다 저는 그냥 이벤트가 12월 한정이라서 그냥 나머지연산으로 했는데.. 반성합니다!
@@ -0,0 +1,55 @@
+package christmas.domain.event;
+
+import christmas.domain.calendar.Date;
+import christmas.domain.calendar.Order;
+import christmas.domain.menu.Menu;
+import christmas.domain.menu.MenuType;
+
+public final class FreeGiftEvent implements Event {
+
+    private static final int CHRISTMAS_EVENT_MONTH = 12;
+    private static final int CHRISTMAS_EVENT_MIN_DAY = 1;
+    private static final int CHRISTMAS_EVENT_MAX_DAY = 31;
+    private static final int CHRISTMAS_EVENT_FREE_STANDARD = 120_000;
+    private static final String CHRISTMAS_EVENT_FREE_QUANTITY = "1";
+    private static final String FREE_GIFT_EVENT_TITLE = "증정 이벤트";
+    private Menu benefitGift = new Menu(MenuType.EMPTY.getTitle(), CHRISTMAS_EVENT_FREE_QUANTITY);
+    private int benefit;
+
+    @Override
+    public boolean isApplicable(Date date) {
+        return isEventPeriod(date);
+    }
+
+    private static boolean isEventPeriod(Date date) {
+        return date.getMonth() == CHRISTMAS_EVENT_MONTH &&
+                date.getDay() >= CHRISTMAS_EVENT_MIN_DAY
+                && date.getDay() <= CHRISTMAS_EVENT_MAX_DAY;
+    }
+
+    @Override
+    public int calculateDiscount(Date date, Order order) {
+        int beforeMoney = order.getBeforeMoney();
+        if (beforeMoney >= CHRISTMAS_EVENT_FREE_STANDARD) {
+            MenuType champagne = MenuType.CHAMPAGNE;
+            benefitGift = new Menu(champagne.getTitle(), CHRISTMAS_EVENT_FREE_QUANTITY);
+            benefit = champagne.getPrice();
+        }
+        return benefit;
+    }
+
+    public Menu getBenefitGift() {
+        return benefitGift;
+    }
+
+    @Override
+    public int getBenefit() {
+        return benefit;
+    }
+
+    @Override
+    public String getEventName() {
+        return FREE_GIFT_EVENT_TITLE;
+    }
+
+}

리뷰: 저도 처음에 이렇게 했는데 요구사항을 읽어보니 증정이벤트에는 할인이라는 개념이 없어서 저는 혜택금액계산으로 바꿨어요..!
@@ -0,0 +1,51 @@
+package christmas.domain.menu;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public enum MenuGroup {
+    APPETIZER("에피타이저", Arrays.asList(MenuType.BUTTON_MUSHROOM_SOUP, MenuType.TAPAS, MenuType.CAESAR_SALAD)),
+    MAIN("메인", Arrays.asList(MenuType.T_BONE_STEAK, MenuType.BARBECUE_RIBS, MenuType.SEAFOOD_PASTA,
+            MenuType.CHRISTMAS_PASTA)),
+    DESSERT("디저트", Arrays.asList(MenuType.CHOCOLATE_CAKE, MenuType.ICE_CREAM)),
+    BEVERAGE("음료", Arrays.asList(MenuType.ZERO_COLA, MenuType.RED_WINE, MenuType.CHAMPAGNE)),
+    EMPTY("없음", Collections.EMPTY_LIST);
+
+    private final String title;
+    private final List<MenuType> menuList;
+
+    MenuGroup(String title, List<MenuType> menuList) {
+        this.title = title;
+        this.menuList = menuList;
+    }
+
+    public static MenuGroup findByMenuType(MenuType menuType) {
+        return Arrays.stream(MenuGroup.values())
+                .filter(menuGroup -> menuGroup.hasMenuName(menuType))
+                .findAny()
+                .orElse(EMPTY);
+    }
+
+    private boolean hasMenuName(MenuType menuType) {
+        return menuList.stream()
+                .anyMatch(menu -> menu == menuType);
+    }
+
+    @Override
+    public String toString() {
+        return "<" + title + ">\n" +
+                menuList.stream()
+                        .map(MenuType::toString)
+                        .collect(Collectors.joining(", "));
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public List<MenuType> getMenuList() {
+        return menuList;
+    }
+}

리뷰: 오 이런식으로 메뉴를 상수처리하셨군요  리스트로 담는 방법도 있네요!
@@ -0,0 +1,53 @@
+package christmas.domain.event;
+
+import christmas.domain.calendar.Date;
+import christmas.domain.calendar.Order;
+import christmas.domain.menu.MenuGroup;
+import christmas.domain.menu.MenuType;
+
+public final class WeekdayDiscountEvent implements Event {
+
+    private static final int CHRISTMAS_EVENT_MONTH = 12;
+    private static final int CHRISTMAS_EVENT_MIN_DAY = 1;
+    private static final int CHRISTMAS_EVENT_MAX_DAY = 31;
+    private static final int CHRISTMAS_EVENT_DESERT_DISCOUNT = 2_023;
+    private static final String WEEKDAY_DISCOUNT_EVENT_TITLE = "평일 할인";
+    private int benefit;
+
+    @Override
+    public boolean isApplicable(Date date) {
+        return isEventPeriod(date) && !date.isWeekend();
+    }
+
+    private static boolean isEventPeriod(Date date) {
+        return date.getMonth() == CHRISTMAS_EVENT_MONTH &&
+                date.getDay() >= CHRISTMAS_EVENT_MIN_DAY
+                && date.getDay() <= CHRISTMAS_EVENT_MAX_DAY;
+    }
+
+    @Override
+    public int calculateDiscount(Date date, Order order) {
+        benefit = order.getMenus().menuList().stream()
+                .mapToInt(menu -> {
+                    MenuType menuType = MenuType.findByMenuName(menu.getMenuName());
+                    MenuGroup menuGroup = MenuGroup.findByMenuType(menuType);
+                    int menuQuantity = menu.getMenuQuantity();
+                    if (menuGroup == MenuGroup.DESSERT) {
+                        return CHRISTMAS_EVENT_DESERT_DISCOUNT * menuQuantity;
+                    }
+                    return 0;
+                })
+                .sum();
+        return benefit;
+    }
+
+    @Override
+    public int getBenefit() {
+        return benefit;
+    }
+
+    @Override
+    public String getEventName() {
+        return WEEKDAY_DISCOUNT_EVENT_TITLE;
+    }
+}

리뷰: 크리스마스 평일 이벤트가 요구 사항에 따라 변경이 되는 기간이라
12월에 대한 상수처리로 기간을 표현했습니다 !
@@ -0,0 +1,55 @@
+package christmas.domain.event;
+
+import christmas.domain.calendar.Date;
+import christmas.domain.calendar.Order;
+import christmas.domain.menu.Menu;
+import christmas.domain.menu.MenuType;
+
+public final class FreeGiftEvent implements Event {
+
+    private static final int CHRISTMAS_EVENT_MONTH = 12;
+    private static final int CHRISTMAS_EVENT_MIN_DAY = 1;
+    private static final int CHRISTMAS_EVENT_MAX_DAY = 31;
+    private static final int CHRISTMAS_EVENT_FREE_STANDARD = 120_000;
+    private static final String CHRISTMAS_EVENT_FREE_QUANTITY = "1";
+    private static final String FREE_GIFT_EVENT_TITLE = "증정 이벤트";
+    private Menu benefitGift = new Menu(MenuType.EMPTY.getTitle(), CHRISTMAS_EVENT_FREE_QUANTITY);
+    private int benefit;
+
+    @Override
+    public boolean isApplicable(Date date) {
+        return isEventPeriod(date);
+    }
+
+    private static boolean isEventPeriod(Date date) {
+        return date.getMonth() == CHRISTMAS_EVENT_MONTH &&
+                date.getDay() >= CHRISTMAS_EVENT_MIN_DAY
+                && date.getDay() <= CHRISTMAS_EVENT_MAX_DAY;
+    }
+
+    @Override
+    public int calculateDiscount(Date date, Order order) {
+        int beforeMoney = order.getBeforeMoney();
+        if (beforeMoney >= CHRISTMAS_EVENT_FREE_STANDARD) {
+            MenuType champagne = MenuType.CHAMPAGNE;
+            benefitGift = new Menu(champagne.getTitle(), CHRISTMAS_EVENT_FREE_QUANTITY);
+            benefit = champagne.getPrice();
+        }
+        return benefit;
+    }
+
+    public Menu getBenefitGift() {
+        return benefitGift;
+    }
+
+    @Override
+    public int getBenefit() {
+        return benefit;
+    }
+
+    @Override
+    public String getEventName() {
+        return FREE_GIFT_EVENT_TITLE;
+    }
+
+}

리뷰: 기능을 거의 마무리하고 출력문을 구현할 때, 
증정 상품이 없을 경우나 증정품 금액 요구사항에 if 조건을 두지 않고
Menu에 Empty, 없음 처리를 미리 처리하려고 만들다가 하드코딩이 된 부분인 것 같네요 !

생성자로 받았으면 더 좋았을 것 같습니다 :)
@@ -0,0 +1,53 @@
+package christmas.domain.event;
+
+import christmas.domain.calendar.Date;
+import christmas.domain.calendar.Order;
+import christmas.domain.menu.MenuGroup;
+import christmas.domain.menu.MenuType;
+
+public final class WeekendDiscountEvent implements Event {
+    private static final int CHRISTMAS_EVENT_MONTH = 12;
+    private static final int CHRISTMAS_EVENT_MIN_DAY = 1;
+    private static final int CHRISTMAS_EVENT_MAX_DAY = 31;
+    private static final int CHRISTMAS_EVENT_DESERT_DISCOUNT = 2_023;
+    private static final String WEEKEND_DISCOUNT_EVENT_TITLE = "주말 할인";
+    private int benefit;
+
+    @Override
+    public boolean isApplicable(Date date) {
+        return isEventPeriod(date) &&
+                date.isWeekend();
+    }
+
+    private static boolean isEventPeriod(Date date) {
+        return date.getMonth() == CHRISTMAS_EVENT_MONTH &&
+                date.getDay() >= CHRISTMAS_EVENT_MIN_DAY
+                && date.getDay() <= CHRISTMAS_EVENT_MAX_DAY;
+    }
+
+    @Override
+    public int calculateDiscount(Date date, Order order) {
+        benefit = order.getMenus().menuList().stream()
+                .mapToInt(menu -> {
+                    MenuType menuType = MenuType.findByMenuName(menu.getMenuName());
+                    MenuGroup menuGroup = MenuGroup.findByMenuType(menuType);
+                    int menuQuantity = menu.getMenuQuantity();
+                    if (menuGroup == MenuGroup.MAIN) {
+                        return CHRISTMAS_EVENT_DESERT_DISCOUNT * menuQuantity;
+                    }
+                    return 0;
+                })
+                .sum();
+        return benefit;
+    }
+
+    @Override
+    public int getBenefit() {
+        return benefit;
+    }
+
+    @Override
+    public String getEventName() {
+        return WEEKEND_DISCOUNT_EVENT_TITLE;
+    }
+}

리뷰: 12월 이벤트 뿐만아니라 12월에서 1월까지 연장이 된다고 가정하면,
Calendar와 LocalDate 클래스를 사용하는 것이 더 좋았을 것 같습니다 :) 리뷰 감사합니다
@@ -0,0 +1,51 @@
+package christmas.controller;
+
+import christmas.domain.calendar.Date;
+import christmas.domain.calendar.Order;
+import christmas.domain.calendar.Planner;
+import christmas.domain.menu.Menus;
+import christmas.view.InputView;
+import christmas.view.OutputView;
+
+public class UtecoRestaurantController {
+
+    public void startOperation() {
+        Date date = inputDate();
+        Menus menus = inputMenus();
+        Order order = new Order(menus);
+        Planner planner = new Planner(date, order);
+
+        OutputView.printBasicPreview(date, menus, order);
+        OutputView.printPlanner(order, planner);
+    }
+
+    private static Date inputDate() {
+        OutputView.printRestaurantIntro();
+        Date date = createDate();
+        return date;
+    }
+
+    private static Date createDate() {
+        try {
+            return new Date(InputView.inputDate());
+        } catch (IllegalArgumentException e) {
+            OutputView.printException(e);
+            return createDate();
+        }
+    }
+
+    private static Menus inputMenus() {
+        OutputView.printRestaurantMenu();
+        Menus menus = createMenus();
+        return menus;
+    }
+
+    private static Menus createMenus() {
+        try {
+            return InputView.inputOrderMenu();
+        } catch (IllegalArgumentException e) {
+            OutputView.printException(e);
+            return createMenus();
+        }
+    }
+}

리뷰: Controller가 직접 InputView와 OutputView를 사용한다면 
컨트롤러 부분이 더 깔끔해지지 않을까.. 라는 개인적인 의견이 들어가 있습니다

DI를 받는 방식을 사용하는 것이 객체지향 설계에 더 맞는 방식이었던 것 같네요 🥲
@@ -0,0 +1,48 @@
+package christmas.domain.event;
+
+import christmas.domain.calendar.Date;
+import christmas.domain.calendar.Order;
+import java.time.LocalDate;
+import java.time.Period;
+
+public final class ChristmasDailyDiscountEvent implements Event {
+
+    private static final int CHRISTMAS_EVENT_YEAR = 2023;
+    private static final int CHRISTMAS_EVENT_MONTH = 12;
+    private static final int CHRISTMAS_EVENT_MIN_DAY = 1;
+    private static final int CHRISTMAS_EVENT_MAX_DAY = 25;
+    private static final int CHRISTMAS_EVENT_START_MONEY = 1_000;
+    private static final int CHRISTMAS_EVENT_DISCOUNT_UNIT = 100;
+    private static final String CHRISTMAS_DAILY_DISCOUNT_EVENT_TITLE = "크리스마스 디데이 할인";
+    private int benefit;
+
+    @Override
+    public boolean isApplicable(Date date) {
+        return isEventPeriod(date);
+    }
+
+    private static boolean isEventPeriod(Date date) {
+        return date.getMonth() == CHRISTMAS_EVENT_MONTH &&
+                date.getDay() >= CHRISTMAS_EVENT_MIN_DAY
+                && date.getDay() <= CHRISTMAS_EVENT_MAX_DAY;
+    }
+
+    @Override
+    public int calculateDiscount(Date date, Order order) {
+        LocalDate startDay = LocalDate.of(CHRISTMAS_EVENT_YEAR, CHRISTMAS_EVENT_MONTH, CHRISTMAS_EVENT_MIN_DAY);
+        LocalDate visitDay = date.createDateTimeFormat();
+        Period period = Period.between(startDay, visitDay);
+        benefit = CHRISTMAS_EVENT_START_MONEY + CHRISTMAS_EVENT_DISCOUNT_UNIT * period.getDays();
+        return benefit;
+    }
+
+    @Override
+    public int getBenefit() {
+        return benefit;
+    }
+
+    @Override
+    public String getEventName() {
+        return CHRISTMAS_DAILY_DISCOUNT_EVENT_TITLE;
+    }
+}

리뷰: 아닙니다 ! 찾아주셔서 감사합니다 👍👍👍
코드를 진행하다가 줄 바꿈을 보지 못하고 코드 일관성이 어긋나있네요 ! 리뷰 감사합니다 :)
@@ -0,0 +1,55 @@
+package christmas.domain.event;
+
+import christmas.domain.calendar.Date;
+import christmas.domain.calendar.Order;
+import christmas.domain.menu.Menu;
+import christmas.domain.menu.MenuType;
+
+public final class FreeGiftEvent implements Event {
+
+    private static final int CHRISTMAS_EVENT_MONTH = 12;
+    private static final int CHRISTMAS_EVENT_MIN_DAY = 1;
+    private static final int CHRISTMAS_EVENT_MAX_DAY = 31;
+    private static final int CHRISTMAS_EVENT_FREE_STANDARD = 120_000;
+    private static final String CHRISTMAS_EVENT_FREE_QUANTITY = "1";
+    private static final String FREE_GIFT_EVENT_TITLE = "증정 이벤트";
+    private Menu benefitGift = new Menu(MenuType.EMPTY.getTitle(), CHRISTMAS_EVENT_FREE_QUANTITY);
+    private int benefit;
+
+    @Override
+    public boolean isApplicable(Date date) {
+        return isEventPeriod(date);
+    }
+
+    private static boolean isEventPeriod(Date date) {
+        return date.getMonth() == CHRISTMAS_EVENT_MONTH &&
+                date.getDay() >= CHRISTMAS_EVENT_MIN_DAY
+                && date.getDay() <= CHRISTMAS_EVENT_MAX_DAY;
+    }
+
+    @Override
+    public int calculateDiscount(Date date, Order order) {
+        int beforeMoney = order.getBeforeMoney();
+        if (beforeMoney >= CHRISTMAS_EVENT_FREE_STANDARD) {
+            MenuType champagne = MenuType.CHAMPAGNE;
+            benefitGift = new Menu(champagne.getTitle(), CHRISTMAS_EVENT_FREE_QUANTITY);
+            benefit = champagne.getPrice();
+        }
+        return benefit;
+    }
+
+    public Menu getBenefitGift() {
+        return benefitGift;
+    }
+
+    @Override
+    public int getBenefit() {
+        return benefit;
+    }
+
+    @Override
+    public String getEventName() {
+        return FREE_GIFT_EVENT_TITLE;
+    }
+
+}

리뷰: 리뷰 감사드립니다 :)
@@ -0,0 +1,55 @@
+package christmas.domain.event;
+
+import christmas.domain.calendar.Date;
+import christmas.domain.calendar.Order;
+import christmas.domain.menu.Menu;
+import christmas.domain.menu.MenuType;
+
+public final class FreeGiftEvent implements Event {
+
+    private static final int CHRISTMAS_EVENT_MONTH = 12;
+    private static final int CHRISTMAS_EVENT_MIN_DAY = 1;
+    private static final int CHRISTMAS_EVENT_MAX_DAY = 31;
+    private static final int CHRISTMAS_EVENT_FREE_STANDARD = 120_000;
+    private static final String CHRISTMAS_EVENT_FREE_QUANTITY = "1";
+    private static final String FREE_GIFT_EVENT_TITLE = "증정 이벤트";
+    private Menu benefitGift = new Menu(MenuType.EMPTY.getTitle(), CHRISTMAS_EVENT_FREE_QUANTITY);
+    private int benefit;
+
+    @Override
+    public boolean isApplicable(Date date) {
+        return isEventPeriod(date);
+    }
+
+    private static boolean isEventPeriod(Date date) {
+        return date.getMonth() == CHRISTMAS_EVENT_MONTH &&
+                date.getDay() >= CHRISTMAS_EVENT_MIN_DAY
+                && date.getDay() <= CHRISTMAS_EVENT_MAX_DAY;
+    }
+
+    @Override
+    public int calculateDiscount(Date date, Order order) {
+        int beforeMoney = order.getBeforeMoney();
+        if (beforeMoney >= CHRISTMAS_EVENT_FREE_STANDARD) {
+            MenuType champagne = MenuType.CHAMPAGNE;
+            benefitGift = new Menu(champagne.getTitle(), CHRISTMAS_EVENT_FREE_QUANTITY);
+            benefit = champagne.getPrice();
+        }
+        return benefit;
+    }
+
+    public Menu getBenefitGift() {
+        return benefitGift;
+    }
+
+    @Override
+    public int getBenefit() {
+        return benefit;
+    }
+
+    @Override
+    public String getEventName() {
+        return FREE_GIFT_EVENT_TITLE;
+    }
+
+}

리뷰: 동의합니다.. 
증정 이벤트로 상품을 줘서, 총 혜택 금액에도 영향을 미치지 않더라구요.. 

현재 Event에서 5가지 이벤트를 제한하여 상속 받아,
검증, 할인계산 이라는 메서드를 사용하고있습니다.

여기서 샴페인을 주문한 회원이라면 
증정상품을 받지않고 가격할인에 적용시킬 수 있을텐데 따로 메서드를 분리하여 구현해야할까?
 
라는 생각에 할인계산 메서드를 
그대로 가져와서 같이 사용해도 된다고 판단했습니다 :)
@@ -0,0 +1,65 @@
+package christmas.domain.calendar;
+
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.format.TextStyle;
+import java.util.Locale;
+
+public class Date {
+    private static final int VISIT_YEAR = 2023;
+    private static final int VISIT_MONTH = 12;
+    private Year year;
+    private Month month;
+    private Day day;
+    private String dayFormat;
+
+    public Date(int day) {
+        this.year = new Year(VISIT_YEAR);
+        this.month = new Month(VISIT_MONTH);
+        this.day = new Day(day);
+        this.dayFormat = createVisitingDayFormat();
+    }
+
+    public String createVisitingDayFormat() {
+        LocalDate visitDay = createDateTimeFormat();
+        DayOfWeek dayOfWeek = visitDay.getDayOfWeek();
+        return dayOfWeek.getDisplayName(TextStyle.FULL, Locale.KOREA);
+    }
+
+    public boolean isWeekend() {
+        LocalDate visitDay = createDateTimeFormat();
+        DayOfWeek dayOfWeek = visitDay.getDayOfWeek();
+        return dayOfWeek == DayOfWeek.FRIDAY || dayOfWeek == DayOfWeek.SATURDAY;
+    }
+
+    public boolean isSunday() {
+        LocalDate visitDay = createDateTimeFormat();
+        DayOfWeek dayOfWeek = visitDay.getDayOfWeek();
+        return dayOfWeek == DayOfWeek.SUNDAY;
+    }
+
+    public LocalDate createDateTimeFormat() {
+        return LocalDate.of(getYear(), getMonth(), getDay());
+    }
+
+    @Override
+    public String toString() {
+        return String.format("%s월 %s일", month.month(), day.day());
+    }
+
+    public int getYear() {
+        return year.year();
+    }
+
+    public int getMonth() {
+        return month.month();
+    }
+
+    public int getDay() {
+        return day.day();
+    }
+
+    public String getDayFormat() {
+        return dayFormat;
+    }
+}

리뷰: 크으 DayOfWeek 배워갑니다!
@@ -0,0 +1,20 @@
+package christmas.domain.calendar;
+
+import static christmas.message.ErrorMessages.INVALID_DATE_RANGE;
+
+public record Day(int day) {
+
+    private static int MIN_DAY = 1;
+    private static int EVEN_MONTHS_MAX_DAY = 31;
+
+    public Day {
+        validateRangeFromDay(day);
+    }
+
+    private void validateRangeFromDay(int day) {
+        if (day < MIN_DAY || day > EVEN_MONTHS_MAX_DAY) {
+            throw new IllegalArgumentException(INVALID_DATE_RANGE.getMessage());
+        }
+    }
+
+}

리뷰: Exception을 enum으로 관리해도 좋을 것 같습니다.