Kim-Baek 개발자 이야기

[스프링 핵심원리] 18. 새로운 구조와 할인 정책 적용 본문

개발/Spring

[스프링 핵심원리] 18. 새로운 구조와 할인 정책 적용

김백개발자 2021. 10. 10. 16:08
김영한님의 [스프링 핵심 원리] 강의를 정리하고, 내가 생각한 내용까지 정리하는 포스팅

이제는 이전에 해보려고 했었던 할인 정책을 변경을 해보고자 한다. 기존에는 정액 할인 정책을 사용하여 어떤 주문이 들어오더라도 1000원만큼만 할인이 이루어졌다. 바꾸려고 하는 것은 정률 할인 정책으로 주문가격의 10%를 할인해주는 정책이다.

FixDiscountPolicy -> RateDiscountPolicy 로 변경을 하게 되는데 이제 어떤 부분을 바꿔주면 되는지 살펴보자. 우리는 AppConfig를 만들게 되면서 애플리케이션이 실제 로직이 수행되는 사용 영역과 객체를 생성하고 구성(Configuration)하는 영역으로 분리되었다.



현재 애플리케이션의 구조는 이와 같은 상태라고 할 수 있다. 그렇다면 할인정책은 어떻게 변경이 되어야 할까?

사용 영역에 있는 코드는 전혀 손대지 않고 구성영역의 AppConfig만 수정을 하면 된다. 실제 코드로 살펴보자.

package core.order;

import core.order.discount.DiscountPolicy;
import core.order.discount.FixDiscountPolicy;
import core.order.discount.RateDiscountPolicy;
import core.order.member.MemberRepository;
import core.order.member.MemberService;
import core.order.member.MemberServiceImpl;
import core.order.member.MemoryMemberRepository;
import core.order.order.OrderService;
import core.order.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());
    }

    private DiscountPolicy discountPolicy() {
        //return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }


}

구성을 담당하는 AppConfig에서 DiscountPolicy를 RateDiscountPolicy로 수정해주기만 하면 된다. 실제로 메인 메소드를 수행해보면서 결과가 정상적으로 나오는지 까지 확인해보자.

기존에는 20000원의 주문에도 1000원의 할인 금액이 적용되었는데, 정률 할인 정책으로 수정 후, 2000원으로 노출되는 것이 확인된다. 이렇게 우리는 사용 영역의 어떤 코드도 변경 없이 애플리케이션을 수정하게 된 것이다.

DIP를 지킨 것은 물론이고, OCP까지 한번에 지키게 된 것이다. 구성 영역의 코드는 수정이 되었는데요? 라고 물을 수 있다. 그렇지만 구성 영역은 당연히 변경이 되는 것이다. AppConfig 가 공연의 기획자라고 했을 때, 공연 기획자는 참여자의 구현 객체를 모두 알아야 하는 것이 맞다. 

그렇기 때문에 이 부분은 수정이 되지만, 사용 영역에서 DIP, OCP가 모두 지켜지는 것이다.

https://github.com/bgc8214/spring-core/tree/step8

 


 

반응형
Comments