💻 스프링 핵심 기술 - 기초
해당 강의는 김영한님의 스프링 핵심 원리- 기초 강의를 수강하여 공부한 내용은 간략하게 기록하는 기록장
스프링 핵심 원리 기초 강의
기존 VIP 고객은 1000 원을 할인해주는 정책
VIP 고객은 주문 금액의 10%를 할인해주는 것으로 변경
그렇게 기존 DiscountPolicy 인터페이스를 상속받은 RateDiscountPolicy를 생성
그럼 이제 생성된 할인 정책을 어플리케이션에 적용해보자
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository = new MemoryMemberRepository();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
Member member = memberRepository.findById(memberId);
int discountAmount = discountPolicy.discount(member,itemPrice);
return new Order(memberId,itemName,itemPrice,discountAmount);
}
}
문제점은 클라이언트인 OrderServiceImpl의 코드를 바꿔야한다!
DIP : 주문 서비스 클라이언트는 DiscountPolicy 인터페이스에 의존하면서 DIP 를 지킨거처럼 보인다?
클래스 의존관계를 분석해보자
인터페이스 뿐만 아니라 구현 클래스에도 의존하고 있다.
인터페이스 의존 : DiscountPolicy
구현 클래스 의존 : FixDiscountPolicy / RateDiscounPolicy
4.OCP : 변경하지 않고 확장 가능하다
-> 현재 코드는 기능을 확장해서 변경시 클라이언트 코드에 영향을 준다. OCP 위반
코드 상에서 확인해보면 이렇다
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
즉 DiscountPolicy 라는 추상 클래스에도 의존하지만 new RateDiscountPolicy 라는 구현 클래스에도 의존되는 상황
DIP 를 위반하는 상황
결국 여기서 FixDiscount 를 RateDiscount로 바꾸면서 클라이언트인 OrderServiceImpl의 소스도 수정해야하기 때문에 OCP 도 위배되는 상황
클라이언트 코드인 OrderServiceImpl은 DiscountPolicy 뿐만 아니라 구체 클래스에도 의존
그래서 OCP도 위배하게 된다. 즉 DIP 위반 해결을 위해서 추상클래스에만 의존하도록 수정해야한다.
private DiscountPolicy discountPolicy;
//이런식으로 구체 클래스를 할당하지 않는 것으로 해결한다
근데 이렇게 실행하면 NPE 에러 터짐
결국 이 문제를 해결 하려고 OrderServiceImpl에 DiscountPolicy의 구현객체를 대신 생성해서 주입해야한다.!
아마 이게 의존성주입 즉 DI라고 불리는 것이다.