스프링 공부/인프런 김영한 스프링 핵심 원리 - 기본편 노트정리

3-1. 새로운 할인 정책 개발

모항 2023. 1. 7. 18:35

이번 시간에는,

할인 정책이 변경되었다고 가정하고 그 할인 정책에 맞게 코드를 수정해볼 것이다.

 

현재 코드는 VIP 고객에게 1000원을 할인해주는 방식으로 짜여져있는데,

오늘은 VIP 고객에게 구매 가격의 10%를 할인해주는 코드를 짤 것이다.

 

 

src > main > java > hello.core > discount 패키지 안에

DiscountPolicy를 implement하는 RateDiscountPolicy를 하나 만들어준다.

 

 

 

코드는 다음과 같이 채운다.

 

 

member 가 VIP라면 구매가격의 10%를 return하고, 그렇지 않으면 0을 리턴하는 함수를 만들었다.

 

여기서 기억할 것이 있다.

알고리즘 문제를 풀 때, 나눗셈 때문에 낭패를 본 경험이 있을 것이다. 나눗셈은 오차를 발생시킨다.

그러므로 퍼센티지를 기준으로 할인금액을 책정할 땐, 사실 이렇게 한 문장의 나눗셈으로 단순하게 처리해서는 안 된다. 고객의 구매금액이 얼마인지에 따라 오차가 발생할 수 있다. 이를 방지하기 위해 좀 더 세심한 로직을 짜고 테스트도 굉장히 많이 돌려야 한다.

 

하지만! 일단은 위처럼만 적고 넘어간다.

 

그 다음으로는 테스트를 진행한다.

 

여기서 매우 편리한 단축키가 하나 등장한다.

 

 

여기 함수 이름 discount에다가 커서를 올리고 ctrl+shift+T 를 누르면

 

 

이 함수의 테스트를 만들기 위한 버튼이 나타난다. 이 Create New Test... 를 클릭하면 아래와 같이

 

 

새 테스트를 만드는 창이 표시된다.

아무것도 건드리지 않고 OK를 누르기만 하면, RateDiscountPolicyTest라는 기본적인 테스트용 클래스가 알맞은 위치에 생성된다.

 

OK를 누르기 전
OK를 누른 후

 

RateDiscountPolicyTest 뿐만 아니라 discount 패키지까지 만들어준 것이 보인다.

 

 

이제 새로 만들어진 이 파일에 내용을 채우면 된다. 테스트에 사용될 RateDiscountPolicy 객체부터 만들어놓자.

 

 

 

먼저 VIP 고객이 할인을 요청한 경우의 테스트를 만들어보자.

 

 

VIP 고객이 10000원의 구매금액을 지불할 때에 1000원을 할인해야 한다는 계산 결과가 잘 도출되는지 확인하는 테스트이다.

이번에 처음 알게 된 @DisplayName() 어노테이션은, 테스트 Run 창에 표시될 문자열을 지정하는 역할을 한다. 이게 없으면 기본적으로 함수의 이름이 표시된다.

 

실행을 시켜보면

 

정상적으로 pass되어 초록불이 들어오고, 이름도 "VIP gets 10% discount"라고 잘 표시된다.

 

다음으로는 VIP가 아닌 고객의 경우를 테스트해보자.

강사님께서는 할인금액이 1000인지를 assert하여, 초록불이 안 들어오는 것을 정상으로 여기는 테스트를 짜셨다.

그런데 나는 아무래도... 모든 테스트가 초록불이 들어와야 마음이 편해서... 할인금액이 0인지를 assert하는 코드로 짜보겠다.

 

 

이렇게 짜주었다.

 

실행을 시켜보자.

 

 

pass 된다.

 

더보기

강사님처럼 assertThat(discount).isEqualTo(1000); 을 한다면?

 

 

1000을 기대했는데 실제 값은 0이므로 초록불이 들어오지 않는다. 하지만 우리가 이것을 바라는 상황이므로 문제가 없다.


 

 

두 테스트를 한꺼번에 돌려보아도 잘 pass된다.