ewhk9887/korean_code_reviews_from_github huggingface dataset:
@@ -0,0 +1,42 @@
+package christmas.view;
+
+import static christmas.controller.Parser.parseDate;
+import static christmas.controller.Parser.parseMenus;
+
+import camp.nextstep.edu.missionutils.Console;
+import christmas.exception.ErrorMessage;
+import christmas.exception.PromotionException;
+import java.util.List;
+
+public class InputView {
+    private static final String DATE_PATTERN = "[\\d]{1,2}";
+    private static final String MENUS_PATTERN = "(([가-힣]+)-([\\d]{1,2}),)*([가-힣]+)-([\\d]{1,2})";
+
+    public int readVisitDate() {
+        System.out.println("12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)");
+        String date = Console.readLine();
+        validateDateInput(date);
+        return parseDate(date);
+    }
+
+    private void validateDateInput(String input) {
+        if (input.matches(DATE_PATTERN)) {
+            return;
+        }
+        throw new PromotionException(ErrorMessage.INVALID_DATE_MESSAGE);
+    }
+
+    public List<String> readMenus() {
+        System.out.println("주문하실 메뉴를 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)");
+        String menus = Console.readLine().trim();
+        validateMenuInput(menus);
+        return parseMenus(menus, ",");
+    }
+
+    private void validateMenuInput(String menus) {
+        if (menus.matches(MENUS_PATTERN)) {
+            return;
+        }
+        throw new PromotionException(ErrorMessage.INVALID_ORDER_MESSAGE);
+    }
+}

리뷰: 비록 한번만 쓰일 문장이여도 리펙토링이 편하고 가독성을 위해 상수로 분리하는 것이 좋다고 생각합니다!

```suggestion
private final static String ASK_ORDER_MESSAGE = "주문하실 메뉴를 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)";

        System.out.println(ASK_ORDER_MESSAGE);
```
@@ -1,7 +1,19 @@
 package christmas;
 
+import christmas.back.application.service.ClientService;
+import christmas.back.application.service.MenuOrderService;
+import christmas.front.controller.IOController;
+import christmas.back.controller.PlannerController;
+import christmas.front.view.InputView;
+import christmas.front.view.OutputView;
+
 public class Application {
     public static void main(String[] args) {
-        // TODO: 프로그램 구현
+        var clientService = new ClientService();
+        var menuOrderService = new MenuOrderService();
+        var ioController = new IOController(new InputView(),new OutputView());
+        PlannerController plannerController = new PlannerController(ioController,clientService,menuOrderService);
+        plannerController.startPlanner();
+        plannerController.showOrderResult();
     }
 }

리뷰: var를 이용하신 특별한 이유가 있을까요?
@@ -0,0 +1,21 @@
+package christmas.back.domain.event.config;
+
+import christmas.back.domain.event.gift.GiftEvent;
+import christmas.back.domain.event.discount.DdayEvent;
+import christmas.back.domain.event.discount.SpecialEvent;
+import christmas.back.domain.event.discount.WeekEvent;
+import christmas.back.domain.event.discount.WeekendEvent;
+import java.util.ArrayList;
+import java.util.List;
+
+public class EventConfig {
+    public static List<BaseEvent> configEvent() {
+        List<BaseEvent> arr = new ArrayList<>();
+        arr.add(new DdayEvent());
+        arr.add(new SpecialEvent(List.of(3, 10, 17, 24, 25, 31)));
+        arr.add(new WeekendEvent(List.of(1, 2, 8, 9, 15, 16, 22, 23, 29, 30)));
+        arr.add(new WeekEvent(List.of(3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 31)));
+        arr.add(new GiftEvent());
+        return arr;
+    }
+}

