ewhk9887/korean_code_reviews_from_github huggingface dataset:
@@ -0,0 +1,59 @@
+package christmas.utils
+
+object Constant {
+    /* Model */
+    const val FIRST_DAY_DISCOUNT_AMOUNT = 1_000
+    const val DAILY_DISCOUNT_AMOUNT = 100
+    const val ONE_DAY_DECREASE = 1
+    const val WEEK_DISCOUNT_AMOUNT = 2_023
+    const val CHRISTMAS_DAY_DISCOUNT_AMOUNT = 1_000
+    const val CHAMPAGNE_CONDITION_AMOUNT = 120_000
+    const val CHRISTMAS_DAY = 25
+    const val DISCOUNT_THRESHOLD = 10_000
+    const val EMPTY = 0
+    const val BADGE_STAR = "별"
+    const val BADGE_TREE = "트리"
+    const val BADGE_SANTA = "산타"
+    const val NONE = "없음"
+    const val STAR_MIN = 5_000
+    const val STAR_MAX = 9_999
+    const val TREE_MIN = 10_000
+    const val TREE_MAX = 19_999
+    const val SANTA_MIN = 20_000
+    const val FIRST_INDEX = 0
+    const val SECOND_INDEX = 1
+
+    /* Validate */
+    const val ORDER_ITEMS_SIZE = 2
+    const val VISIT_DATE_MIN = 1
+    const val VISIT_DATE_MAX = 31
+    const val QUANTITY_MINIMUM = 1
+    const val QUANTITY_MAXIMUM = 20
+    const val HYPHEN = "-"
+    const val COMMA = ","
+    const val NUMERIC_REGEX = "^\\d+$"
+    private const val ERROR_MESSAGE_PREFIX = "[ERROR] "
+    const val ERROR_MESSAGE_INPUT_VISIT_DATE = ERROR_MESSAGE_PREFIX + "유효하지 않은 날짜입니다. 다시 입력해 주세요."
+    const val ERROR_MESSAGE_INPUT_MENU = ERROR_MESSAGE_PREFIX + "유효하지 않은 주문입니다. 다시 입력해 주세요."
+
+    /* InputView */
+    const val VISIT_DATE_ANNOUNCE_MESSAGE = "12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)"
+    const val MENU_ANNOUNCE_MESSAGE = "주문하실 메뉴를 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)"
+
+    /* OutPutView */
+    private const val PRINT_ENTER = "\n"
+    const val START_PLANNER_MESSAGE = "안녕하세요! 우테코 식당 12월 이벤트 플래너입니다."
+    const val PREVIEW_ANNOUNCE_MESSAGE = "12월 %d일에 우테코 식당에서 받을 이벤트 혜택 미리 보기!"
+    const val ORDER_MENU_TITLE_MESSAGE = "$PRINT_ENTER<주문 메뉴>"
+    const val ITEMS_RESULT = "%s %d개"
+    const val TOTAL_ORDER_SUM_TITLE_MESSAGE = "$PRINT_ENTER<할인 전 총주문 금액>"
+    const val TOTAL_AMOUNT_RESULT = "%,d원"
+    const val PRESENT_MENU_TITLE_MESSAGE = "$PRINT_ENTER<증정 메뉴>"
+    const val PRESENT_AMOUNT = 1
+    const val BENEFIT_DETAILS_TITLE_MESSAGE = "$PRINT_ENTER<혜택 내역>"
+    const val FREEBIE_EVENT_NAME = "증정 이벤트"
+    const val BENEFIT_RESULT = "%s: -%,d원"
+    const val BENEFIT_AMOUNT_TITLE_MESSAGE = "$PRINT_ENTER<총혜택 금액>"
+    const val PAYMENT_AMOUNT_TITLE_MESSAGE = "$PRINT_ENTER<할인 후 예상 결제 금액>"
+    const val BADGE_TITLE_MESSAGE = "$PRINT_ENTER<12월 이벤트 배지>"
+}
\ No newline at end of file

