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
'강의 실습 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
| AppConfig 리팩터링 (0) | 2026.04.03 |
|---|---|
| 관심사의 분리 (0) | 2026.04.02 |
| 새로운 할인 정책 개발 (0) | 2026.03.31 |
| 주문과 할인 도메인 실행과 테스트 (0) | 2026.03.30 |
| 주문과 할인 도메인 개발 (0) | 2026.03.30 |
댓글