우아한테크코스 6기 백엔드 프리코스 - 크리스마스 프로모션

테스트 목록

미션 완성을 위해 통과해야 하는 테스트 목록(줄이 쳐진 항목은 이미 통과)

비즈니스 로직
m4t13 - 고객이 주문한 상품의 금액 총합 계산
m4t01 - 크리스마스 디데이(12.1~12.25) 할인이 적용된 금액 계산
m4t14 - 입력된 날짜가 평일인지 확인
m4t02 - 12월 평일(일~목) 할인 : 디저트 메뉴 1개당 2,023원 할인
m4t15 - 입력된 날짜가 주말인지 확인
m4t03 - 12월 주말(금,토) 할인 : 메인 메뉴 1개당 2,023원 할인
m4t16 - 입력된 날짜가 특별할인 날짜인지 확인
m4t04 - 12월 특별할인(⭐️) : 총주문 금액에서 1,000원 할인
m4t05 - 12월 증정 이벤트 : 총주문 금액이 12만원 이상인 경우 샴페인 1개 증정
m4t06 - 혜택 내역 추적
m4t07 - 총혜택 금액에 따른 배지 부여
개발 요청 사항
m4t08 - 식당 방문 예상 날짜는 1이상 31이하의 숫자만 가능 (이외의 경우 예외를 던진다)
m4t09 - 메뉴 주문 입력 유효성 검사 (유효하지 않은 상품 입력에 대해 예외를 던진다)
m4t10 - 메뉴 주문 입력 유효성 검사 (유효하지 않은 수량 입력에 대해 예외를 던진다)
m4t11 - 메뉴 주문 유효성 검사 (음료만 주문한 경우 예외를 던진다)
m4t12 - 메뉴 주문 유효성 검사 (중복된 상품을 주문한 경우 예외를 던진다)

m4t13

고객이 주문한 상품들의 가격 총합을 구할 수 있어야 한다.

m4t13

m4t01

고객이 방문하는 날짜에 진행하는 이벤트 계획을 반환한다. 12월 1일부터 25일까지는 크리스마스 디데이 할인 이벤트가 진행된다.

m4t01-hit

m4t01-miss

각각 아래와 같이 수정했다.

m4t01-hit-1

m4t01-miss-1

m4t14 m4t15 m4t16

입력된 날짜가 평일(일~목)인지 확인
주말은 수가 적기 때문에 전부 테스트하고 평일은 수가 많아서 랜덤으로 선택했다.

m4t14

입력된 날짜가 주말(금,토)인지 확인

m4t15

입력된 날짜에 ⭐️이 표시되어 있는지 확인

m4t16

DiscountedPrice

할인된 금액을 나타내는 클래스
할인 이벤트가 복잡해서 이것저것 생각하다가 TDD의 원칙대로 일단 테스트를 통과하게만 구현했다.

DiscountedPrice-1

m4t02

12월 평일 할인이 적용된 금액을 계산.
12월 1월부터 31일까지의 평일(일~목)에는 디저트 메뉴 한 개 당 2023원을 할인한다.

m4t04

⭐️이 표시된 날은 총주문 금액에서 1,000원을 할인한다.

m4t04-1

m4t04-2

m4t05

총주문 금액이 12만원 이상인 경우 샴페인을 증정한다.

m4t05

m4t07

총혜택 금액에 맞는 배지를 부여한다.

m4t07

m4t06

아래와 같은 정보를 출력하기 위해서는 어떤 이벤트에 의해 얼마나 할인되었는지, 증정받은 메뉴는 무엇인지를 추적해야 한다. 즉 이런 필드를 가지는 클래스가 필요하다.

requirement-details

m4t06

BenefitDetails

BenefitDetails 객체에 할인받은 금액 정보가 저장되어 있기 때문에 이전에 구현했던 DiscountedPrice는 필요가 없어졌다.

BenefitDetails-1 BenefitDetails-2 BenefitDetails-3 BenefitDetails-4

마무리

이것저것 생각하면서 시간을 보내기보다 일단 테스트를 통과시키고 리팩토링하는 과정을 반복하면서 미션을 진행하였더니 피로도도 훨씬 낮았고 결과도 만족스러웠다. 클래스들은 크지 않았고 모든 메서드는 10줄을 넘지 않았다.

elapsed-time

reference

Comments