리뷰: 저는 개인적으로 이런 경우에는, Constants 파일 안에 object를 여러개 두는 편이에요!!
예시로
```
object Model {
    const val FIRST_DAY_DISCOUNT_AMOUNT = 1_000
    const val DAILY_DISCOUNT_AMOUNT = 100 ...
}

object Validate {
    const val ORDER_ITEMS_SIZE = 2
    const val VISIT_DATE_MIN = 1....
}
```
이런 식으로 하면 주석을 안 달아도 되어요!!
@@ -0,0 +1,79 @@
+package christmas.model
+
+import christmas.utils.Constant.BADGE_SANTA
+import christmas.utils.Constant.BADGE_STAR
+import christmas.utils.Constant.BADGE_TREE
+import christmas.utils.Constant.CHAMPAGNE_CONDITION_AMOUNT
+import christmas.utils.Constant.CHRISTMAS_DAY_DISCOUNT_AMOUNT
+import christmas.utils.Constant.DAILY_DISCOUNT_AMOUNT
+import christmas.utils.Constant.FIRST_DAY_DISCOUNT_AMOUNT
+import christmas.utils.Constant.EMPTY
+import christmas.utils.Constant.NONE
+import christmas.utils.Constant.ONE_DAY_DECREASE
+import christmas.utils.Constant.SANTA_MIN
+import christmas.utils.Constant.STAR_MAX
+import christmas.utils.Constant.STAR_MIN
+import christmas.utils.Constant.TREE_MAX
+import christmas.utils.Constant.TREE_MIN
+import christmas.utils.Constant.WEEK_DISCOUNT_AMOUNT
+
+class DecemberEvent {
+    fun applyTheDayDiscount(date: Int): Int {
+        val dailyDiscount = (date - ONE_DAY_DECREASE) * DAILY_DISCOUNT_AMOUNT
+
+        return FIRST_DAY_DISCOUNT_AMOUNT + dailyDiscount
+    }
+
+    fun applyWeekdayDiscount(orderMenu: List<OrderItems>): Int {
+        var dessertMenuCount = EMPTY
+
+        for (item in orderMenu) {
+            val increaseCount = increaseDessertMenuCount(item.getMenuName(), item.getQuantity())
+            dessertMenuCount += increaseCount
+        }
+
+        return dessertMenuCount * WEEK_DISCOUNT_AMOUNT
+    }
+
+    private fun increaseDessertMenuCount(menuName: String, quantity: Int): Int {
+        if (menuName == StoreMenu.CHOCO_CAKE.menuName || menuName == StoreMenu.ICE_CREAM.menuName)
+            return quantity
+
+        return EMPTY
+    }
+
+
+    fun applyWeekendDiscount(orderMenu: List<OrderItems>): Int {
+        var mainMenuCount = EMPTY
+
+        for (item in orderMenu) {
+            val increaseCount = increaseMainMenuCount(item.getMenuName(), item.getQuantity())
+            mainMenuCount += increaseCount
+        }
+
+        return mainMenuCount * WEEK_DISCOUNT_AMOUNT
+    }
+
+    private fun increaseMainMenuCount(menuName: String, quantity: Int): Int {
+        if (menuName == StoreMenu.T_BONE_STEAK.menuName || menuName == StoreMenu.BBQ_RIBS.menuName ||
+            menuName == StoreMenu.SEAFOOD_PASTA.menuName || menuName == StoreMenu.CHRISTMAS_PASTA.menuName
+        )
+            return quantity
+
+        return EMPTY
+    }
+
+    fun applySpecialDiscount(): Int = CHRISTMAS_DAY_DISCOUNT_AMOUNT
+
+    fun presentChampagne(totalOrderAmount: Int): Boolean = totalOrderAmount >= CHAMPAGNE_CONDITION_AMOUNT
+
+    fun assignBadge(benefitAmount: Int): String {
+        when {
+            benefitAmount in STAR_MIN..STAR_MAX -> return BADGE_STAR
+            benefitAmount in TREE_MIN..TREE_MAX -> return BADGE_TREE
+            benefitAmount >= SANTA_MIN -> return BADGE_SANTA
+        }
+
+        return NONE
+    }
+}
\ No newline at end of file

