[Spring] 새로운 구조와 할인 정책 적용

새로운 구조와 할인 정책 적용

- 처음으로 돌아가서 정액할인 정책을 정률 (%) 할인 정책으로 변경해보자.

- FixDiscountPolicy > RateDiscountPolicy : 어떤 부분만 변경하면 될까?

 

"AppConfig"의 등장으로 애플리케이션이 크게 사용영역과, 객체를 생성하고 구성(Configuration)하는 영역으로 분리되었다.

따라서 구성영역의 코드만 고치면 됨 !!!

- `FixDiscountPolicy` > `RateDiscountPolicy` 로 변경해도 구성 영역만 영향을 받고, 사용영역은 전혀 영향을 받지 않는다.

package hello.core;

import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDisCountPolicy;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;

public class AppConfig {
    public MemberService memberService(){
        return new MemberServiceImpl(memberRepository());
    }
    private MemberRepository memberRepository(){
        return new MemoryMemberRepository();
    }
    public OrderService orderService(){
        return new OrderServiceImpl(memberRepository(),discountPolicy());
    }
    public DiscountPolicy discountPolicy(){
    /*FixDiscountPolicy() > RateDisCountPolicy() 만 변경 */
        return new RateDisCountPolicy();
    }

}

바꿔준 후 테스트 코드 다 돌려보면 정률정책으로 잘 변경되었다는 것을 알 수 있다 !

 

결과

- `AppConfig`에서 할인 정책 역할을 담당하는 구현을 `FixDiscountPolicy` > `RateDiscountPolicy` 객체로 변경했다.

- 이제 할인 정책을 변경해도, 애플리케이션의 구성역할을 담당하는 AppConfig만 변경하면 된다.

    클라이언트 코드인 `OrderServiceImpl`를 포함해서 사용영역의 어떤 코드도 변경할 필요가 없다.

- 구성영역은 당연히 변경된다. 구성역할을 담당하는 AppConfig를 애플리케이션이라는 공연의 기획자로 생각하자.

    공연의 기획자는 공연참여자인 구현 객체들을 모두 알아야 한다.

-  DIP , OCP 가 지켜졌다.