할인 정책을 애플리케이션에 적용
할인 정책을 변경하려면 클라이언트인 OrderServiceImpl
코드를 고쳐야 합니다.
문제점 발견
- 우리는 역할과 구현을 충실하게 분리했습니다. => OK
- 다형성도 활용하고, 인터페이스와 구현 객체를 분리했습니다. => OK
- OCP, DIP 같은 객체지향 설계 원칙을 충실히 준수했습니다.
- => 그렇게 보이지만 사실은 아닙니다.
- DIP: DIP를 지킨 것 같지만 추상(인터페이스) 뿐만 아니라
구체(구현) 클래스에도 의존
하고 있습니다.- 추상(인터페이스) 의존:
DiscountPolicy
- 구체(구현) 클래스:
FixDiscountPolicy
,RateDiscountPolicy
- 추상(인터페이스) 의존:
- OCP:
지금 코드는 기능을 확장해서 변경하면, 클라이언트 코드에 영향을 줍니다.
따라서OCP를 위반
합니다.
기대했던 의존관계
- 지금까지 단순히
DiscountPolicy
인터페이스만 의존한다고 생각했습니다.
실제 의존관계
- 잘보면 클라이언트인
OrderServiceImpl
이DiscountPolicy
인터페이스 뿐만 아니라FixDiscountPolicy
인 구체 클래스도 함께 의존하고 있습니다.DIP 위반
정책 변경
중요
: 그래서FixDiscountPolicy
를RateDiscountPolicy
로 변경하는 순간OrderServiceImpl
의 소스 코드도 함께 변경해야 합니다.OCP 위반
해결 방법
DIP 위반
=> 추상에만 의존하도록 변경(인터페이스만 의존)- DIP를 위반하지 않도록 인터페이스에만 의존하도록 의존관계를 변경하면 됩니다.
인터페이스에만 의존하도록 코드 변경
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
private DiscountPolicy discountPolicy;
...
}
그런데 구현체가 없어서 코드를 실행할 수 없습니다.
- 실제 실행을 해보면 NPE(null pointer exception)가 발생합니다.
해결방안
- 이 문제를 해결하려면 누군가가 클라이언트인
OrderServiceImpl
에DiscountPolicy
의 구현 객체를 대신 생성하고 주입해주어야 합니다.
참조
'Spring' 카테고리의 다른 글
[스프링 핵심 원리 - 기본편] AppConfig 리팩터링 (0) | 2021.09.09 |
---|---|
[스프링 핵심 원리 - 기본편] 관심사의 분리 (0) | 2021.09.09 |
[스프링 핵심 원리 - 기본편] 새로운 할인 정책 개발 (0) | 2021.09.08 |
[스프링 핵심 원리 - 기본편] 주문과 할인 도메인 실행과 테스트 (0) | 2021.09.08 |
[스프링 핵심 원리 - 기본편] 주문과 할인 도메인 개발 (0) | 2021.09.08 |
댓글