리뷰: 이거 
return when{
어쩌고 저쩌고
else -> NONE
}
이렇게도 쓸 수 있는 걸루 알아요!
@@ -0,0 +1,43 @@
+package christmas.model
+
+import christmas.utils.Constant.CHRISTMAS_DAY
+import christmas.utils.Constant.EMPTY
+
+enum class DiscountType(val eventName: String) {
+    THE_DAY_DISCOUNT("크리스마스 디데이 할인"),
+    WEEKDAY_DISCOUNT("평일 할인"),
+    WEEKEND_DISCOUNT("주말 할인"),
+    SPECIAL_DISCOUNT("특별 할인");
+
+    companion object {
+        private val decemberEvent = DecemberEvent()
+
+        fun requestTheDayDiscount(visitDate: Int): Int {
+            if (visitDate <= CHRISTMAS_DAY)
+                return decemberEvent.applyTheDayDiscount(visitDate)
+
+            return EMPTY
+        }
+
+        fun requestWeekdayDiscount(visitDate: Int, orderMenu: List<OrderItems>): Int {
+            if (visitDate in DecemberCalender.WEEKDAY.dates)
+                return decemberEvent.applyWeekdayDiscount(orderMenu)
+
+            return EMPTY
+        }
+
+        fun requestWeekendDiscount(visitDate: Int, orderMenu: List<OrderItems>): Int {
+            if (visitDate in DecemberCalender.WEEKEND.dates)
+                return decemberEvent.applyWeekendDiscount(orderMenu)
+
+            return EMPTY
+        }
+
+        fun requestSpecialDiscount(visitDate: Int): Int {
+            if (visitDate in DecemberCalender.SPECIAL_DAY.dates)
+                return decemberEvent.applySpecialDiscount()
+
+            return EMPTY
+        }
+    }
+}
\ No newline at end of file

리뷰: enum class 속 companion object는 어떤 역할을 하나요? 잘 몰라서 물어봅니다 😓
@@ -0,0 +1,59 @@
+package christmas.utils
+
+object Constant {
+    /* Model */
+    const val FIRST_DAY_DISCOUNT_AMOUNT = 1_000
+    const val DAILY_DISCOUNT_AMOUNT = 100
+    const val ONE_DAY_DECREASE = 1
+    const val WEEK_DISCOUNT_AMOUNT = 2_023
+    const val CHRISTMAS_DAY_DISCOUNT_AMOUNT = 1_000
+    const val CHAMPAGNE_CONDITION_AMOUNT = 120_000
+    const val CHRISTMAS_DAY = 25
+    const val DISCOUNT_THRESHOLD = 10_000
+    const val EMPTY = 0
+    const val BADGE_STAR = "별"
+    const val BADGE_TREE = "트리"
+    const val BADGE_SANTA = "산타"
+    const val NONE = "없음"
+    const val STAR_MIN = 5_000
+    const val STAR_MAX = 9_999
+    const val TREE_MIN = 10_000
+    const val TREE_MAX = 19_999
+    const val SANTA_MIN = 20_000
+    const val FIRST_INDEX = 0
+    const val SECOND_INDEX = 1
+
+    /* Validate */
+    const val ORDER_ITEMS_SIZE = 2
+    const val VISIT_DATE_MIN = 1
+    const val VISIT_DATE_MAX = 31
+    const val QUANTITY_MINIMUM = 1
+    const val QUANTITY_MAXIMUM = 20
+    const val HYPHEN = "-"
+    const val COMMA = ","
+    const val NUMERIC_REGEX = "^\\d+$"
+    private const val ERROR_MESSAGE_PREFIX = "[ERROR] "
+    const val ERROR_MESSAGE_INPUT_VISIT_DATE = ERROR_MESSAGE_PREFIX + "유효하지 않은 날짜입니다. 다시 입력해 주세요."
+    const val ERROR_MESSAGE_INPUT_MENU = ERROR_MESSAGE_PREFIX + "유효하지 않은 주문입니다. 다시 입력해 주세요."
+
+    /* InputView */
+    const val VISIT_DATE_ANNOUNCE_MESSAGE = "12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)"
+    const val MENU_ANNOUNCE_MESSAGE = "주문하실 메뉴를 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)"
+
+    /* OutPutView */
+    private const val PRINT_ENTER = "\n"
+    const val START_PLANNER_MESSAGE = "안녕하세요! 우테코 식당 12월 이벤트 플래너입니다."
+    const val PREVIEW_ANNOUNCE_MESSAGE = "12월 %d일에 우테코 식당에서 받을 이벤트 혜택 미리 보기!"
+    const val ORDER_MENU_TITLE_MESSAGE = "$PRINT_ENTER<주문 메뉴>"
+    const val ITEMS_RESULT = "%s %d개"
+    const val TOTAL_ORDER_SUM_TITLE_MESSAGE = "$PRINT_ENTER<할인 전 총주문 금액>"
+    const val TOTAL_AMOUNT_RESULT = "%,d원"
+    const val PRESENT_MENU_TITLE_MESSAGE = "$PRINT_ENTER<증정 메뉴>"
+    const val PRESENT_AMOUNT = 1
+    const val BENEFIT_DETAILS_TITLE_MESSAGE = "$PRINT_ENTER<혜택 내역>"
+    const val FREEBIE_EVENT_NAME = "증정 이벤트"
+    const val BENEFIT_RESULT = "%s: -%,d원"
+    const val BENEFIT_AMOUNT_TITLE_MESSAGE = "$PRINT_ENTER<총혜택 금액>"
+    const val PAYMENT_AMOUNT_TITLE_MESSAGE = "$PRINT_ENTER<할인 후 예상 결제 금액>"
+    const val BADGE_TITLE_MESSAGE = "$PRINT_ENTER<12월 이벤트 배지>"
+}
\ No newline at end of file