리뷰: 평일과 주말을 구분하는 방법은 요일을 사용해보셨으면 좋을 것 같은데 어떻게 생각하시나요?
e.g.) 저는 LocalDate 와 getDayOfWeek()를 사용했습니다.
@@ -0,0 +1,33 @@
+package christmas.back.domain.event.discount;
+
+import christmas.back.domain.event.config.BaseEvent;
+import christmas.back.domain.event.config.EventType;
+import christmas.back.domain.order.MenuOrders;
+import christmas.back.domain.user.model.Client;
+import java.util.HashMap;
+import java.util.Map;
+
+public class DdayEvent extends BaseEvent {
+    private static final Integer D_DAY_BASE_MONEY = 1000;
+    private static final Integer D_DAY_BASE_DAY = 25;
+    @Override
+    public Boolean canGetEvent(Client client , MenuOrders menuOrders) {
+        return client.canGetEventByCheckDDay(D_DAY_BASE_DAY);
+    }
+    @Override
+    public Map<EventType,Integer> getEventBenefit(Client client,MenuOrders menuOrders) {
+        int amount = eventBenefitCalculate(client.getVisitDay());
+        Map<EventType, Integer> benefitMap = new HashMap<>();
+        benefitMap.put(EventType.DDayEvent, amount);
+        return benefitMap;
+    }
+    @Override
+    public void updateClientBenefit(Client client,MenuOrders menuOrders) {
+        client.joinEvent();
+        int benefit = eventBenefitCalculate(client.getVisitDay());
+        client. addBenefitToTotalDiscountAndEventBenefit(benefit);
+    }
+    public Integer eventBenefitCalculate(Integer givenDay){
+        return D_DAY_BASE_MONEY + (givenDay - 1) * 100;
+    }
+}

리뷰: 기왕이면 1과 100도 상수로 변경하셔도 좋을 것 같습니다!
@@ -0,0 +1,33 @@
+package christmas.back.domain.event.discount;
+
+import christmas.back.domain.event.config.BaseEvent;
+import christmas.back.domain.event.config.EventType;
+import christmas.back.domain.order.MenuOrders;
+import christmas.back.domain.user.model.Client;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class SpecialEvent extends BaseEvent {
+    public static final Integer SPECIAL_EVENT_BENEFIT_VALUE = 1000;
+    private final List<Integer> days;
+
+    public SpecialEvent(List<Integer> days) {
+        this.days = days;
+    }
+    @Override
+    public Boolean canGetEvent(Client client, MenuOrders menuOrders) {
+        return days.contains(client.getVisitDay());
+    }
+    @Override
+    public Map<EventType,Integer> getEventBenefit(Client client,MenuOrders menuOrders) {
+        Map<EventType, Integer> benefitMap = new HashMap<>();
+        benefitMap.put(EventType.SpecialEvent,SPECIAL_EVENT_BENEFIT_VALUE);
+        return benefitMap;
+    }
+    @Override
+    public void updateClientBenefit(Client client,MenuOrders menuOrders) {
+        client.joinEvent();
+        client. addBenefitToTotalDiscountAndEventBenefit(SPECIAL_EVENT_BENEFIT_VALUE);
+    }
+}

리뷰: client. addBenefitToTotalDiscountAndEventBenefit
 . 다음에 띄어쓰기 오타가 있습니다!
