인프런/스프링핵심원리(기본)

6)새로운 할인 정책 개발 , 적용과 문제점 , 문제점 해결 (의존성 주입)

backend dev 2022. 12. 9.

 

할인정책을 바꾼다고 했을때?

할인에 대한 역할과 구현을 나눠서 개발하지않았다면 기획의 대한 변화는 골치가 아팠을것이다.

하지만 할인에 대한 역할(인터페이스)를 만들어놓았고, 그것에 대한 구현(구현체)를 지금 

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의 코드(클라이언트 코드)까지 수정이 필요함 -> 문제점

 

 

문제해결

인터페이스를 의존하게끔 수정했다. 하지만 인터페이스 변수안에 구현체객체를 생성하고 넣어줘야한다.

 

어떻게 넣어줄까?

-> 다음강의

댓글