ewhk9887/korean_code_reviews_from_github huggingface dataset:
@@ -1,10 +1,8 @@
 package model;
 
-import util.ListGenerator;
 import util.SplitGenerator;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
@@ -13,43 +11,44 @@ public class LottoMachine {
     private static int LOTTO_NUMBER_RANGE = 45;
     private static int LOTTO_NUMBER_COUNT = 6;
     private static int LOTTO_PRICE = 1000;
-    List<Lotto> lottos = new ArrayList<>();
 
-    public List<String> buyLotto(int totalLottoPrice) {
-        for (int i = 0; i < getLottoCount(totalLottoPrice); i++)
-            lottos.add(new Lotto(getRandomNumbers(LOTTO_NUMBER_RANGE)));
-        return showLottoHistory();
+    private int tryCount = 0;
+
+    public Lotto getAutoLotto() {
+        decreaseCount();
+        return new Lotto(getRandomNumbers(getNumbersInRange(LOTTO_NUMBER_RANGE)));
     }
 
-    private int getLottoCount(int totalPrice) {
-        return totalPrice / LOTTO_PRICE;
+    public void inputMoney(int money) {
+        tryCount += money / LOTTO_PRICE;
     }
 
-    private List<String> getRandomNumbers(int range) {
-        List<String> numbersInRange = ListGenerator.getNumbersInRange(range);
-        Collections.shuffle(numbersInRange);
-        return numbersInRange.subList(0, LOTTO_NUMBER_COUNT);
+    public boolean canLotto() {
+        return tryCount > 0;
     }
 
-    public int[] getStatistic(String winningNumber) {
-        return createStatistic(toStringList(winningNumber));
+    private void decreaseCount() {
+        if (canLotto() == false)
+            throw new RuntimeException("돈 넣어!!");
+        tryCount--;
     }
 
-    private List<String> toStringList(String winningNumber) {
-        return Arrays.asList(SplitGenerator.splitWithSign(winningNumber, ", "));
+    private List<LottoNo> getNumbersInRange(int range) {
+        List<LottoNo> numbersInRange = new ArrayList<>();
+
+        for (int i = 1; i <= range; i++)
+            numbersInRange.add(new LottoNo(i));
+
+        return numbersInRange;
     }
 
-    private int[] createStatistic(List<String> winningNumber) {
-        int[] statistic = new int[LOTTO_NUMBER_COUNT + 1];
-        for (Lotto lotto : lottos)
-            statistic[lotto.getCorrectNumberCount(winningNumber)]++;
-        return statistic;
+    private List<LottoNo> getRandomNumbers(List<LottoNo> numbersInRange) {
+        Collections.shuffle(numbersInRange);
+        return numbersInRange.subList(0, LOTTO_NUMBER_COUNT);
     }
 
-    private List<String> showLottoHistory() {
-        List<String> lottoHistory = new ArrayList<>();
-        for (Lotto lotto : lottos)
-            lottoHistory.add(lotto.showLotto());
-        return lottoHistory;
+    public Lotto getDirectLotto(String numbers) {
+        decreaseCount();
+        return new Lotto(SplitGenerator.splitWithSign(numbers, ", "));
     }
 }

리뷰: getter 와 헷갈리므로 calculateRandomNumbers 처럼 다른 단어를 활용해보시는걸 추천
@@ -1,20 +1,36 @@
 package model;
 
+import java.util.ArrayList;
 import java.util.List;
 
 public class Lotto {
 
-    private List<String> lottoNumbers;
+    private List<LottoNo> lottoNumbers;
 
-    public Lotto(List<String> lottoNumbers) {
+    public Lotto(List<LottoNo> lottoNumbers) {
         this.lottoNumbers = lottoNumbers;
     }
 
-    public int getCorrectNumberCount(List<String> winningNumber) {
-        return (int) winningNumber.stream().filter((x) -> lottoNumbers.contains(x)).count();
+    public Lotto(String[] lottoNumbers) {
+        this.lottoNumbers = new ArrayList<>();
+        for (int i = 0; i < lottoNumbers.length; i++)
+            this.lottoNumbers.add(new LottoNo(Integer.parseInt(lottoNumbers[i])));
     }
 
     public String showLotto() {
-        return lottoNumbers.toString();
+        List<String> lotto = new ArrayList<>();
+
+        for (LottoNo lottoNo : lottoNumbers)
+            lotto.add(lottoNo.getStringNumber());
+
+        return lotto.toString();
+    }
+
+    public int getCorrectCount(List<String> winningNumbers) {
+        return (int) lottoNumbers.stream().filter((x) -> winningNumbers.contains(x.getStringNumber())).count();
+    }
+
+    public boolean isContain(String stringNumber) {
+        return (int)lottoNumbers.stream().filter(x -> x.getStringNumber().equals(stringNumber)).count() != 0;
     }
 }

리뷰: int 값으로 반환하는 메소드로 처음 구현하였는데 리팩토링 과정에서 boolean 타입으로 바꿀때 깜빡한 것같네요.. 실수하지 않도록 주의하겠습니다
@@ -1,20 +1,36 @@
 package model;
 
+import java.util.ArrayList;
 import java.util.List;
 
 public class Lotto {
 
-    private List<String> lottoNumbers;
+    private List<LottoNo> lottoNumbers;
 
-    public Lotto(List<String> lottoNumbers) {
+    public Lotto(List<LottoNo> lottoNumbers) {
         this.lottoNumbers = lottoNumbers;
     }
 
-    public int getCorrectNumberCount(List<String> winningNumber) {
-        return (int) winningNumber.stream().filter((x) -> lottoNumbers.contains(x)).count();
+    public Lotto(String[] lottoNumbers) {
+        this.lottoNumbers = new ArrayList<>();
+        for (int i = 0; i < lottoNumbers.length; i++)
+            this.lottoNumbers.add(new LottoNo(Integer.parseInt(lottoNumbers[i])));
     }
 
     public String showLotto() {
-        return lottoNumbers.toString();
+        List<String> lotto = new ArrayList<>();
+
+        for (LottoNo lottoNo : lottoNumbers)
+            lotto.add(lottoNo.getStringNumber());
+
+        return lotto.toString();
+    }
+
+    public int getCorrectCount(List<String> winningNumbers) {
+        return (int) lottoNumbers.stream().filter((x) -> winningNumbers.contains(x.getStringNumber())).count();
+    }
+
+    public boolean isContain(String stringNumber) {
+        return (int)lottoNumbers.stream().filter(x -> x.getStringNumber().equals(stringNumber)).count() != 0;
     }
 }

리뷰: set과 List의 가장 큰 차이점은 중복을 허용하는지 안하는지로 알고있습니다. 
이부분에서 set을 활용했을때 로또 번호가 6개가 될때까지 랜덤 숫자를 받는 방법이 있겠네요 시도해보겠습니다.
@@ -0,0 +1,25 @@
+package christmas.validator;
+
+import christmas.constant.ErrorMessage;
+
+public class DateValidator implements Validator{
+    @Override
+    public void check(final String input) {
+        checkInteger(input);
+        checkOutOfRange(input);
+    }
+
+    private void checkInteger(final String input) {
+        try {
+            Integer.parseInt(input);
+        } catch (IllegalArgumentException e) {
+            throw new IllegalArgumentException(ErrorMessage.DATE_OUT_OF_RANGE.getMessage());
+        }
+    }
+    private void checkOutOfRange(final String input) {
+        int date = Integer.parseInt(input);
+        if (date < 1 || date > 31) {
+            throw new IllegalArgumentException(ErrorMessage.DATE_OUT_OF_RANGE.getMessage());
+        }
+    }
+}

리뷰: 1과 31이 매직넘버라고 생각해요! 상수로 빼주면 좋을 것 같습니다!
@@ -0,0 +1,28 @@
+package christmas.domain;
+
+import christmas.util.Utils;
+import christmas.view.OutputView;
+
+public class OrderPrice {
+    // 금액과 관련된 클래스입니다.
+    // 할인 전 총 주문금액, 할인 후 예상 결제 금액 등을 관리하는 클래스 입니다.
+    private static final String UNIT = "원";
+    private OrderRepository orders;
+    private int totalAmount;
+
+    public OrderPrice(final OrderRepository orders) {
+        this.orders = orders;
+    }
+
+    public void printBeforeDiscountInfo() {
+        this.totalAmount = orders.calculateTotalAmount();
+
+        OutputView.printBeforeDiscount();
+        String result = Utils.makeFormattedNumberWithComma(this.totalAmount);
+        OutputView.printMessage(result + UNIT);
+    }
+
+    public int getTotalAmount() {
+        return totalAmount;
+    }
+}

리뷰: '원' 같은 단위는 출력 및 포매팅과 관계있으므로 OutputView에 있는 것이 좀 더 적절하다고 생각하는데 어떻게 생각하시나요??ㅎㅎ
@@ -0,0 +1,40 @@
+package christmas.domain;
+
+import christmas.view.OutputView;
+
+public class EventBadge {
+    // 이벤트 뱃지를 관리 하는 클래스 입니다.
+    private static final int SANTA_MINIMUM_LIMIT = 20000;
+    private static final int TREE_MINIMUM_LIMIT = 20000;
+    private static final int STAR_MINIMUM_LIMIT = 20000;
+    private static final String SANTA = "산타";
+    private static final String TREE = "트리";
+    private static final String STAR = "별";
+
+    private static final String NOTHING = "없음";
+
+    private int discountAmount;
+
+    public EventBadge(final int discountAmount) {
+        this.discountAmount = discountAmount;
+    }
+
+    public void printEventBadge() {
+        OutputView.printEventBadge();
+        String badge = determineBadge(discountAmount);
+        OutputView.printMessage(badge);
+    }
+
+    private String determineBadge(final int discountAmount) {
+        if (-discountAmount >= SANTA_MINIMUM_LIMIT) {
+            return SANTA;
+        }
+        if (-discountAmount >= TREE_MINIMUM_LIMIT) {
+            return TREE;
+        }
+        if (-discountAmount >= STAR_MINIMUM_LIMIT) {
+            return STAR;
+        }
+        return NOTHING;
+    }
+}

리뷰: 처음보는 사람은 discountAmount에 -를 왜 붙이지? 라고 생각할 수 있다고 생각합니다!
저도 비슷하게 구현하고 피드백을 받았는데
변수이름과 final을 이용해 -를 붙인 변수가 무엇을 뜻하는지 한번 더 정의해주는 것도 좋다고 생각해요!
@@ -0,0 +1,21 @@
+package christmas.constant;
+
+public enum Constants {
+    EVENT_START_DATE(1),
+    EVENT_END_DATE(25),
+    MENU_LIMIT(20),
+    CHAMPAGNE_LIMIT(120000),
+    MINIMUM_DISCOUNT_ABLE_AMOUNT(10000),
+    THIS_YEAR(2023),
+    EVENT_MONTH(12);
+
+    public int constants;
+
+    Constants(final int constants) {
+        this.constants = constants;
+    }
+
+    public int getConstants() {
+        return constants;
+    }
+}

리뷰: 해당 상수 값들을 필요한 각 도메인이 들고 있는 것은 어떤가요~~?? 그렇게 하면 클래스의 응집도를 조금 더 높일 수 있을 것 같습니다!
@@ -0,0 +1,13 @@
+package christmas.domain;
+
+public class Date {
+    private int date;
+
+    public Date(final int date) {
+        this.date = date;
+    }
+
+    public int getDate() {
+        return this.date;
+    }
+}
\ No newline at end of file

리뷰: 해당 클래스가 존재하는 이유가 있나요?!! 클래스로서 완전하려면 Date와 관련된 validate 코드가 생성자 안에 있어야할 것 같습니다..!!!
@@ -0,0 +1,13 @@
+package christmas.domain;
+
+public class Date {
+    private int date;
+
+    public Date(final int date) {
+        this.date = date;
+    }
+
+    public int getDate() {
+        return this.date;
+    }
+}
\ No newline at end of file

리뷰: 또한 record로 바꿔도 좋을 것 같네요 ㅎㅎ
@@ -0,0 +1,21 @@
+package christmas.constant;
+
+public enum Constants {
+    EVENT_START_DATE(1),
+    EVENT_END_DATE(25),
+    MENU_LIMIT(20),
+    CHAMPAGNE_LIMIT(120000),
+    MINIMUM_DISCOUNT_ABLE_AMOUNT(10000),
+    THIS_YEAR(2023),
+    EVENT_MONTH(12);
+
+    public int constants;
+
+    Constants(final int constants) {
+        this.constants = constants;
+    }
+
+    public int getConstants() {
+        return constants;
+    }
+}

리뷰: 각 도메인이 들며 응집도를 높히는 방법도 좋을 것 같습니다! 🫠
@@ -0,0 +1,13 @@
+package christmas.domain;
+
+public class Date {
+    private int date;
+
+    public Date(final int date) {
+        this.date = date;
+    }
+
+    public int getDate() {
+        return this.date;
+    }
+}
\ No newline at end of file

리뷰: record형은 서우님 코드 보면서 처음 배웠는데 유용하게 잘 사용할 수 있을 것 같습니다 !
`date`에 `validate`가 없는 이상은 사실 의미가 없는거 같네요,,ㅎㅎ
@@ -0,0 +1,40 @@
+package christmas.domain;
+
+import christmas.view.OutputView;
+
+public class EventBadge {
+    // 이벤트 뱃지를 관리 하는 클래스 입니다.
+    private static final int SANTA_MINIMUM_LIMIT = 20000;
+    private static final int TREE_MINIMUM_LIMIT = 20000;
+    private static final int STAR_MINIMUM_LIMIT = 20000;
+    private static final String SANTA = "산타";
+    private static final String TREE = "트리";
+    private static final String STAR = "별";
+
+    private static final String NOTHING = "없음";
+
+    private int discountAmount;
+
+    public EventBadge(final int discountAmount) {
+        this.discountAmount = discountAmount;
+    }
+
+    public void printEventBadge() {
+        OutputView.printEventBadge();
+        String badge = determineBadge(discountAmount);
+        OutputView.printMessage(badge);
+    }
+
+    private String determineBadge(final int discountAmount) {
+        if (-discountAmount >= SANTA_MINIMUM_LIMIT) {
+            return SANTA;
+        }
+        if (-discountAmount >= TREE_MINIMUM_LIMIT) {
+            return TREE;
+        }
+        if (-discountAmount >= STAR_MINIMUM_LIMIT) {
+            return STAR;
+        }
+        return NOTHING;
+    }
+}

리뷰: 모르는 사람이 코드를 보면 왜 있지? 생각할 수는 있겠네요!
변수명과, 주석을 통해 의미를 나타내는 것도 좋은 방법인 것 같네요 🫠
@@ -0,0 +1,28 @@
+package christmas.domain;
+
+import christmas.util.Utils;
+import christmas.view.OutputView;
+
+public class OrderPrice {
+    // 금액과 관련된 클래스입니다.
+    // 할인 전 총 주문금액, 할인 후 예상 결제 금액 등을 관리하는 클래스 입니다.
+    private static final String UNIT = "원";
+    private OrderRepository orders;
+    private int totalAmount;
+
+    public OrderPrice(final OrderRepository orders) {
+        this.orders = orders;
+    }
+
+    public void printBeforeDiscountInfo() {
+        this.totalAmount = orders.calculateTotalAmount();
+
+        OutputView.printBeforeDiscount();
+        String result = Utils.makeFormattedNumberWithComma(this.totalAmount);
+        OutputView.printMessage(result + UNIT);
+    }
+
+    public int getTotalAmount() {
+        return totalAmount;
+    }
+}

리뷰: 따로 OutputView 클래스에 선언하는게 좀 더 적절해 보이네요 ㅎㅎ
@@ -1,5 +1,12 @@
+import EventController from "./controller/EventController.js";
+
 class App {
-  async run() {}
+  constructor() {
+    this.eventController = new EventController();
+  }
+  async run() {
+    await this.eventController.eventStart();
+  }
 }
 
 export default App;

리뷰: App 자체가 Controller라고 생각하고 구현을 하는 방법도 좋을 것 같습니다
@@ -0,0 +1,111 @@
+import { MENU, MESSAGE, ARRAY, CALENDAR, BENEFIT_AMOUNT, BADGE, BOUNDARY } from "../commons/constants.js";
+import Order from "./Order.js";
+import { getMenu, getMenuCount } from "../commons/utils.js";
+
+class Benefit {
+  #date;
+  #menu;
+  #order;
+  #benefitResult;
+
+  constructor(date, menu) {
+    this.#date = date;
+    this.#menu = menu;
+    this.#order = new Order(date, menu);
+  }
+
+  // 혜택 내역
+  benefitDetail() {
+    // benefitResult [ DDay | Weekday | Weekend | Special | Giveaway ]
+    this.#benefitResult = [0, 0, 0, 0, 0];
+
+    if (this.#isBenefit()) {
+      if (this.#isDDay()) this.#benefitResult[ARRAY.DDAY] = this.#applyDDay();
+      if (this.#isWeekday()) this.#benefitResult[ARRAY.WEEKDAY] = this.#applyWeekday();
+      if (this.#isWeekend()) this.#benefitResult[ARRAY.WEEKEND] = this.#applyWeekend();
+      if (this.#isSpecial()) this.#benefitResult[ARRAY.SPECIALDAY] = this.#applySpecial();
+      if (this.#isGiveaway()) this.#benefitResult[ARRAY.GIVEAWAY] = this.#applyGiveaway();
+    }
+
+    return this.#benefitResult;
+  }
+
+  // 총 혜택 금액
+  totalBenefit() {
+    let totalBenefit = 0;
+    this.#benefitResult.forEach((benefit) => {
+      totalBenefit += benefit;
+    });
+
+    return totalBenefit;
+  }
+
+  // 할인 후 예상 결제 금액
+  expectedAmount() {
+    const totalDiscount = this.totalBenefit() - this.#benefitResult[ARRAY.GIVEAWAY];
+
+    return this.#order.getAllAmount() - totalDiscount;
+  }
+
+  // 12월 이벤트 배지
+  eventBadge() {
+    const totalBenefit = this.totalBenefit();
+
+    if (!this.#isBenefit()) return MESSAGE.NOTHING;
+    if (totalBenefit <= BOUNDARY.STAR_PRICE) return BADGE.STAR;
+    if (totalBenefit <= BOUNDARY.TREE_PRICE) return BADGE.TREE;
+
+    return BADGE.SANTA;
+  }
+
+  #isBenefit() {
+    return this.#order.getAllAmount() > BOUNDARY.BENEFIT_PRICE;
+  }
+
+  #isDDay() {
+    return this.#date <= BOUNDARY.DDAY_END;
+  }
+
+  #isWeekday() {
+    return CALENDAR.WEEKDAY.includes(this.#date);
+  }
+
+  #isWeekend() {
+    return CALENDAR.WEEKEND.includes(this.#date);
+  }
+
+  #isSpecial() {
+    return CALENDAR.SPECIAL.includes(this.#date);
+  }
+
+  #isGiveaway() {
+    return this.#order.getAllAmount() >= BOUNDARY.GIVEAWAY_PRICE;
+  }
+
+  #applyDDay() {
+    let discount = BENEFIT_AMOUNT.DDAY_START;
+    for (let day = 1; day < this.#date; day++) {
+      discount += BENEFIT_AMOUNT.DDAY_PLUS;
+    }
+    return discount;
+  }
+
+  #applyWeekday() {
+    const menuCount = getMenuCount(getMenu(MENU.DESSERT), this.#menu);
+    return menuCount * BENEFIT_AMOUNT.WEEKDAY;
+  }
+
+  #applyWeekend() {
+    const menuCount = getMenuCount(getMenu(MENU.MAIN), this.#menu);
+    return menuCount * BENEFIT_AMOUNT.WEEKEND;
+  }
+
+  #applySpecial() {
+    return BENEFIT_AMOUNT.SPECIALDAY;
+  }
+
+  #applyGiveaway() {
+    return BENEFIT_AMOUNT.GIVEAWAY;
+  }
+}
+export default Benefit;

리뷰: benefitResult를 Obejct로 구현하면 좀 더 가독성이 좋지 않을까 싶습니다
@@ -0,0 +1,88 @@
+import Benefit from "../src/model/Benefit.js";
+import { orderIntoArray } from "../src/commons/utils.js";
+
+describe("Benefit 클래스 테스트(혜택 있는 경우)", () => {
+  //given
+  const date = "3";
+  const menu = orderIntoArray("티본스테이크-1,바비큐립-1,초코케이크-2,제로콜라-1");
+  const benefit = new Benefit(date, menu);
+
+  test("Benefit Detail(혜택 내역) 테스트", () => {
+    // when
+    const result = benefit.benefitDetail();
+    // then
+    const expected = [1200, 4046, 0, 1000, 25000];
+
+    expect(result).toEqual(expected);
+  });
+
+  test("Total Beneift(총 혜택 금액) 테스트", () => {
+    // when
+    const result = benefit.totalBenefit();
+    // then
+    const expected = 31246;
+
+    expect(result).toEqual(expected);
+  });
+
+  test("Expected Amount(예상 결제 금액) 테스트", () => {
+    // when
+    const result = benefit.expectedAmount();
+    // then
+    const expected = 135754;
+
+    expect(result).toEqual(expected);
+  });
+
+  test("Event Badge(이벤트 배지) 테스트", () => {
+    // when
+    const result = benefit.eventBadge();
+    // then
+    const expected = "산타";
+
+    expect(result).toEqual(expected);
+  });
+});
+
+describe("Benefit 클래스 테스트(혜택 없는 경우)", () => {
+  //given
+  const date = "26";
+  const menu = orderIntoArray("타파스-1,제로콜라-1");
+  const benefit = new Benefit(date, menu);
+
+  test("Benefit Detail(혜택 내역) 테스트", () => {
+    // when
+    const result = benefit.benefitDetail();
+    // then
+    const expected = [0, 0, 0, 0, 0];
+
+    expect(result).toEqual(expected);
+  });
+
+  test("Total Beneift(총 혜택 금액) 테스트", () => {
+    // when
+    const result = benefit.totalBenefit();
+    // then
+    const expected = 0;
+
+    expect(result).toEqual(expected);
+  });
+
+  test("Expected Amount(예상 결제 금액) 테스트", () => {
+    // when
+    const result = benefit.expectedAmount();
+    // then
+    const expected = 8500;
+
+    expect(result).toEqual(expected);
+  });
+
+  test("Event Badge(이벤트 배지) 테스트", () => {
+    // when
+    const result = benefit.eventBadge();
+    // then
+    const expected = "없음";
+
+    expect(result).toEqual(expected);
+  });
+});

리뷰: 테스트가 너무 한정되어 있는것 같습니다 test.each를 사용하여 좀 더 범위성 있게 테스트를 구현하는 방법이 좋을 것 같습니다
@@ -0,0 +1,63 @@
+import InputView from "../view/InputView.js";
+import OutputView from "../view/OutputView.js";
+import Order from "../model/Order.js";
+import Benefit from "../model/Benefit.js";
+import { print } from "../commons/utils.js";
+import { MENU } from "../commons/constants.js";
+
+class EventController {
+  #date;
+  #menu;
+
+  async eventStart() {
+    OutputView.printStart();
+
+    // 주문 정보 입력 & 주문 정보 출력
+    await this.#getOrderInformation();
+    OutputView.printOrderInformation(this.#date, this.#menu);
+
+    // 주문 클래스 생성 & 총 주문 금액 출력
+    const order = new Order(this.#date, this.#menu);
+    OutputView.printAllAmount(order.getAllAmount());
+
+    // 혜택 클래스 생성 & 혜택과 관련된 메세지 출력
+    const benefit = new Benefit(this.#date, this.#menu);
+    this.#printBenefit(benefit);
+  }
+
+  async #getOrderInformation() {
+    await this.#getDate();
+    await this.#getMenu();
+  }
+
+  async #getDate() {
+    while (true) {
+      try {
+        this.#date = await InputView.inputDate();
+        break;
+      } catch (error) {
+        print(error);
+      }
+    }
+  }
+
+  async #getMenu() {
+    while (true) {
+      try {
+        this.#menu = await InputView.inputMenu();
+        break;
+      } catch (error) {
+        print(error);
+      }
+    }
+  }
+
+  #printBenefit(benefit) {
+    OutputView.printGiveaway(benefit.benefitDetail()); // <증정 메뉴>
+    OutputView.printBenefitDetail(benefit.benefitDetail()); // <혜택 내역>
+    OutputView.printTotalBenefit(benefit.totalBenefit()); // <총 혜텍 금액>
+    OutputView.printExpectedAmount(benefit.expectedAmount()); // <할인 후 예상 결제 금액>
+    OutputView.printEventBadge(benefit.eventBadge()); // <12월 이벤트 배지>
+  }
+}
+export default EventController;

리뷰: 각각의 디렉토리에 index.js 를 추가하고, 공통되게 export 시키면, import 를 간단하게 할 수 있습니다!

*view/index.js*
```javascript
export {default as InputView.js} from './InputView.js'
export {default as OutputView.js} from './OutputView.js'
```

*EventController.js*
```javascript
import { InputView, OutputView } '../view/index.js'
```
@@ -0,0 +1,111 @@
+import { MENU, MESSAGE, ARRAY, CALENDAR, BENEFIT_AMOUNT, BADGE, BOUNDARY } from "../commons/constants.js";
+import Order from "./Order.js";
+import { getMenu, getMenuCount } from "../commons/utils.js";
+
+class Benefit {
+  #date;
+  #menu;
+  #order;
+  #benefitResult;
+
+  constructor(date, menu) {
+    this.#date = date;
+    this.#menu = menu;
+    this.#order = new Order(date, menu);
+  }
+
+  // 혜택 내역
+  benefitDetail() {
+    // benefitResult [ DDay | Weekday | Weekend | Special | Giveaway ]
+    this.#benefitResult = [0, 0, 0, 0, 0];
+
+    if (this.#isBenefit()) {
+      if (this.#isDDay()) this.#benefitResult[ARRAY.DDAY] = this.#applyDDay();
+      if (this.#isWeekday()) this.#benefitResult[ARRAY.WEEKDAY] = this.#applyWeekday();
+      if (this.#isWeekend()) this.#benefitResult[ARRAY.WEEKEND] = this.#applyWeekend();
+      if (this.#isSpecial()) this.#benefitResult[ARRAY.SPECIALDAY] = this.#applySpecial();
+      if (this.#isGiveaway()) this.#benefitResult[ARRAY.GIVEAWAY] = this.#applyGiveaway();
+    }
+
+    return this.#benefitResult;
+  }
+
+  // 총 혜택 금액
+  totalBenefit() {
+    let totalBenefit = 0;
+    this.#benefitResult.forEach((benefit) => {
+      totalBenefit += benefit;
+    });
+
+    return totalBenefit;
+  }
+
+  // 할인 후 예상 결제 금액
+  expectedAmount() {
+    const totalDiscount = this.totalBenefit() - this.#benefitResult[ARRAY.GIVEAWAY];
+
+    return this.#order.getAllAmount() - totalDiscount;
+  }
+
+  // 12월 이벤트 배지
+  eventBadge() {
+    const totalBenefit = this.totalBenefit();
+
+    if (!this.#isBenefit()) return MESSAGE.NOTHING;
+    if (totalBenefit <= BOUNDARY.STAR_PRICE) return BADGE.STAR;
+    if (totalBenefit <= BOUNDARY.TREE_PRICE) return BADGE.TREE;
+
+    return BADGE.SANTA;
+  }
+
+  #isBenefit() {
+    return this.#order.getAllAmount() > BOUNDARY.BENEFIT_PRICE;
+  }
+
+  #isDDay() {
+    return this.#date <= BOUNDARY.DDAY_END;
+  }
+
+  #isWeekday() {
+    return CALENDAR.WEEKDAY.includes(this.#date);
+  }
+
+  #isWeekend() {
+    return CALENDAR.WEEKEND.includes(this.#date);
+  }
+
+  #isSpecial() {
+    return CALENDAR.SPECIAL.includes(this.#date);
+  }
+
+  #isGiveaway() {
+    return this.#order.getAllAmount() >= BOUNDARY.GIVEAWAY_PRICE;
+  }
+
+  #applyDDay() {
+    let discount = BENEFIT_AMOUNT.DDAY_START;
+    for (let day = 1; day < this.#date; day++) {
+      discount += BENEFIT_AMOUNT.DDAY_PLUS;
+    }
+    return discount;
+  }
+
+  #applyWeekday() {
+    const menuCount = getMenuCount(getMenu(MENU.DESSERT), this.#menu);
+    return menuCount * BENEFIT_AMOUNT.WEEKDAY;
+  }
+
+  #applyWeekend() {
+    const menuCount = getMenuCount(getMenu(MENU.MAIN), this.#menu);
+    return menuCount * BENEFIT_AMOUNT.WEEKEND;
+  }
+
+  #applySpecial() {
+    return BENEFIT_AMOUNT.SPECIALDAY;
+  }
+
+  #applyGiveaway() {
+    return BENEFIT_AMOUNT.GIVEAWAY;
+  }
+}
+export default Benefit;

리뷰: ```javascript
this.#benefitResult = Array.from({length:5(혜택의 길이를 나타내는 상수로 수정)}, () => 0)

```

와 같이 바꾸는 것은 어떨까요?