SPRING 핵심 원리 [ 기본편 ]

[스프링 핵심 원리] 섹션 3.2 객체 지향 원리 적용 (새로운 할인 정책 적용과 문제점)

wlalsu_u 2023. 1. 31. 12:20

3.2.1  새로운 할인 정책 적용

 

 

 

앞서 섹션 3.1 에서 작성한 RateDiscountPolicy 를 적용시켜보자.

 

 

 

새로운 할인 정책을 적용시키기 위해서는, 

 

OrderServiceImpl 클래스를 다음과 같이 변경해야 한다.

 

 

 

public class OrderServiceImpl implements OrderService {
// private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
 private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
}

 

 

 

 

주석 처리한 FixDiscountPolicy 대신 RateDiscountPolicy 로 변경하였다.

 

 

 

 

 

여기서, 한 가지 문제점이 발생한다.

 

 

 

어플리케이션의 할인 정책을 변경하기 위해서는,
할인 정책의 클라이언트 (OrderServiceImpl) 소스 코드를 변경해야 하는 것이다!

 

 

 

 


 

 

 

3.2.2  새로운 할인 정책 적용의 문제점

 

 

 

앞선 코드에서 우리는,

 

 

1) 역할과 구현을 분리하여 구현하였다.

 

2) 다형성을 활용하고, 인터페이스와 구현 객체를 분리하였다.

 

 

 

 

 

따라서 OCP / DIP 의 원칙을 준수하였다고 생각했지만,

 

실제로는 객체 지향 설계 원칙을 따르지 못하였다.

 

 

 

 

 

출처 : 김영한 - spring 핵심 원리 - 기본편

 

 

 

 

 

앞서 기대했던 의존관계는, OrderServiceImpl 이 DiscountPolicy 인터페이스에만 의존하여,

 

DIP 원칙을 준수하는 것이었다.

 

 

 

 

 

하지만, 실제 의존관계가 다음과 같아지면서, 문제가 발생한다.

 

 

 

 

 

출처 : 김영한 - spring 핵심 원리 - 기본편

 

 

 

 

 

OrderServiceImpl 클라이언트는 DiscountPolicy 인터페이스 뿐만 아니라,

 

FixDiscountPolicy 구현체에도 의존하고 있다. ( DIP 위반 )

 

 

 

 

 

즉, 클래스의 의존관계를 살펴보면
클라이언트가 추상(인터페이스) 뿐만 아니라, 구체(구현) 클래스에도 의존하고 있는 것이다.

 

 

 

 

 

 

또한, 앞서 FixDiscountPolicy 를 RateDiscountPolicy 로 변경할 경우,

 

OrderServiceImpl 의 소스 코드를 변경해야 했다. ( OCP 위반 )

 

 

 

 

즉, 코드의 기능을 확장하고자 할 때,
클라이언트의 코드에도 영향을 준다는 문제점이 있다.

 

 

 

 

 


 

 

 

3.2.2  새로운 할인 정책 적용의 문제점 해결

 

 

 

 

앞선 2가지 문제점을 해결하는 방법을 찾아보자.

 

 

 

먼저, OrderServiceImpl 이 인터페이스 뿐만 아니라, 구현 클래스에도 의존하는 문제점이 있었으므로,

 

 

 

 

OrderServiceImpl 이 인터페이스에만 의존하도록 의존관계를 변경한다.

 

 

 

 

OrderServiceImpl 클래스 코드를 다음과 같이 일부 수정한다.

 

 

 

 

public class OrderServiceImpl implements OrderService {
 //private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
 private DiscountPolicy discountPolicy;
}

 

 

 

 

new RateDiscountPolicy() 라는 구현체를 작성하지 않고, 

 

인터페이스에만 의존하도록 변경하였다.

 

 

 

 

 

하지만, 실제 test 코드를 돌려보면,

 

NPE ( null pointer exception ) 이 발생하는 것을 확인할 수 있다.

 

 

 

 

 

 

즉, 추가적인 문제 해결을 위해서는,
OrderServiceImpl 에 DiscountPolicy 구현 객체를 생성하고 주입할 무언가가 더 필요하다!

 

 

 

 

 

 

 

 

 

 

김영한 '스프링 핵심 원리 - 기본편' 강의를 기반으로 작성하였습니다.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8