할인정책을 바꾼다고 했을때?
할인에 대한 역할과 구현을 나눠서 개발하지않았다면 기획의 대한 변화는 골치가 아팠을것이다.
하지만 할인에 대한 역할(인터페이스)를 만들어놓았고, 그것에 대한 구현(구현체)를 지금
FixDiscountPolicy로 구현해놓은상태이고
기획자가 원하는대로 새로운 할인정책인 RateDiscountPolicy 라는 구현체를 만들어서 적용해주자.
RateDiscountPolicy.java (구현체)
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; // 지금은 10%이니까 price의 10이 얼마인지 -> 얼마할인되는지 리턴
} else {
return 0;
}
}
}
구현한 할인정책 테스트해보기
해당 클래스에서 컨트롤+ 쉬프트 + T 를 눌러 쉽게 테스트파일을 생성한다. (패키지까지 알아서만들어줌)
RateDiscountPolicyTest.java
class RateDiscountPolicyTest {
RateDiscountPolicy rateDiscountPolicy = new RateDiscountPolicy();
@Test
@DisplayName("VIP는 10%할인이 적용되어야 한다.")
void vip_o() {
//given
Member member = new Member(1L, "memberVIP", Grade.VIP);
//when
int discount = rateDiscountPolicy.discount(member, 10000);
//then
Assertions.assertThat(discount).isEqualTo(1000);
}
}
여기서 @DisplayName이라는 어노테이션은 테스트 결과창에 메소드이름말고
DisplayName에 적은 이름으로 나오게끔한다.
테스트는 항상 반대결과도 테스트해봐야한다.
VIP가 아닐때 할인이 적용안되는지도 체크해본다.
@Test
@DisplayName("VIP가 아닌경우 할인이 적용되지않아야한다.")
void vip_x() {
//given
Member member = new Member(1L, "memberBasic", Grade.BASIC);
//when
int discount = rateDiscountPolicy.discount(member, 10000);
//then
Assertions.assertThat(discount).isEqualTo(0);
}
테스트 추가!
Assertions는 static import로 추가해놓는게 편하다.
Assertions위에서 Alt + enter 하고 Add on-demand static import for ~ 를 선택하면
다음과 같이생기고
이렇게 줄어들면서
다음부터는 assertThat에서부터 적어도된다.
새로운 할인정책 적용
방금 만든 할인 구현체를 적용해보자.
문제점 : 추상(인터페이스)뿐만 아니라 구체(구현)클래스에도 의존하고 있다.
클라이언트(OrderServiceImpl)이
DiscountPolicy 에서 인터페이스 의존
new Rate~ 에서 구현클래스 의존
DIP 위반 -> 인터페이스에만 의존했어야함.
DiscountPolicy의 구현체를 바꾸려는데 OrderServiceImpl의 코드(클라이언트 코드)까지 수정이 필요함 -> 문제점
문제해결
인터페이스를 의존하게끔 수정했다. 하지만 인터페이스 변수안에 구현체객체를 생성하고 넣어줘야한다.
어떻게 넣어줄까?
-> 다음강의
'인프런 > 스프링핵심원리(기본)' 카테고리의 다른 글
8)★ AppConfig 리팩토링 , 할인정책 변경(구현클래스 변경) , DIP 준수 , OCP 준수 , 배웠던거 전체 흐름 정리 (0) | 2022.12.09 |
---|---|
7) ★ 관심사의 분리, AppConfig(리팩토링 전) , 생성자 주입,의존성 주입(의존관계 주입) (0) | 2022.12.09 |
5)주문과 할인 도메인 설계와 개발 (0) | 2022.12.07 |
4)회원 도메인 설계,회원 도메인 개발 (0) | 2022.12.01 |
3)예제프로젝트 시작, 비즈니스 요구사항과 설계 (0) | 2022.12.01 |
댓글