리뷰: 이렇게도 쓸 수 있군요! 
저는 이런식으로 썼어요!
```
enum class ErrorMessage(private val message: String) {
    ERROR_MENU_INPUT("유효하지 않은 주문입니다. 다시 입력해 주세요."),
    ERROR_INPUT_DAY("유효하지 않은 날짜입니다. 다시 입력해 주세요.");

    fun getMessage(): String = "[ERROR] $message"
}
```
@@ -0,0 +1,10 @@
+package christmas.model
+
+data class OrderItems(
+    private val menuName: String,
+    private val quantity: Int
+) {
+    fun getMenuName(): String = menuName
+
+    fun getQuantity(): Int = quantity
+}

리뷰: val 선언 때문에 따로 private로 제한하지 않아도 값 수정이 불가능할텐데, 혹시 private로 선언한 이유가 따로 있을까요..?!
@@ -0,0 +1,56 @@
+package christmas
+
+import christmas.model.DecemberEvent
+import christmas.model.OrderItems
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Test
+
+class DecemberEventTest {
+    private val decemberEvent: DecemberEvent = DecemberEvent()
+
+    @Test
+    fun `디데이 할인 금액 테스트`() {
+        val discountAmount = decemberEvent.applyTheDayDiscount(25)
+
+        Assertions.assertTrue(discountAmount == 3400)
+    }
+
+    @Test
+    fun `평일 할인 금액 테스트`() {
+        val discountAmount = decemberEvent.applyWeekdayDiscount(listOf(OrderItems("초코케이크", 2), OrderItems("해산물파스타", 3)))
+
+        Assertions.assertTrue(discountAmount == 4046)
+    }
+
+    @Test
+    fun `주말 할인 금액 테스트`() {
+        val discountAmount = decemberEvent.applyWeekendDiscount(listOf(OrderItems("초코케이크", 2), OrderItems("해산물파스타", 3)))
+
+        Assertions.assertTrue(discountAmount == 6069)
+    }
+
+    @Test
+    fun `특별 할인 금액 테스트`() {
+        val discountAmount = decemberEvent.applySpecialDiscount()
+
+        Assertions.assertTrue(discountAmount == 1000)
+    }
+
+    @Test
+    fun `샴페인 증정 테스트`() {
+        Assertions.assertTrue(decemberEvent.presentChampagne(130_000))
+    }
+
+    @Test
+    fun `배지 부여 테스트`() {
+        val noneBadge = decemberEvent.assignBadge(0)
+        val starBadge = decemberEvent.assignBadge(5000)
+        val treeBadge = decemberEvent.assignBadge(10000)
+        val santaBadge = decemberEvent.assignBadge(200000)
+
+        Assertions.assertTrue(noneBadge == "없음")
+        Assertions.assertTrue(starBadge == "별")
+        Assertions.assertTrue(treeBadge == "트리")
+        Assertions.assertTrue(santaBadge == "산타")
+    }
+}
\ No newline at end of file