@@ -0,0 +1,61 @@
+package christmas.back.domain.menu;
+
+public enum MenuItem {
+
+    APPETIZER_BUTTON_MUSHROOM_SOUP("애피타이저", "양송이수프", 6000),
+    APPETIZER_TAPAS("애피타이저", "타파스", 5500),
+    APPETIZER_CAESAR_SALAD("애피타이저", "시저샐러드", 8000),
+
+    MAIN_T_BONE_STEAK("메인", "티본스테이크", 55000),
+    MAIN_BBQ_RIB("메인", "바비큐립", 54000),
+    MAIN_SEAFOOD_PASTA("메인", "해산물파스타", 35000),
+    MAIN_CHRISTMAS_PASTA("메인", "크리스마스파스타", 25000),
+
+    DESSERT_CHOCO_CAKE("디저트", "초코케이크", 15000),
+    DESSERT_ICE_CREAM("디저트", "아이스크림", 5000),
+
+    BEVERAGE_ZERO_COLA("음료", "제로콜라", 3000),
+    BEVERAGE_RED_WINE("음료", "레드와인", 60000),
+    BEVERAGE_CHAMPAGNE("음료", "샴페인", 25000);
+
+    private final String category;
+    private final String itemName;
+    private final int itemPrice;
+
+    MenuItem(String category, String itemName, int itemPrice) {
+        this.category = category;
+        this.itemName = itemName;
+        this.itemPrice = itemPrice;
+    }
+
+    public static MenuItem getMenuByName(String menuName) {
+        for (MenuItem item : values()) {
+            if (item.getItemName().equals(menuName)) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    public static boolean isNotMenu(String givenName) {
+        for (MenuItem item : values()) {
+            if (item.getItemName().equals(givenName)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public String getCategory() {
+        return category;
+    }
+
+    public String getItemName() {
+        return itemName;
+    }
+
+    public int getItemPrice() {
+        return itemPrice;
+    }
+
+}

리뷰: 분류도 enum으로 관리하는 건 어떻게 생각하시나요? 
해당 분류의 메뉴를 찾을 때도 String 문자열로 찾는 것보단 enum으로 정의된 분류로 찾는게 더 좋다고 생각합니다.
@@ -0,0 +1,37 @@
+package christmas.back.domain.event.discount;
+
+import christmas.back.domain.event.config.BaseEvent;
+import christmas.back.domain.event.config.EventType;
+import christmas.back.domain.order.MenuOrders;
+import christmas.back.domain.user.model.Client;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class WeekendEvent extends BaseEvent {
+    public static final Integer WEEKEND_EVENT_BENEFIT_VALUE = 2023;
+
+    public WeekendEvent(List<Integer> days) {
+        this.days = days;
+    }
+
+    private final List<Integer> days;
+    @Override
+    public Boolean canGetEvent(Client client, MenuOrders menuOrders) {
+        return days.contains(client.getVisitDay()) & menuOrders.isOrderHaveMenu("메인");
+    }
+    @Override
+    public Map<EventType,Integer> getEventBenefit(Client client,MenuOrders menuOrders) {
+        int amount = WEEKEND_EVENT_BENEFIT_VALUE * menuOrders.getValueSumByMenu("메인");
+        Map<EventType, Integer> benefitMap = new HashMap<>();
+        benefitMap.put(EventType.WeekendEvent, amount);
+        return benefitMap;
+    }
+    @Override
+    public void updateClientBenefit(Client client,MenuOrders menuOrders) {
+        client.joinEvent();
+        int amount = WEEKEND_EVENT_BENEFIT_VALUE * menuOrders.getValueSumByMenu("메인");
+        client.addBenefitToTotalDiscountAndEventBenefit(amount);
+    }
+}

리뷰: 선언 순서가 섞여있는 것 같습니다!
@@ -0,0 +1,37 @@
+package christmas.back.domain.event.discount;
+
+import christmas.back.domain.event.config.BaseEvent;
+import christmas.back.domain.event.config.EventType;
+import christmas.back.domain.order.MenuOrders;
+import christmas.back.domain.user.model.Client;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class WeekendEvent extends BaseEvent {
+    public static final Integer WEEKEND_EVENT_BENEFIT_VALUE = 2023;
+
+    public WeekendEvent(List<Integer> days) {
+        this.days = days;
+    }
+
+    private final List<Integer> days;
+    @Override
+    public Boolean canGetEvent(Client client, MenuOrders menuOrders) {
+        return days.contains(client.getVisitDay()) & menuOrders.isOrderHaveMenu("메인");
+    }
+    @Override
+    public Map<EventType,Integer> getEventBenefit(Client client,MenuOrders menuOrders) {
+        int amount = WEEKEND_EVENT_BENEFIT_VALUE * menuOrders.getValueSumByMenu("메인");
+        Map<EventType, Integer> benefitMap = new HashMap<>();
+        benefitMap.put(EventType.WeekendEvent, amount);
+        return benefitMap;
+    }
+    @Override
+    public void updateClientBenefit(Client client,MenuOrders menuOrders) {
+        client.joinEvent();
+        int amount = WEEKEND_EVENT_BENEFIT_VALUE * menuOrders.getValueSumByMenu("메인");
+        client.addBenefitToTotalDiscountAndEventBenefit(amount);
+    }
+}

리뷰: menuOrders.getValueSumByMenu("메인"); 이 다소 모호한 것 같은데 어떻게 생각하시나요?
맥락상 할인 금액으로 보이는데 명확하게 표현하면 더 좋지 않을까 생각합니다.
@@ -0,0 +1,35 @@
+package christmas.back.domain.event.gift;
+
+import christmas.back.domain.event.config.BaseEvent;
+import christmas.back.domain.order.MenuOrders;
+import christmas.back.domain.user.model.Client;
+import christmas.back.domain.event.config.EventType;
+import christmas.back.domain.menu.MenuItem;
+import java.util.HashMap;
+import java.util.Map;
+
+public class GiftEvent extends BaseEvent {
+    private static final Integer GIFT_EVENT_BENEFIT_VALUE = 25000;
+    private static final Integer DECEMBER_GIFT_EVENT_MIN_MONEY = 120000;
+    public static String getGiftMenu(Client client) {
+        if (client.checkCanGetEvent(DECEMBER_GIFT_EVENT_MIN_MONEY)) {
+            return MenuItem.BEVERAGE_CHAMPAGNE.getItemName();
+        }
+        return "없음";
+    }
+    @Override
+    public Boolean canGetEvent(Client client, MenuOrders menuOrders) {
+        return client.checkCanGetEvent(DECEMBER_GIFT_EVENT_MIN_MONEY);
+    }
+    @Override
+    public Map<EventType, Integer> getEventBenefit(Client client,MenuOrders menuOrders) {
+        Map<EventType, Integer> benefitMap = new HashMap<>();
+        benefitMap.put(EventType.GiftEvent,GIFT_EVENT_BENEFIT_VALUE);
+        return benefitMap;
+    }
+    @Override
+    public void updateClientBenefit(Client client,MenuOrders menuOrders) {
+        client.joinEvent();
+        client.addBenefitToTotalEventAmount(GIFT_EVENT_BENEFIT_VALUE);
+    }
+}

리뷰: 숫자에 단위별 구분자를 넣으면 가독성이 좋아질 것 같습니다!
e.g.) 25_000, 120_000
@@ -0,0 +1,66 @@
+package christmas.back.domain.order;
+
+import christmas.back.domain.menu.MenuItem;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+public class MenuOrders {
+    private final Long id;
+    private final Map<MenuItem, Integer> orders;
+
+    private MenuOrders(Long id, Map<MenuItem, Integer> orders) {
+        OrderValidate.checkOrders(orders);
+        this.id = id;
+        this.orders = orders;
+    }
+
+    public MenuOrders(Map<MenuItem, Integer> orders) {
+        this(null, new TreeMap<>(orders));
+    }
+
+    public MenuOrders(Long id, MenuOrders menuOrders) {
+        this(id, menuOrders.orders);
+    }
+
+    public List<Map<String, Integer>> getOrderForMessage() {
+        return orders.entrySet().stream()
+                .map(entry -> {
+                    Map<String, Integer> orderMap = new HashMap<>();
+                    orderMap.put(entry.getKey().getItemName(), entry.getValue());
+                    return orderMap;
+                })
+                .toList();
+    }
+
+    public Integer getTotalAmountBeforeDiscount() {
+        return orders.entrySet().stream()
+                .mapToInt(entry -> entry.getKey().getItemPrice() * entry.getValue())
+                .sum();
+    }
+
+    public boolean isOrderHaveMenu(String menu) {
+        return orders.entrySet().stream()
+                .anyMatch(entry -> entry.getKey().getCategory().equals(menu));
+    }
+
+    public Integer getValueSumByMenu(String menu) {
+        return orders.entrySet().stream()
+                .filter(entry -> entry.getKey().getCategory().equals(menu))
+                .mapToInt(Map.Entry::getValue)
+                .sum();
+    }
+
+    public Boolean canNotGetEvent() {
+        int totalPrice = orders.entrySet().stream()
+                .mapToInt(entry -> entry.getKey().getItemPrice() * entry.getValue())
+                .sum();
+        return totalPrice < 10000;
+    }
+
+    public Long getId() {
+        return id;
+    }
+}

리뷰: MenuOrders가 주문 목록을 관리하는 책임 외에 이벤트 참여 여부의 책임까지 가진 것으로 보이는데 분리하는 건 어떻게 생각하시나요?
@@ -1,7 +1,19 @@
 package christmas;
 
+import christmas.back.application.service.ClientService;
+import christmas.back.application.service.MenuOrderService;
+import christmas.front.controller.IOController;
+import christmas.back.controller.PlannerController;
+import christmas.front.view.InputView;
+import christmas.front.view.OutputView;
+
 public class Application {
     public static void main(String[] args) {
-        // TODO: 프로그램 구현
+        var clientService = new ClientService();
+        var menuOrderService = new MenuOrderService();
+        var ioController = new IOController(new InputView(),new OutputView());
+        PlannerController plannerController = new PlannerController(ioController,clientService,menuOrderService);
+        plannerController.startPlanner();
+        plannerController.showOrderResult();
     }
 }

리뷰: 의존성을 생각하여 명시적으로 반환 클라스를 적는것에 단점이 있어 피하고자 했습니다.

반환 타입이 적히는 순간에 가독성은 좋아지지만, 클라스명이 바뀌면 같이 수정할 범위가 늘어나는것을 생각했습니다
@@ -0,0 +1,21 @@
+package christmas.back.domain.event.config;
+
+import christmas.back.domain.event.gift.GiftEvent;
+import christmas.back.domain.event.discount.DdayEvent;
+import christmas.back.domain.event.discount.SpecialEvent;
+import christmas.back.domain.event.discount.WeekEvent;
+import christmas.back.domain.event.discount.WeekendEvent;
+import java.util.ArrayList;
+import java.util.List;
+
+public class EventConfig {
+    public static List<BaseEvent> configEvent() {
+        List<BaseEvent> arr = new ArrayList<>();
+        arr.add(new DdayEvent());
+        arr.add(new SpecialEvent(List.of(3, 10, 17, 24, 25, 31)));
+        arr.add(new WeekendEvent(List.of(1, 2, 8, 9, 15, 16, 22, 23, 29, 30)));
+        arr.add(new WeekEvent(List.of(3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 31)));
+        arr.add(new GiftEvent());
+        return arr;
+    }
+}

리뷰: 좋은 아이디어 같습니다 고려할만 한것 같네요
@@ -0,0 +1,61 @@
+package christmas.back.domain.menu;
+
+public enum MenuItem {
+
+    APPETIZER_BUTTON_MUSHROOM_SOUP("애피타이저", "양송이수프", 6000),
+    APPETIZER_TAPAS("애피타이저", "타파스", 5500),
+    APPETIZER_CAESAR_SALAD("애피타이저", "시저샐러드", 8000),
+
+    MAIN_T_BONE_STEAK("메인", "티본스테이크", 55000),
+    MAIN_BBQ_RIB("메인", "바비큐립", 54000),
+    MAIN_SEAFOOD_PASTA("메인", "해산물파스타", 35000),
+    MAIN_CHRISTMAS_PASTA("메인", "크리스마스파스타", 25000),
+
+    DESSERT_CHOCO_CAKE("디저트", "초코케이크", 15000),
+    DESSERT_ICE_CREAM("디저트", "아이스크림", 5000),
+
+    BEVERAGE_ZERO_COLA("음료", "제로콜라", 3000),
+    BEVERAGE_RED_WINE("음료", "레드와인", 60000),
+    BEVERAGE_CHAMPAGNE("음료", "샴페인", 25000);
+
+    private final String category;
+    private final String itemName;
+    private final int itemPrice;
+
+    MenuItem(String category, String itemName, int itemPrice) {
+        this.category = category;
+        this.itemName = itemName;
+        this.itemPrice = itemPrice;
+    }
+
+    public static MenuItem getMenuByName(String menuName) {
+        for (MenuItem item : values()) {
+            if (item.getItemName().equals(menuName)) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    public static boolean isNotMenu(String givenName) {
+        for (MenuItem item : values()) {
+            if (item.getItemName().equals(givenName)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public String getCategory() {
+        return category;
+    }
+
+    public String getItemName() {
+        return itemName;
+    }
+
+    public int getItemPrice() {
+        return itemPrice;
+    }
+
+}

리뷰: 시간이 없어 못 바꾼.. 좋은 생각인것같아요
감사합니다
@@ -0,0 +1,66 @@
+package christmas.back.domain.order;
+
+import christmas.back.domain.menu.MenuItem;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+public class MenuOrders {
+    private final Long id;
+    private final Map<MenuItem, Integer> orders;
+
+    private MenuOrders(Long id, Map<MenuItem, Integer> orders) {
+        OrderValidate.checkOrders(orders);
+        this.id = id;
+        this.orders = orders;
+    }
+
+    public MenuOrders(Map<MenuItem, Integer> orders) {
+        this(null, new TreeMap<>(orders));
+    }
+
+    public MenuOrders(Long id, MenuOrders menuOrders) {
+        this(id, menuOrders.orders);
+    }
+
+    public List<Map<String, Integer>> getOrderForMessage() {
+        return orders.entrySet().stream()
+                .map(entry -> {
+                    Map<String, Integer> orderMap = new HashMap<>();
+                    orderMap.put(entry.getKey().getItemName(), entry.getValue());
+                    return orderMap;
+                })
+                .toList();
+    }
+
+    public Integer getTotalAmountBeforeDiscount() {
+        return orders.entrySet().stream()
+                .mapToInt(entry -> entry.getKey().getItemPrice() * entry.getValue())
+                .sum();
+    }
+
+    public boolean isOrderHaveMenu(String menu) {
+        return orders.entrySet().stream()
+                .anyMatch(entry -> entry.getKey().getCategory().equals(menu));
+    }
+
+    public Integer getValueSumByMenu(String menu) {
+        return orders.entrySet().stream()
+                .filter(entry -> entry.getKey().getCategory().equals(menu))
+                .mapToInt(Map.Entry::getValue)
+                .sum();
+    }
+
+    public Boolean canNotGetEvent() {
+        int totalPrice = orders.entrySet().stream()
+                .mapToInt(entry -> entry.getKey().getItemPrice() * entry.getValue())
+                .sum();
+        return totalPrice < 10000;
+    }
+
+    public Long getId() {
+        return id;
+    }
+}

리뷰: 코멘트 정말 감사합니다. 사용자에서 판별을 할지 이벤트에서 판별을 할지 많은 고민을 했던 부분인데 다시한번 생각해보겠습니다!
분리가 맞는것 같네요
감사합니다
@@ -1,7 +1,19 @@
 package christmas;
 
+import christmas.back.application.service.ClientService;
+import christmas.back.application.service.MenuOrderService;
+import christmas.front.controller.IOController;
+import christmas.back.controller.PlannerController;
+import christmas.front.view.InputView;
+import christmas.front.view.OutputView;
+
 public class Application {
     public static void main(String[] args) {
-        // TODO: 프로그램 구현
+        var clientService = new ClientService();
+        var menuOrderService = new MenuOrderService();
+        var ioController = new IOController(new InputView(),new OutputView());
+        PlannerController plannerController = new PlannerController(ioController,clientService,menuOrderService);
+        plannerController.startPlanner();
+        plannerController.showOrderResult();
     }
 }

리뷰: Controller가 Controller를 (또는 Service가 Service를) 의존하는 방식은 일반적으로 권장되지 않는 것으로 알고 있습니다. 가장 큰 이유가  규모가 커지면 순환 참조가 일어날 여지를 남기게 되고 이를 예방하려면 서로 간의 계층을 뚜렷하게 나누어야 하는데 방법이 마땅치 않다는 점에 있습니다. 이 부분 어떻게 생각하시는지 의견 나누어보고 싶어요.
@@ -0,0 +1,47 @@
+package christmas.back.application.service;
+
+import christmas.back.domain.event.gift.GiftEvent;
+import christmas.back.domain.user.ClientRepository;
+import christmas.back.domain.user.model.Client;
+import christmas.back.infrastructure.repository.ClientRepositoryImpl;
+
+public class ClientService {
+    private final ClientRepository clientRepository;
+
+    public ClientService() {
+        this.clientRepository = new ClientRepositoryImpl();
+    }
+
+    public Client saveClient(Client clientInfo) {
+        Client client = new Client(clientInfo);
+        return clientRepository.save(client);
+    }
+
+    public Client findClientById(Long id) {
+        return clientRepository.findById(id);
+    }
+
+    public Integer getTotalAmountBeforeDiscount(Long clientId) {
+        return findClientById(clientId).getPayment().getTotalPaymentBeforeDiscount();
+    }
+
+    public String getGiftEventMenu(Long clientId) {
+        return GiftEvent.getGiftMenu(findClientById(clientId));
+    }
+
+    public Integer getTotalDiscountAmount(Long clientId) {
+        return findClientById(clientId).getPayment().getTotalDiscountMoney();
+    }
+
+    public Integer getAfterDiscount(Long clientId) {
+        return findClientById(clientId).getPayment().getAfterDiscount();
+    }
+
+    public String getBadgeContent(Long clientId) {
+        return findClientById(clientId).getBadgeContent();
+    }
+
+    public void updateBadge(Long clientId) {
+        findClientById(clientId).applyBadge();
+    }
+}

리뷰: JPA를 사용한 서비스 계층을 보는 것 같아서 인상 깊습니다. 메서드의 의미도 간결하게 전달되네요 👍
@@ -0,0 +1,21 @@
+package christmas.back.application.service;
+
+import christmas.back.domain.order.MenuOrders;
+import christmas.back.domain.order.MenuOrdersRepository;
+import christmas.back.infrastructure.repository.MenuOrdersRepositoryImpl;
+
+public class MenuOrderService {
+    private final MenuOrdersRepository menuOrdersRepository;
+
+    public MenuOrderService() {
+        this.menuOrdersRepository = new MenuOrdersRepositoryImpl();
+    }
+
+    public MenuOrders saveOrders(MenuOrders menuOrders) {
+        return menuOrdersRepository.save(menuOrders);
+    }
+
+    public MenuOrders findMenuOrdersById(Long menuOrdersId) {
+        return menuOrdersRepository.findById(menuOrdersId);
+    }
+}

리뷰: Controller와 Service는 main 메서드에서 생성하셨는데 Repository만 서비스에서 생성하신 이유가 궁금합니다.