3.1.1 새로운 할인 정책
앞서 섹션 2에서 작성한 코드에 좋은 객체 지향의 원리들을 적용해보자.
먼저, 새로운 기획자가 나타나서 다음과 같은 정책을 추가해달라고 요구한다고 가정하였다.
서비스 오픈 직전에 할인 정책을 지금처럼 고정 금액 할인이 아니라 좀 더 합리적인 주문 금액당 할인하는 정률% 할인으로 변경하고 싶어요. 예를 들어서 기존 정책은 VIP가 10000원을 주문하든 20000원을 주문하든 항상 1000원을 할인했는데, 이번에 새로 나온 정책은 10%로 지정해두면 고객이 10000원 주문시 1000원을 할인해주고, 20000원 주문시에 2000원을 할인해주는 거에요!
즉, 할인 정책을 고정 할인 금액에서 정률 할인으로 변경해야 하는 것이다.
하지만, 앞선 코드에서 유연한 설계가 가능하도록 객체 지향 설계 원칙을 준수하였으므로,
비교적 간단하게 새로운 할인 정책을 적용할 수 있다.
+ 참고 ) 애자일 소프트웨어 개발 선언
https://agilemanifesto.org/iso/ko/manifesto.html
3.1.2 RateDiscountPolicy 구현체 작성
앞서 섹션 2에서 OrderServiceImpl 클래스가 DiscountPolicy 에 의존하도록 하였다.
또한, DiscountPolicy 인터페이스를 구현하는 FixDiscountPolicy 구현체를 작성하였다.
아래의 그림과 같이, 새로운 정률 정책을 적용하기 위해서는,
DiscountPolicy 를 구현하는 RateDiscountPolicy 구현체를 추가 작성해야 한다.
먼저 src > main > java > hello.core > discount 패키지에
RateDiscountPolicy 클래스를 다음과 같이 작성한다.
package hello.core.discount;
import hello.core.member.Grade;
import hello.core.member.Member;
public class RateDiscountPolicy implements DiscountPolicy {
private int discountPercent = 10;
@Override
public int discount(Member member, int price) {
if (member.getGrade() == Grade.VIP) {
return price * discountPercent / 100;
} else {
return 0;
}
}
}
다음의 코드는 회원 등급이 VIP인 경우,
상품 금액의 10 %를 할인해주는 로직이다.
3.1.3 테스트 작성
앞서 섹션 3.1.2 에서 작성한 RateDiscountPolicy 로직이 제대로 수행되는지 테스트해보자.
먼저 test > java > hello.core 에 discount 패키지를 생성하고,
RateDiscountPolicyTest 클래스를 아래와 같이 작성한다.
로직 성공 test 와 실패 test 를 모두 작성하였다.
import hello.core.member.Grade;
import hello.core.member.Member;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;
class RateDiscountPolicyTest {
RateDiscountPolicy discountPolicy = new RateDiscountPolicy();
@Test
@DisplayName("VIP는 10% 할인이 적용되어야 한다.")
void vip_o() {
//given
Member member = new Member(1L, "memberVIP", Grade.VIP);
//when
int discount = discountPolicy.discount(member, 10000);
//then
assertThat(discount).isEqualTo(1000);
}
@Test
@DisplayName("VIP가 아니면 할인이 적용되지 않아야 한다.")
void vip_x() {
//given
Member member = new Member(2L, "memberBASIC", Grade.BASIC);
//when
int discount = discountPolicy.discount(member, 10000);
//then
assertThat(discount).isEqualTo(0);
}
}
@Test
Junit 테스트 프레임워크를 사용하기 위한 어노테이션이다.
@DisplayName
테스트 이름을 한글로 작성하기 위한 어노테이션이다.
void vip_o()
등급이 VIP 인 회원에게 10% 할인이 적용되는지 확인하는 테스트 코드이다.
(회원 이름 : memberVIP , 상품 금액 : 10000 으로 설정한 후, 할인 금액이 1000원인지 확인하였다.)
void vip_x()
등급이 BASIC 인 회원에게 10% 할인이 적용되지 않는 것을 확인하는 테스트 코드이다.
(회원 이름 : memberBASIC , 상품 금액 : 10000 으로 설정한 후, 할인 금액이 0원인지 확인하였다.)
실제로, 2개의 테스트 코드를 실행해보면,
다음과 같이 정상적으로 동작하는 것을 확인할 수 있다.
김영한 '스프링 핵심 원리 - 기본편' 강의를 기반으로 작성하였습니다.
'SPRING 핵심 원리 [ 기본편 ]' 카테고리의 다른 글
[스프링 핵심 원리] 섹션 3.3 객체 지향 원리 적용 (관심사의 분리) (0) | 2023.01.31 |
---|---|
[스프링 핵심 원리] 섹션 3.2 객체 지향 원리 적용 (새로운 할인 정책 적용과 문제점) (0) | 2023.01.31 |
[스프링 핵심 원리] 섹션 2.8 예제만들기 (주문과 할인 도메인 실행과 테스트) (0) | 2023.01.24 |
[스프링 핵심 원리] 섹션 2.7 예제만들기 (주문과 할인 도메인 개발) (0) | 2023.01.24 |
[스프링 핵심 원리] 섹션 2.6 예제만들기 (주문과 할인 도메인 설계) (0) | 2023.01.24 |