Spring/스프링 핵심 원리 - 기본편

[이해2 - 객체 지향 원리 적용] 새로운 할인 정책 도입 (+ 문제점)

alsruds 2023. 11. 9. 03:30
🧐강의🧐
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

새로운 할인 정책 확장하기 : 정률 할인 정책

1. DiscountPolicy 구현체 Class 생성 : RateDiscountPolicy

· int discountPercent = 10

· discount : return price * discountPercent / 100

 

2. test/java/hello.core/discount/RateDiscountPolicyTest Class 생성 후 테스트

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
        Assertions.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
        Assertions.assertThat(discount).isEqualTo(0);
    }
}

성공~

 

3. 할인 정책 적용하기 : OrderServiceImpl 코드 수정

· DiscountPolicy discountPolicy = new RateDiscountPolicy()

 

문제점

· 역할과 구현 분리 → ✅

· 다형성 활용 & 인터페이스와 구현 객체 분리 → ✅

· OCP, DIP 객체 지향 설계 원칙 준수 → ❌

          》OCP : 기능 확장, 변경으로 클라이언트 코드에 영향

          》DIP : 구체(구현) 클래스에 의존 

                    - 추상(인터페이스) 의존 : DiscountPolicy

                    - 구체(구현) 클래스 : FixDiscountPolicy, RateDiscountPolicy

 

기대했던 의존 관계 실제 의존 관계 정책 변경 시

➡️ DIP 위반

➡️ OCP 위반

 

문제 해결 방법

✅ 인터페이스에만 의존하도록 설계하기

 

· OrderServiceImpl 코드 변경

...
public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository = new MemoryMemberRepository();
    // private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
    // private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
    private DiscountPolicy discountPolicy;

    ...
}

➡️ 실행 시 NPE (Null Pointer Exception) 발생

 


이 문제를 해결하려면 누군가 클라이언트인 OrderServiceImpl 에 DiscountPolicy 의 구현 객체를 대신 생성하고 주입해주어야 한다 !!