Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
458390f
Docs: 구현할 기능 목록 작성
jisu-om Nov 10, 2023
dda1629
Docs: 구현할 기능 목록 수정
jisu-om Nov 10, 2023
93d479d
Test(visitingDateTest): 방문날짜 생성 관련 테스트코드 작성
jisu-om Nov 10, 2023
c4b3f57
Docs: README 수정
jisu-om Nov 10, 2023
7348967
Feat: 방문날짜(visitingDate 클래스) 생성
jisu-om Nov 10, 2023
5740eca
Test: 주문메뉴(orders) 테스트코드 작성
jisu-om Nov 10, 2023
2d8b947
Feat: 주문메뉴(orders)의 skeleton code 작성
jisu-om Nov 10, 2023
f316079
Test: 주문메뉴 하나(order)에 대한 테스트코드 작성
jisu-om Nov 10, 2023
2051bd8
Feat: orderItem, orders 구현, menu를 menuItem, menuCategory로 쪼개서 로직 수행이 …
jisu-om Nov 10, 2023
34278c2
Refactor: 주문메뉴(orders)에 대한 검증을 ordersValidationUtils에서 처리하도록 함
jisu-om Nov 10, 2023
d635d5a
Refactor: validationUtils로 검증로직 분리
jisu-om Nov 10, 2023
f6128a0
Test: priceService 테스트코드 작성
jisu-om Nov 10, 2023
2a2b914
Test: 혜택내역 처리하는 로직(eventService) 테스트코드 작성
jisu-om Nov 10, 2023
5964d2a
Test: 이벤트 배지 생성하는 서비스(badgeService) 테스트코드 작성
jisu-om Nov 10, 2023
b846c84
Feat(eventCondition, eventNames, discountAmount): 이벤트 적용 조건, 혜택을 enum…
jisu-om Nov 11, 2023
8a5315f
Refactor(discountAmount): 하드코딩된 부분 리팩토링
jisu-om Nov 11, 2023
8d32d1b
Rename: domain 패키지의 하위패키지 생성
jisu-om Nov 12, 2023
c72259d
Feat (badgeCondition): 이벤트배지 관련 enum 생성
jisu-om Nov 12, 2023
28e6c7b
Refactor (eventDetail): 이벤트 이름, 적용조건, 혜택을 eventDetail에서 관리하도록 리팩토링
jisu-om Nov 12, 2023
4dd2354
Feat(eventService): 적용되는 이벤트 찾는 기능 구현
jisu-om Nov 12, 2023
6db824c
Rename: dto 패키지의 위치 변경
jisu-om Nov 12, 2023
2aa1540
Refactor: eventService의 책임을 나눠갖는 eventFinder, eventBenefitCalculator …
jisu-om Nov 12, 2023
8040843
Feat(christmasController): 컨트롤러의 스켈레톤 코드 작성
jisu-om Nov 12, 2023
4cbd860
Feat: inputView, outputView 스켈레톤코드 생성, outputView로 전달하는 resultDto 생성
jisu-om Nov 12, 2023
7b72f51
Feat(badgeCondition, badgeGenerator): 이벤트 배지 정보를 반환하는 기능 구현
jisu-om Nov 12, 2023
c843042
Feat: resultDto를 어떻게 생성할지 고민하며 구조 변경 시도
jisu-om Nov 12, 2023
d7ee9a5
Feat(visitingDateInputHandler): 방문날짜를 입력받고 생성하는 기능 구현
jisu-om Nov 12, 2023
7478ce7
Feat(ordersInputHandler, orderItemDto, inputView): 메뉴와 개수를 입력받고 예외처리하…
jisu-om Nov 13, 2023
7104f84
Move: parser 위치 변경, 불필요한 import 제거
jisu-om Nov 13, 2023
1980077
Feat: 결과 시작 메세지를 출력하는 기능 구현
jisu-om Nov 13, 2023
ef144b0
Feat(outputView#printMenu, ordersDto): 주문 메뉴 출력 구현
jisu-om Nov 13, 2023
faf7180
Feat(outputView#printOriginalTotalAmount): 할인 전 총주문 금액 출력하는 기능 구현
jisu-om Nov 13, 2023
31756da
Feat(outputView#printGiveAway): 증정메뉴 출력 기능 구현
jisu-om Nov 13, 2023
621f1e5
Feat(eventDetailDto, matchingEventsDto, outputView): 혜택내역 출력 기능 구현
jisu-om Nov 13, 2023
0b459f4
Feat(matchingEvents, outputView): 총혜택금액 출력 기능 구현
jisu-om Nov 13, 2023
199decb
Feat(outputView#printDiscountedTotalAmount): 할인 후 예상 결제 금액 출력 기능 구현
jisu-om Nov 13, 2023
beed5d2
Feat(outputView#printBadge): 12월 이벤트배지 출력 기능 구현
jisu-om Nov 13, 2023
8ba6c6b
Refactor(christmasController): 메서드 분리, 책임의 분리-christmasManager에게 위임
jisu-om Nov 13, 2023
1674d67
Feat: 출력 시 줄바꿈, 오류 수정
jisu-om Nov 13, 2023
4aa7987
Refactor(outputView#printResult): 컨트롤러에서 일일이 호출하는게 아니라 outputView에서 d…
jisu-om Nov 13, 2023
cb8a590
Feat: 출력 다른 부분 outputView 수정
jisu-om Nov 13, 2023
6c0699a
Refactor(outputViewMessageConstants): outputView에서 사용하는 메세지(상수)를 다른 곳…
jisu-om Nov 13, 2023
707987c
Style: 줄바꿈 수정
jisu-om Nov 13, 2023
5c95e7a
Refactor(eventDetail, discountConstants): 금액 조건을 상수로 처리
jisu-om Nov 13, 2023
463b869
Refactor(outputView): 천단위구분기호 코드 수정, 중복 제거하여 일관성 있도록 리팩토링
jisu-om Nov 13, 2023
bda4060
Refactor(eventDetail): 날짜조건(dateCondition) 표현 방식 변경
jisu-om Nov 13, 2023
c9c4a1e
Refactor(benefitCalculator): matchingEvents는 이벤트들만 관리하도록 책임을 쪼개서 분리함
jisu-om Nov 13, 2023
f6b82a8
Feat(orders#countOrderItemByCategory): 평일,주말할인 메뉴개수만큼 적용되도록 함
jisu-om Nov 13, 2023
16b5a90
Feat: 시작메세지에 format 오류 변경
jisu-om Nov 13, 2023
f48514a
Refactor(orderItem#calculateItemOriginalPrice): 메서드 이름 변경
jisu-om Nov 13, 2023
6c06c6c
Rename: service 패키지에서 각 도메인에 해당하는 패키지로 옮김
jisu-om Nov 14, 2023
6767d11
Test(eventDetailTest): 테스트코드 작성
jisu-om Nov 14, 2023
d3eef97
Test(badgeGeneratorTest): 테스트코드 작성
jisu-om Nov 14, 2023
1ebd858
Test(benefitCalculatorTest): 테스트코드 작성
jisu-om Nov 14, 2023
dbfde2c
Refactor(benefitCalculator): static 메서드로만 구성된 클래스로 리팩토링
jisu-om Nov 14, 2023
bc84751
Test(matchingEventsTest): 테스트코드 작성
jisu-om Nov 14, 2023
22388c9
Test(orderItemTest): 테스트코드 작성
jisu-om Nov 14, 2023
4d2c39f
Test(ordersTest): 테스트코드 수정
jisu-om Nov 14, 2023
e58a4a7
Refactor(christmasManager): date, orders로 계산할 수 있기에 matchingEvents를 인…
jisu-om Nov 14, 2023
f511aa4
Refactor: matchingEventsDto -> resultDto 로 이름 변경
jisu-om Nov 14, 2023
50f2acf
Refactor: eventDetailDto -> matchingEvent 도메인 객체로 변경
jisu-om Nov 14, 2023
d04ecfa
Refactor: 구조변경, resultDto의 생성 로직 변경, matchingEventDto 추가
jisu-om Nov 14, 2023
d1e7646
Test(matchingEventsTest): 테스트코드 수정
jisu-om Nov 14, 2023
623d930
Test(matchingEventTest): 테스트코드 생성
jisu-om Nov 14, 2023
096e0b2
Style: 코드 포맷 정리
jisu-om Nov 14, 2023
f291f05
Refactor(matchingEvents#findBadgeName): badgeCondition 테스트코드 작성하다가 리팩…
jisu-om Nov 14, 2023
044843e
Test(eventDetailTest): 테스트코드 작성
jisu-om Nov 14, 2023
e14a14c
Test(menuItemTest): 테스트코드 작성
jisu-om Nov 14, 2023
fd02ff8
Style: 코드 포맷 최적화
jisu-om Nov 14, 2023
0673753
Style(matchingEvents): 메서드 순서 변경
jisu-om Nov 15, 2023
e1cea10
Refactor(matchingEvent): enum을 static import 하여 사용
jisu-om Nov 15, 2023
d2cb171
Refactor(orders#provideOrderItems): 메서드 이름 수정, 깊은 복사로 수정
jisu-om Nov 15, 2023
6b59e94
Refactor(orderItem): 인자명 수정
jisu-om Nov 15, 2023
34149ba
Refactor(errorMessage): 사용 안하는 에러메세지 삭제
jisu-om Nov 15, 2023
e4bf21e
Test(ordersInputHandlerTest): 테스트코드 작성
jisu-om Nov 15, 2023
5fcf9f6
Test(visitingDateInputHandlerTest): 테스트코드 작성
jisu-om Nov 15, 2023
2c82df4
Style: 불필요한 import 제거
jisu-om Nov 15, 2023
aa69771
Test: ui 로직 관련된 테스트 삭제
jisu-om Nov 15, 2023
6b09fbc
Rename(orders): menuCategory, menuItem을 관련성이 높은 orders 하위로 옮김
jisu-om Nov 15, 2023
40e798c
Refactor(visitingDate#provideDate): getter 말고 다른 이름으로 변경
jisu-om Nov 15, 2023
2c85a8f
Refactor(matchingEvent#provideEventName,provideBenefitAmount): getter…
jisu-om Nov 15, 2023
3ed8499
Refactor: inputHandler 삭제하고 supplier 사용해서 입력값 받아옴
jisu-om Nov 17, 2023
7d4b1f6
Refactor(badgeCondition): maxCondition 필드 삭제, minCondition으로만 해당하는 배지…
jisu-om Nov 17, 2023
2516698
Refactor(visitingDate, eventDetail): visitingDate가 객체로서 일하도록 리팩토링, 평일…
jisu-om Nov 17, 2023
bf119a1
Refactor(benefitConstants): discountConstants -> benefitConstants로 이름…
jisu-om Nov 17, 2023
917f3ee
Rename: constants 패키지를 domain 하위 패키지로 변경
jisu-om Nov 17, 2023
8fdae14
Refactor: 에러 수정, resultDto의 필드 변경(할인후예상결제금액 추가)
jisu-om Nov 17, 2023
4b9c148
Rename(utils): validationUtils에서 utils 로 패키지명 변경
jisu-om Nov 17, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
126 changes: 126 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
# 구현 기능 목록


- [X] 이벤트 플래너 시작 메세지를 출력한다.
```
안녕하세요! 우테코 식당 12월 이벤트 플래너입니다.
```


- [X] 방문 날짜를 입력받고 예외 처리 한다.
- [X] 예외 처리
1. [X] 1 이상 31 이하의 숫자가 아닌 경우
"[ERROR] 유효하지 않은 날짜입니다. 다시 입력해 주세요." 예외메세지 출력
+ [X] 모든 에러 메시지는 "[ERROR]"로 시작
```
12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)
```


- [X] 메뉴와 개수를 입력받고 예외 처리 한다.
- [X] 예외 처리
1. [X] 고객이 메뉴판에 없는 메뉴를 입력하는 경우
"[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."
2. [X] 메뉴의 개수는 1 이상의 숫자가 아닌 경우
"[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."
3. [X] 메뉴 형식이 예시와 다른 경우
"[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."
4. [X] 중복 메뉴를 입력한 경우(e.g. 시저샐러드-1,시저샐러드-1)
"[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."
5. [X] 음료만 주문한 경우
"[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."
6. [X] 메뉴 총개수가 20개 초과인 경우
"[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."
+ [X] 모든 에러 메시지는 "[ERROR]"로 시작
```
주문하실 메뉴를 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)
```


- [X] 결과 시작 메세지를 출력한다.

```
12월 26일에 우테코 식당에서 받을 이벤트 혜택 미리 보기!

```


- [X] 주문 메뉴를 출력한다.
- 출력 순서는 자유롭게


- [X] 할인 전 총주문 금액을 계산한다.


- [X] 할인 전 총주문 금액을 출력한다.


- [X] 적용되는 이벤트를 계산한다.


- [X] 증정 메뉴를 출력한다.
- [X] 증정 이벤트에 해당하지 않는 경우, 증정 메뉴 "없음" 출력


- [X] 혜택 내역을 출력한다.
- [X] 고객에게 적용된 이벤트만 출력
- [X] 적용된 이벤트가 하나도 없다면 혜택 내역 "없음"으로 출력
- [X] 혜택 내역에 여러 개의 이벤트가 적용된 경우, 출력 순서는 자유롭게 출력


- [X] 할인 받는 금액을 계산한다.


- [X] 총혜택 금액을 출력한다.
- 총혜택 금액 = 할인 금액의 합계 + 증정 메뉴의 가격


- [X] 할인 후 예상 결제 금액을 출력한다.
- 할인 후 예상 결제 금액 = 할인 전 총주문 금액 - 할인 금액


- [X] 12월 이벤트 배지를 출력한다.
- 총혜택 금액에 따라 이벤트 배지의 이름을 다르게 출력


- [X] 예외 처리 관련
- IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.


---
### 전체 출력 예시
```
안녕하세요! 우테코 식당 12월 이벤트 플래너입니다.
12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)
3
주문하실 메뉴를 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)
티본스테이크-1,바비큐립-1,초코케이크-2,제로콜라-1
12월 3일에 우테코 식당에서 받을 이벤트 혜택 미리 보기!

<주문 메뉴>
티본스테이크 1개
바비큐립 1개
초코케이크 2개
제로콜라 1개

<할인 전 총주문 금액>
142,000원

<증정 메뉴>
샴페인 1개

<혜택 내역>
크리스마스 디데이 할인: -1,200원
평일 할인: -4,046원
특별 할인: -1,000원
증정 이벤트: -25,000원

<총혜택 금액>
-31,246원

<할인 후 예상 결제 금액>
135,754원

<12월 이벤트 배지>
산타
```
11 changes: 9 additions & 2 deletions src/main/java/christmas/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
package christmas;

import camp.nextstep.edu.missionutils.Console;
import christmas.controller.ChristmasController;
import christmas.view.InputView;
import christmas.view.OutputView;

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현
ChristmasController christmasController = ChristmasController.of(InputView.getInstance(), OutputView.getInstance());
christmasController.run();
Console.close();
}
}
}
79 changes: 79 additions & 0 deletions src/main/java/christmas/controller/ChristmasController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package christmas.controller;

import christmas.domain.orders.OrderItem;
import christmas.domain.orders.Orders;
import christmas.domain.visitingDate.VisitingDate;
import christmas.dto.OrderItemDto;
import christmas.dto.OrdersDto;
import christmas.dto.ResultDto;
import christmas.service.ChristmasManager;
import christmas.view.InputView;
import christmas.view.OutputView;

import java.util.List;
import java.util.function.Supplier;

public class ChristmasController {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 컨트롤러에 모든 비즈니스 로직의 운영 책임이 몰려있군요!
그렇다면, 컨트롤러 Layer에서 단위테스트를 계획하게 된다면, 문제가 발생하지 않을까요?
단위테스트를 계획했지만, 실상 통합테스트 환경에서 테스트하게 되니까요!

private final InputView inputView;
private final OutputView outputView;
private ChristmasManager christmasManager;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VisitingDateInputHandler 와 OrdersInputHandler 는 어떤 이유에서 final 처리 하지 않은 것인지 궁금합니다!


private ChristmasController(InputView inputView, OutputView outputView) {
this.inputView = inputView;
this.outputView = outputView;
}

public static ChristmasController of(InputView inputView, OutputView outputView) {
return new ChristmasController(inputView, outputView);
}

public void run() {
initializeChristmasManager();
printOrders();
printResult();
}

private void initializeChristmasManager() {
outputView.printStart();
VisitingDate date = createVisitingDate();
Orders orders = createOrders();
christmasManager = ChristmasManager.of(date, orders);
outputView.printResultStart(date.provideDate());
}

private VisitingDate createVisitingDate() {
return readUserInput(() -> {
int input = inputView.readVisitingDate();
return VisitingDate.from(input);
});
}

private Orders createOrders() {
return readUserInput(() -> {
List<OrderItem> items = inputView.readOrders().stream()
.map(OrderItemDto::toOrderItem)
.toList();
return Orders.from(items);
});
}

private <T> T readUserInput(Supplier<T> supplier) {
while (true) {
try {
return supplier.get();
} catch (IllegalArgumentException e) {
outputView.printError(e.getMessage());
}
}
}

private void printOrders() {
OrdersDto ordersDto = christmasManager.createOrdersDto();
outputView.printMenu(ordersDto);
}

private void printResult() {
ResultDto resultDto = christmasManager.createResultDto();
outputView.printResult(resultDto);
}
}
33 changes: 33 additions & 0 deletions src/main/java/christmas/domain/badge/BadgeCondition.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package christmas.domain.badge;

import java.util.Arrays;

public enum BadgeCondition {
NONE("없음", 0L),
STAR("별", 5_000L),
TREE("트리", 10_000L),
SANTA("산타", 20_000L);

private final String badgeName;
private final long minCondition;

BadgeCondition(String badgeName, long minCondition) {
this.badgeName = badgeName;
this.minCondition = minCondition;
}

public static BadgeCondition findBadgeByCondition(long totalBenefitAmount) {
return Arrays.stream(BadgeCondition.values())
.filter(badge -> totalBenefitAmount >= badge.getMinCondition())
.findFirst()
.orElse(NONE);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 로직에서는 음수인 값이( 입력 예외 상황 ) 들어오면 배지가 없음을 나타내는 식으로 구현하셨는데,
이 때 예외 값도 던져주고 호출하는 쪽에서 처리해줘도 좋았을 거 같아요!
물론 안정적이고 너무 좋은 코드라 생각합니다.

}

public String getBadgeName() {
return badgeName;
}

public long getMinCondition() {
return minCondition;
}
}
14 changes: 14 additions & 0 deletions src/main/java/christmas/domain/constants/BenefitConstants.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package christmas.domain.constants;

import christmas.domain.orders.MenuItem;

public final class BenefitConstants {
public static final long BASE_DISCOUNT = 1_000L;
public static final long CHRISTMAS_RATE = 100L;
public static final long DAILY_RATE = 2_023L;
public static final long BASE_PRICE_CONDITION = 10_000L;
public static final long GIVE_AWAY_PRICE_CONDITION = 120_000L;
public static final long GIVE_AWAY_PRICE = MenuItem.샴페인.getPrice();
public static final String GIVE_AWAY_ITEM = MenuItem.샴페인.name();
public static final int GIVE_AWAY_QUANTITY = 1;
}
7 changes: 7 additions & 0 deletions src/main/java/christmas/domain/constants/DateConstants.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package christmas.domain.constants;

public final class DateConstants {
public static final int EVENT_START = 1;
public static final int EVENT_END = 31;
public static final int CHRISTMAS_EVENT_END = 25;
}
85 changes: 85 additions & 0 deletions src/main/java/christmas/domain/event/EventDetail.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package christmas.domain.event;

import christmas.domain.orders.Orders;
import christmas.domain.visitingDate.VisitingDate;

import java.util.Arrays;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;

import static christmas.domain.constants.DateConstants.*;
import static christmas.domain.constants.BenefitConstants.*;
import static christmas.domain.orders.MenuCategory.DESSERT;
import static christmas.domain.orders.MenuCategory.MAIN;

public enum EventDetail {
CHRISTMAS_D_DAY(
"크리스마스 디데이 할인",
VisitingDate::isChristmasEventActive,
BASE_PRICE_CONDITION,
orders -> true,
(date, orders) -> BASE_DISCOUNT + calculatePassedDays(date) * CHRISTMAS_RATE),
WEEKDAYS(
"평일 할인",
VisitingDate::isWeekday,
BASE_PRICE_CONDITION,
orders -> orders.existsOrderItemByCategory(DESSERT),
(date, orders) -> orders.countOrderItemByCategory(DESSERT) * DAILY_RATE),
WEEKENDS(
"주말 할인",
VisitingDate::isWeekend,
BASE_PRICE_CONDITION,
orders -> orders.existsOrderItemByCategory(MAIN),
(date, orders) -> orders.countOrderItemByCategory(MAIN) * DAILY_RATE),
SPECIAL(
"특별 할인",
VisitingDate::isSpecialDay,
BASE_PRICE_CONDITION,
orders -> true,
(date, orders) -> BASE_DISCOUNT),
GIVE_AWAY(
"증정 이벤트",
VisitingDate::meetsGiveAwayDateCondition,
GIVE_AWAY_PRICE_CONDITION,
orders -> true,
(date, orders) -> GIVE_AWAY_PRICE);

private final String eventName;
private final Predicate<VisitingDate> dateCondition;
private final long priceCondition;
private final Function<Orders, Boolean> itemCondition;
private final BiFunction<VisitingDate, Orders, Long> benefitCalculator;

EventDetail(String eventName, Predicate<VisitingDate> dateCondition, long priceCondition,
Function<Orders, Boolean> itemCondition,
BiFunction<VisitingDate, Orders, Long> benefitCalculator) {
this.eventName = eventName;
this.dateCondition = dateCondition;
this.priceCondition = priceCondition;
this.itemCondition = itemCondition;
this.benefitCalculator = benefitCalculator;
}

private static long calculatePassedDays(VisitingDate date) {
return date.provideDate() - EVENT_START;
}

public static List<MatchingEvent> findByCondition(VisitingDate date, Orders orders) {
return Arrays.stream(EventDetail.values())
.filter(condition -> condition.dateCondition.test(date))
.filter(condition -> orders.calculateOriginalTotalAmount() >= condition.priceCondition)
.filter(condition -> condition.itemCondition.apply(orders))
.map(eventDetail -> MatchingEvent.of(eventDetail, eventDetail.calculateBenefitAmount(date, orders)))
.toList();
}

private long calculateBenefitAmount(VisitingDate date, Orders orders) {
return benefitCalculator.apply(date, orders);
}

public String getEventName() {
return eventName;
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이벤트를 이렇게 Enum으로 싹다 모아서 관리하니 너무 보기 편하고 응집되어 있는 코드 느낌이 나네요.
배워갑니다!

Loading