리뷰: 이 부분도 decemberEvent.assignBadge가 반복되기 때문에 @ParameterizedTest로 간단히 만들수 있을거 같아요!!
개인적으로 저는 저렇게 인자가 두개 필요한 경우에는 @MethodSource로 간단히 하는 편입니다!
[여기 링크](https://ebabby.tistory.com/28) 참고하시면 될거 같아요!!
@@ -0,0 +1,79 @@
+package christmas.model
+
+import christmas.utils.Constant.BADGE_SANTA
+import christmas.utils.Constant.BADGE_STAR
+import christmas.utils.Constant.BADGE_TREE
+import christmas.utils.Constant.CHAMPAGNE_CONDITION_AMOUNT
+import christmas.utils.Constant.CHRISTMAS_DAY_DISCOUNT_AMOUNT
+import christmas.utils.Constant.DAILY_DISCOUNT_AMOUNT
+import christmas.utils.Constant.FIRST_DAY_DISCOUNT_AMOUNT
+import christmas.utils.Constant.EMPTY
+import christmas.utils.Constant.NONE
+import christmas.utils.Constant.ONE_DAY_DECREASE
+import christmas.utils.Constant.SANTA_MIN
+import christmas.utils.Constant.STAR_MAX
+import christmas.utils.Constant.STAR_MIN
+import christmas.utils.Constant.TREE_MAX
+import christmas.utils.Constant.TREE_MIN
+import christmas.utils.Constant.WEEK_DISCOUNT_AMOUNT
+
+class DecemberEvent {
+    fun applyTheDayDiscount(date: Int): Int {
+        val dailyDiscount = (date - ONE_DAY_DECREASE) * DAILY_DISCOUNT_AMOUNT
+
+        return FIRST_DAY_DISCOUNT_AMOUNT + dailyDiscount
+    }
+
+    fun applyWeekdayDiscount(orderMenu: List<OrderItems>): Int {
+        var dessertMenuCount = EMPTY
+
+        for (item in orderMenu) {
+            val increaseCount = increaseDessertMenuCount(item.getMenuName(), item.getQuantity())
+            dessertMenuCount += increaseCount
+        }
+
+        return dessertMenuCount * WEEK_DISCOUNT_AMOUNT
+    }
+
+    private fun increaseDessertMenuCount(menuName: String, quantity: Int): Int {
+        if (menuName == StoreMenu.CHOCO_CAKE.menuName || menuName == StoreMenu.ICE_CREAM.menuName)
+            return quantity
+
+        return EMPTY
+    }
+
+
+    fun applyWeekendDiscount(orderMenu: List<OrderItems>): Int {
+        var mainMenuCount = EMPTY
+
+        for (item in orderMenu) {
+            val increaseCount = increaseMainMenuCount(item.getMenuName(), item.getQuantity())
+            mainMenuCount += increaseCount
+        }
+
+        return mainMenuCount * WEEK_DISCOUNT_AMOUNT
+    }
+
+    private fun increaseMainMenuCount(menuName: String, quantity: Int): Int {
+        if (menuName == StoreMenu.T_BONE_STEAK.menuName || menuName == StoreMenu.BBQ_RIBS.menuName ||
+            menuName == StoreMenu.SEAFOOD_PASTA.menuName || menuName == StoreMenu.CHRISTMAS_PASTA.menuName
+        )
+            return quantity
+
+        return EMPTY
+    }
+
+    fun applySpecialDiscount(): Int = CHRISTMAS_DAY_DISCOUNT_AMOUNT
+
+    fun presentChampagne(totalOrderAmount: Int): Boolean = totalOrderAmount >= CHAMPAGNE_CONDITION_AMOUNT
+
+    fun assignBadge(benefitAmount: Int): String {
+        when {
+            benefitAmount in STAR_MIN..STAR_MAX -> return BADGE_STAR
+            benefitAmount in TREE_MIN..TREE_MAX -> return BADGE_TREE
+            benefitAmount >= SANTA_MIN -> return BADGE_SANTA
+        }
+
+        return NONE
+    }
+}
\ No newline at end of file

리뷰: 으악,,가독성을 많이 신경 쓴 미션이었는데 놓친 부분이 있었네요. 말씀해주신 방법들도 ELSE를 지양할 수 있다는 가정하에 고려해볼 수 있을 것 같아요. 지금 드는 생각은 메인 메뉴들을 맵이나 리스트로 그룹화하고 조건 검사를 진행했다면 한번의 검사로도 충분히 동일한 처리를 했을 수 있을 거 같아요..다른 클래스에서는 동일한 방법으로 리팩토링을 진행했기 때문에 아쉬움이 많이 남는 부분이네요..리뷰 감사합니다 :)
@@ -0,0 +1,59 @@
+package christmas.utils
+
+object Constant {
+    /* Model */
+    const val FIRST_DAY_DISCOUNT_AMOUNT = 1_000
+    const val DAILY_DISCOUNT_AMOUNT = 100
+    const val ONE_DAY_DECREASE = 1
+    const val WEEK_DISCOUNT_AMOUNT = 2_023
+    const val CHRISTMAS_DAY_DISCOUNT_AMOUNT = 1_000
+    const val CHAMPAGNE_CONDITION_AMOUNT = 120_000
+    const val CHRISTMAS_DAY = 25
+    const val DISCOUNT_THRESHOLD = 10_000
+    const val EMPTY = 0
+    const val BADGE_STAR = "별"
+    const val BADGE_TREE = "트리"
+    const val BADGE_SANTA = "산타"
+    const val NONE = "없음"
+    const val STAR_MIN = 5_000
+    const val STAR_MAX = 9_999
+    const val TREE_MIN = 10_000
+    const val TREE_MAX = 19_999
+    const val SANTA_MIN = 20_000
+    const val FIRST_INDEX = 0
+    const val SECOND_INDEX = 1
+
+    /* Validate */
+    const val ORDER_ITEMS_SIZE = 2
+    const val VISIT_DATE_MIN = 1
+    const val VISIT_DATE_MAX = 31
+    const val QUANTITY_MINIMUM = 1
+    const val QUANTITY_MAXIMUM = 20
+    const val HYPHEN = "-"
+    const val COMMA = ","
+    const val NUMERIC_REGEX = "^\\d+$"
+    private const val ERROR_MESSAGE_PREFIX = "[ERROR] "
+    const val ERROR_MESSAGE_INPUT_VISIT_DATE = ERROR_MESSAGE_PREFIX + "유효하지 않은 날짜입니다. 다시 입력해 주세요."
+    const val ERROR_MESSAGE_INPUT_MENU = ERROR_MESSAGE_PREFIX + "유효하지 않은 주문입니다. 다시 입력해 주세요."
+
+    /* InputView */
+    const val VISIT_DATE_ANNOUNCE_MESSAGE = "12월 중 식당 예상 방문 날짜는 언제인가요? (숫자만 입력해 주세요!)"
+    const val MENU_ANNOUNCE_MESSAGE = "주문하실 메뉴를 메뉴와 개수를 알려 주세요. (e.g. 해산물파스타-2,레드와인-1,초코케이크-1)"
+
+    /* OutPutView */
+    private const val PRINT_ENTER = "\n"
+    const val START_PLANNER_MESSAGE = "안녕하세요! 우테코 식당 12월 이벤트 플래너입니다."
+    const val PREVIEW_ANNOUNCE_MESSAGE = "12월 %d일에 우테코 식당에서 받을 이벤트 혜택 미리 보기!"
+    const val ORDER_MENU_TITLE_MESSAGE = "$PRINT_ENTER<주문 메뉴>"
+    const val ITEMS_RESULT = "%s %d개"
+    const val TOTAL_ORDER_SUM_TITLE_MESSAGE = "$PRINT_ENTER<할인 전 총주문 금액>"
+    const val TOTAL_AMOUNT_RESULT = "%,d원"
+    const val PRESENT_MENU_TITLE_MESSAGE = "$PRINT_ENTER<증정 메뉴>"
+    const val PRESENT_AMOUNT = 1
+    const val BENEFIT_DETAILS_TITLE_MESSAGE = "$PRINT_ENTER<혜택 내역>"
+    const val FREEBIE_EVENT_NAME = "증정 이벤트"
+    const val BENEFIT_RESULT = "%s: -%,d원"
+    const val BENEFIT_AMOUNT_TITLE_MESSAGE = "$PRINT_ENTER<총혜택 금액>"
+    const val PAYMENT_AMOUNT_TITLE_MESSAGE = "$PRINT_ENTER<할인 후 예상 결제 금액>"
+    const val BADGE_TITLE_MESSAGE = "$PRINT_ENTER<12월 이벤트 배지>"
+}
\ No newline at end of file

