본문 바로가기
강의 실습/스프링 핵심 원리 - 기본편

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

by jint 2026. 4. 1.

1. 할인 정책을 애플리케이션에 적용
정률 할인 정책 구현체를 적용한다.
할인 정책을 변경하려면 클라이언트인 OrderServiceImpl 코드를 고쳐야 한다.

- src/main/java/hello/core/order/OrderServiceImpl.java

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



2. 문제점 체크
#1 역할과 구현 분리 (O)
#2 다형성 활용하고, 인터페이스와 구현 객체 분리 (O)
#3 OCP, DIP 객체지향 설계 원칙을 충실히 준수 (X)
## DIP : 주문서비스 클라이언트(OrderServiceImpl)는 DiscountPolicy 인터페이스에 의존하면서 DIP를 지킨 것 같지만, 클래스 의존관계를 분석하면 인터페이스(추상) 뿐만 아니라 구현체에도 의존하고 있다. 따라서 DIP 위반!
인터페이스(추상) 의존 : DiscountPolicy
구현체 클래스 : FixDiscountPolicy, RateDiscountPolicy
## OCP : 변경하지 않고 확장할 수 있다고 생각했지만, 기능을 확장해서 변경하면, 클라이언트 코드에 영향을 준다! 따라서 OCP 위반!

왜 클라이언트 코드를 변경하는지 클래스 다이어그램으로 의존관계를 분석한다.

1) 기대했던 의존관계

기대했던 의존관계


단순히 DiscountPolicy 인터페이스만 의존한다고 생각

2) 실제 의존관계

실제 의존관계


클라이언트인 OrderServiceImpl 이 DiscountPolicy 인터페이스 뿐만 아니라 FixDiscountPolicy 구현체 클래스도 함께 의존하고 있다. 실제 코드를 보면 의존하고 있다.
-> DIP 위반

3) 정책 변경

정책 변경


FixDiscountPolicy 를 RateDiscountPolicy 로 변경하는 순간 클라이언트인 OrderServiceImpl 소스 코드도 함께 변경해야 한다.
-> OCP 위반


3. 문제 해결
인터페이스(추상)에만 의존하도록 의존관계 변경

1) 인터페이스에만 의존하도록 설계 변경

인터페이스에만 의존하도록 설계 변경


2) 인터페이스에만 의존하도록 코드 변경
- src/main/java/hello/core/order/OrderServiceImpl.java

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


DIP는 지켰다. 하지만 구현체 없이 코드를 실행하니, NPE(null pointer exception)가 발생한다.

3) 해결방안
누군가가 클라이언트인 OrderServiceImpl 에 DiscountPolicy 구현 객체를 대신 생성하고 주입해 주어야 한다.


참고링크 : 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?cid=325969

 

스프링 핵심 원리 - 기본편| 김영한 - 인프런 강의

현재 평점 5.0점 수강생 49,516명인 강의를 만나보세요. 스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다. 스프링 기본 기능, 스프

www.inflearn.com

댓글