Spring핵심원리- 새로운 할인 정책 개발

DOYOUNG KIM·2024년 1월 9일
0

Spring프레임워크

목록 보기
11/18

💻 스프링 핵심 기술 - 기초
해당 강의는 김영한님의 스프링 핵심 원리- 기초 강의를 수강하여 공부한 내용은 간략하게 기록하는 기록장
스프링 핵심 원리 기초 강의

새로운 주문 할인 정책

기존 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의 코드를 바꿔야한다!

문제점

  1. 역할과 구현을 충실하게 분리 ---> O
  2. 다형성을 활용하고, 인터페이스와 구현 객체를 분리했다. ---> O
  3. OCP, DIP 같은 객체지향 설계 원칙 준수
    -> 사실 아니다

    DIP : 주문 서비스 클라이언트는 DiscountPolicy 인터페이스에 의존하면서 DIP 를 지킨거처럼 보인다?

    클래스 의존관계를 분석해보자
    인터페이스 뿐만 아니라 구현 클래스에도 의존하고 있다.
    인터페이스 의존 : DiscountPolicy
    구현 클래스 의존 : FixDiscountPolicy / RateDiscounPolicy

4.OCP : 변경하지 않고 확장 가능하다
-> 현재 코드는 기능을 확장해서 변경시 클라이언트 코드에 영향을 준다. OCP 위반

DIP & 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라고 불리는 것이다.

profile
매일 1%씩 성장하는 개발 공부 블로그 입니다.

0개의 댓글

관련 채용 정보