리뷰: 오타 보다는 여러 가지가 파생될 수 있는 에러 메세지를 관리하기 위한 의도에 작성했었던 것 같아요. 다음 리뷰에 cbj0010님이 관련하여 제시해주신  Enum Class를 통해 관리하는 방법도 있어서 park-yina님께도 공유드립니다!

```
enum class ErrorMessage(private val message: String) {
    ERROR_MENU_INPUT("유효하지 않은 주문입니다. 다시 입력해 주세요."),
    ERROR_INPUT_DAY("유효하지 않은 날짜입니다. 다시 입력해 주세요.");

    fun getMessage(): String = "[ERROR] $message"
}
```
@@ -0,0 +1,58 @@
+package christmas.controller
+
+import christmas.model.Customer
+import christmas.model.EventHelper
+import christmas.model.OrderItems
+import christmas.model.StoreMenu.Companion.sortOrderMenu
+import christmas.model.StoreMenu.Companion.splitOrderMenu
+import christmas.model.StoreMenu.Companion.splitOrderMenuForValidate
+import christmas.utils.Validate.validateOrderMenu
+import christmas.utils.Validate.validateVisitDate
+import christmas.view.InputView
+import christmas.view.OutputView
+
+class ChristmasController {
+    private val input = InputView()
+    private val output = OutputView()
+
+    fun run() {
+        output.printStartPlanner()
+        val customer = Customer(inputVisitDate(), inputOrderMenu())
+
+        customer.requestApplyDecemberEvent()
+        previewBenefit(customer, customer.getEventHelper())
+    }
+
+    private fun inputVisitDate(): Int {
+        return try {
+            val visitDateInput = input.readVisitDate()
+            validateVisitDate(visitDateInput)
+            visitDateInput.toInt()
+        } catch (e: IllegalArgumentException) {
+            println(e.message)
+            inputVisitDate()
+        }
+    }
+
+    private fun inputOrderMenu(): List<OrderItems> {
+        return try {
+            val orderMenuInput = input.readOrderMenu()
+            validateOrderMenu(splitOrderMenuForValidate(orderMenuInput))
+            splitOrderMenu(orderMenuInput)
+        } catch (e: IllegalArgumentException) {
+            println(e.message)
+            inputOrderMenu()
+        }
+    }
+
+    private fun previewBenefit(customer: Customer, eventHelper: EventHelper) {
+        output.printPreviewAnnounce(customer.getVisitDate())
+        output.printOrderMenu(sortOrderMenu(customer.getOrderMenu()))
+        output.printTotalOrderPrize(customer.calculateTotalOrderSum())
+        output.printFreebieMenu(eventHelper.getFreebie())
+        output.printBenefitDetails(eventHelper.getDiscountHistory(), eventHelper.getFreebie())
+        output.printBenefitAmount(eventHelper.calculateTotalBenefitAmount())
+        output.printPaymentAmount(customer.calculateTotalOrderSum(), eventHelper.getDiscountHistory())
+        output.printBadge(eventHelper.getBadge())
+    }
+}
\ No newline at end of file

