> For the complete documentation index, see [llms.txt](https://heunnajo.gitbook.io/spring/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://heunnajo.gitbook.io/spring/2/undefined-1.md).

# 새로운 할인 정책 적용과 문제점

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

```java
public class OrderServiceImpl implements OrderService {
  //    private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
      private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
  }
```

우리는 역할과 구현을 충실하게 분리했다. 다형성도 활용하고, 인터페이스와 구현 객체를 분리했다.\
하지만 주문서비스 클라이언트(OrderServiceImpl)는 DiscountPolicy 인터페이스에 의존하면서 구현 클래스에도 의존하고 있다!

OCP는 변경하지 않고 확장할 수 있어야하는데 지금 콛드는 기능을 확장해서 변경하면 클라이언트(OrderServiceImpl) 코드에 영향을 주기 때문에 OCP를 위반한다!\
OCP(Open-Closed Principle), DIP(Dependency Inversion Principle)을 준수하는 것처럼 보이지만 OCP 위반하고 있는 것이다.

![기대했던 의존관계](blob:https://app.gitbook.com/7a246a16-e584-4802-9868-976dfd1d175d)

![실제 의존관계](blob:https://app.gitbook.com/9b4d7263-b361-4284-9eb0-3d4ad07db13f)

할인정책 변경

![](blob:https://app.gitbook.com/65ebecf8-a191-46d6-b667-47a23dc40f3d)

이러한 문제 해결 방법은?

인터페이스에 의존하도록 설계를 변경한다!

```java
public class OrderServiceImpl implements OrderService {
      //private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
      private DiscountPolicy discountPolicy;
}
```

위의 코드로 변경하고 실행하면 구현체가 없기 때문에 당연히 NPE(Null Pointer Exception)이 발생한다!\
**=> 누군가가 클라이언트인 OrderServiceImpl에 DiscountPolicy의 구현체를 대신 생성하고 주입해주면 된다!⭐️**
