본문 바로가기
Spring

[스프링 핵심 원리 - 기본편] 새로운 할인 정책 적용과 문제점

by 박성민 2021. 9. 9.

할인 정책을 애플리케이션에 적용

할인 정책을 변경하려면 클라이언트인 OrderServiceImpl 코드를 고쳐야 합니다.

문제점 발견

  • 우리는 역할과 구현을 충실하게 분리했습니다. => OK
  • 다형성도 활용하고, 인터페이스와 구현 객체를 분리했습니다. => OK
  • OCP, DIP 같은 객체지향 설계 원칙을 충실히 준수했습니다.
    • => 그렇게 보이지만 사실은 아닙니다.
  • DIP: DIP를 지킨 것 같지만 추상(인터페이스) 뿐만 아니라 구체(구현) 클래스에도 의존하고 있습니다.
    • 추상(인터페이스) 의존: DiscountPolicy
    • 구체(구현) 클래스: FixDiscountPolicy, RateDiscountPolicy
  • OCP: 지금 코드는 기능을 확장해서 변경하면, 클라이언트 코드에 영향을 줍니다. 따라서 OCP를 위반합니다.

기대했던 의존관계

1

  • 지금까지 단순히 DiscountPolicy 인터페이스만 의존한다고 생각했습니다.

실제 의존관계

2

  • 잘보면 클라이언트인 OrderServiceImplDiscountPolicy 인터페이스 뿐만 아니라 FixDiscountPolicy인 구체 클래스도 함께 의존하고 있습니다. DIP 위반

정책 변경

3

  • 중요: 그래서 FixDiscountPolicyRateDiscountPolicy로 변경하는 순간 OrderServiceImpl의 소스 코드도 함께 변경해야 합니다. OCP 위반

해결 방법

  • DIP 위반 => 추상에만 의존하도록 변경(인터페이스만 의존)
  • DIP를 위반하지 않도록 인터페이스에만 의존하도록 의존관계를 변경하면 됩니다.

인터페이스에만 의존하도록 코드 변경

public class OrderServiceImpl implements OrderService {

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

    ...

}
  • 그런데 구현체가 없어서 코드를 실행할 수 없습니다.
  • 실제 실행을 해보면 NPE(null pointer exception)가 발생합니다.

해결방안

  • 이 문제를 해결하려면 누군가가 클라이언트인 OrderServiceImplDiscountPolicy의 구현 객체를 대신 생성하고 주입해주어야 합니다.

참조

댓글