스프링 핵심 원리 1 - 예제 만들기 4

WooHyeong·2022년 10월 15일

Spring

목록 보기
19/27

AppConfig 리팩터링

현재 AppConfig를 보면 중복이 있고, 역할에 따른 구현이 잘 안보인다.

기대하는 그림

리팩터링 전
public class AppConfig {

    public MemberService memberService(){
        return new MemberServiceImpl(new MemoryMemberRepository());
    }

    public OrderService orderService() {
        return new OrderServiceImpl(new MemoryMemberRepository(),
                new FixDiscountPolicy());
    }
}

중복을 제거하고, 역할에 따른 구현이 보이도록 리팩터링 한다.
(new MemoryMemberRepository() 중복 제거)

리팩터링 후
public class AppConfig {

    public MemberService memberService(){
        return new MemberServiceImpl(memberRepository());
    }

    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(),
                discountPolicy());
    }

    public DiscountPolicy discountPolicy() {
        return new FixDiscountPolicy();
    }
}
  • new MemoryMemberRepository() 이 부분이 중복 제거되었다. 이제 MemoryMemberRepository를 다른 구현체로 변경할 때 한 부분만 변경하면 된다.
  • AppConfig를 보면 역할과 구현 클래스가 한눈에 들어온다. 애플리케이션 전체 구성이 어떻게 되어있는지 빠르게 파악할 수 있다.

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

  • 처음으로 돌아가서 정액 할인 정책을 정률 % 할인 정책으로 변경해보자.
  • FixDiscountPolicy -> RateDiscountPolicy

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

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

할인 정책 변경 구성 코드

public class AppConfig {

    public MemberService memberService(){
        return new MemberServiceImpl(memberRepository());
    }

    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(),
                discountPolicy());
    }

    public DiscountPolicy discountPolicy() {
        return new RateDiscountPolicy();
    }
}
  • AppConfig에서 할인 정책 역할을 담당하는 구현을
    FixDiscountPolicy -> RateDiscountPolicy 객체로 변경했다.
  • 이제 할인 정책을 변경해도, 애플리케이션의 구성 역할을 담당하는 AppConfig만 변경하면 된다.

이로써, DIP와 OCP를 모두 만족하게 되었다.

참조 : 인프런 김영한 - 스프링 핵심 원리 기초 강의

profile
화이링~!

0개의 댓글