코드 그라데이션

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

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

'Spring > 핵심 원리 구현' 카테고리의 다른 글

AppConfig 리팩터링  (0) 2024.01.16
관심사의 분리  (0) 2024.01.16
새로운 할인 정책 개발  (0) 2024.01.15
주문과 할인 도메인 - 구현과 테스트  (1) 2024.01.14
주문과 할인 도메인 - 설계  (0) 2024.01.13
Comments