[개발] - Spring/핵심 원리 구현
새로운 할인 정책 적용과 문제점
완벽한 장면
2024. 1. 15. 23:21
앞선 글에서 추가한 할인 정책을 애플리케이션에 적용한다.
일단 앞서 추가한
public class RateDiscountPolicy implements DiscountPolicy {
private int discountPercent = 10; // 할인율 10%
@Override
public int discount(Member member, int price) {
if (member.getGrade() == Grade.VIP) {
return price * discountPercent / 100; // 10퍼센트
} else {
return 0;
}
}
}
이걸 적용하려면 일단 OrderServiceImpl을 조금 바꿔야 한다.
(고정 할인 금액 => 할인율 적용 금액)
OrderServiceImpl 수정
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository = new MemoryMemberRepository();
// private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); step1. 이거 삭제
private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); // 이렇게
...
}
여기서 문제점 발견
왜 클라이언트 코드를 변경해야 하는지 클래스 다이어그램으로 의존관계를 분석해보자.
기대했던 의존관계
그런데
실제 의존관계
잘 보면 클라이언트인 `OrderServiceImpl` 이 `DiscountPolicy` 인터페이스 뿐만 아니라
`FixDiscountPolicy` 인 구체 클래스도 함께 의존하고 있다.
실제 코드를 보면 의존하고 있다! **DIP 위반
정책 변경
그러면, 어떻게 문제를 해결할 수 있을까?
결론
인터페이스에만 의존하도록 설계를 변경
인터페이스에만 의존하도록 코드 변경**
해결 방안
- 이 문제를 해결하려면 누군가가 클라이언트인 `OrderServiceImpl` 에 `DiscountPolicy` 의 구현 객체를 대신 생성하고 주입해주어야 한다.
728x90
반응형