슬픈 야옹이 2023. 10. 14. 13:55

지난 포스트에서 AppConfig를 추가하여 구현 객체를 생성하고 연결하는 역할을 분리하였다.

 

근데 AppConfig 코드를 보면, 중복되는 부분이 보이고, 역할에 따른 구현이 한 눈에 잘 들어오지 않는다.

package hdxian.hdxianspringcore;

import hdxian.hdxianspringcore.discount.DiscountPolicy;
import hdxian.hdxianspringcore.discount.FixDiscountPolicy;
import hdxian.hdxianspringcore.member.MemberRepository;
import hdxian.hdxianspringcore.member.MemberService;
import hdxian.hdxianspringcore.member.MemberServiceImpl;
import hdxian.hdxianspringcore.member.MemoryMemberRepository;
import hdxian.hdxianspringcore.order.OrderService;
import hdxian.hdxianspringcore.order.OrderServiceImpl;

// 애플리케이션 전체를 설정하고 구성함.
// 앞으로 애플리케이션에 대한 환경 설정은 모두 이 클래스에서 수행한다.
public class AppConfig {

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

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


}

기존 AppConfig 클래스.

memberService와 orderService의 구현체는 잘 보이지만,

MemberRepository와 DiscountPolicy에 대한 구현이 중복되어 있고, 잘 보이지 않는다.

 

중복을 제거하고, 역할과 구현이 한 눈에 잘 들어오도록 AppConfig를 리팩터링 해보자.

 

AppConfig 리팩터링

별 건 없고, MemberRepository와 DiscountPolicy 구현체를 생성할 메서드를 따로 선언해 주기만 하면 된다.

 

AppConfig.java

 

AppConfig.java (리팩터링 후)

package hdxian.hdxianspringcore;

import hdxian.hdxianspringcore.discount.DiscountPolicy;
import hdxian.hdxianspringcore.discount.FixDiscountPolicy;
import hdxian.hdxianspringcore.member.MemberRepository;
import hdxian.hdxianspringcore.member.MemberService;
import hdxian.hdxianspringcore.member.MemberServiceImpl;
import hdxian.hdxianspringcore.member.MemoryMemberRepository;
import hdxian.hdxianspringcore.order.OrderService;
import hdxian.hdxianspringcore.order.OrderServiceImpl;

// 애플리케이션 전체를 설정하고 구성함.
// 앞으로 애플리케이션에 대한 환경 설정은 모두 이 클래스에서 수행한다.
public class AppConfig {

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

    public DiscountPolicy discountPolicy() {
        return new FixDiscountPolicy();
    }

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

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


}

 

memberRepository()와 discountPolicy()를 새로 선언하고, memberService()와 orderService()의 의존성 주입 부분(생성자 호출 부분)을 해당 메서드로 대체하였다.

 

이를 통해서 MemberRepository의 구현체가 무엇인지, DiscountPolicy()의 구현체가 무엇인지 한 눈에 파악하기 쉬워졌다.

 

또한 각 인터페이스의 구현체가 변경되어도 해당 메서드만 수정하면 되므로 코드 유지보수도 훨씬 용이해졌다.

 

다음 포스트에서는 새롭게 설계된 구조로 할인 정책을 다시 적용해본다.