리뷰: validateVisitDate(visitDateInput) 예외 처리 과정에서 IllegalArgumentException이 발생하지 않는다면 입력이 유효한 것이기 때문에 따로 변수를 선언하여 불필요한 메모리 할당을 하지 않고 Int로만 변환하여 return 해도 될 것이라고 생각하고 작성했던 코드인 것 같습니다. validateVisitDate() 함수는 예외 처리에 관한 함수이기 때문에 역할과 책임에 대해서도 고민하고 작성했던 것 같긴 하지만 제시해주신 의견대로 validateVisitDate()에 return type을 지정하여서 return 값을  가지는 것도 하나의 방법이 될 수 있을 것 같아요! 감사합니다 :)
@@ -0,0 +1,79 @@
+package christmas.model
+
+import christmas.utils.Constant.BADGE_SANTA
+import christmas.utils.Constant.BADGE_STAR
+import christmas.utils.Constant.BADGE_TREE
+import christmas.utils.Constant.CHAMPAGNE_CONDITION_AMOUNT
+import christmas.utils.Constant.CHRISTMAS_DAY_DISCOUNT_AMOUNT
+import christmas.utils.Constant.DAILY_DISCOUNT_AMOUNT
+import christmas.utils.Constant.FIRST_DAY_DISCOUNT_AMOUNT
+import christmas.utils.Constant.EMPTY
+import christmas.utils.Constant.NONE
+import christmas.utils.Constant.ONE_DAY_DECREASE
+import christmas.utils.Constant.SANTA_MIN
+import christmas.utils.Constant.STAR_MAX
+import christmas.utils.Constant.STAR_MIN
+import christmas.utils.Constant.TREE_MAX
+import christmas.utils.Constant.TREE_MIN
+import christmas.utils.Constant.WEEK_DISCOUNT_AMOUNT
+
+class DecemberEvent {
+    fun applyTheDayDiscount(date: Int): Int {
+        val dailyDiscount = (date - ONE_DAY_DECREASE) * DAILY_DISCOUNT_AMOUNT
+
+        return FIRST_DAY_DISCOUNT_AMOUNT + dailyDiscount
+    }
+
+    fun applyWeekdayDiscount(orderMenu: List<OrderItems>): Int {
+        var dessertMenuCount = EMPTY
+
+        for (item in orderMenu) {
+            val increaseCount = increaseDessertMenuCount(item.getMenuName(), item.getQuantity())
+            dessertMenuCount += increaseCount
+        }
+
+        return dessertMenuCount * WEEK_DISCOUNT_AMOUNT
+    }
+
+    private fun increaseDessertMenuCount(menuName: String, quantity: Int): Int {
+        if (menuName == StoreMenu.CHOCO_CAKE.menuName || menuName == StoreMenu.ICE_CREAM.menuName)
+            return quantity
+
+        return EMPTY
+    }
+
+
+    fun applyWeekendDiscount(orderMenu: List<OrderItems>): Int {
+        var mainMenuCount = EMPTY
+
+        for (item in orderMenu) {
+            val increaseCount = increaseMainMenuCount(item.getMenuName(), item.getQuantity())
+            mainMenuCount += increaseCount
+        }
+
+        return mainMenuCount * WEEK_DISCOUNT_AMOUNT
+    }
+
+    private fun increaseMainMenuCount(menuName: String, quantity: Int): Int {
+        if (menuName == StoreMenu.T_BONE_STEAK.menuName || menuName == StoreMenu.BBQ_RIBS.menuName ||
+            menuName == StoreMenu.SEAFOOD_PASTA.menuName || menuName == StoreMenu.CHRISTMAS_PASTA.menuName
+        )
+            return quantity
+
+        return EMPTY
+    }
+
+    fun applySpecialDiscount(): Int = CHRISTMAS_DAY_DISCOUNT_AMOUNT
+
+    fun presentChampagne(totalOrderAmount: Int): Boolean = totalOrderAmount >= CHAMPAGNE_CONDITION_AMOUNT
+
+    fun assignBadge(benefitAmount: Int): String {
+        when {
+            benefitAmount in STAR_MIN..STAR_MAX -> return BADGE_STAR
+            benefitAmount in TREE_MIN..TREE_MAX -> return BADGE_TREE
+            benefitAmount >= SANTA_MIN -> return BADGE_SANTA
+        }
+
+        return NONE
+    }
+}
\ No newline at end of file

리뷰: 만약에 제가 kotlin api를 활용햇 해당 메서드를 구현한다면,
```
dessertMenuCount = orderMenu.filter { it.menuName == StoreMenu.CHOCO_CAKE.menuName || it.menuName == StoreMenu.ICE_CREAM.menuName }.sumOf { it.quantity }
```
이렇게 하면 메서드 하나로 디저트 메뉴 개수를 구할수도 있어요!!