본문 바로가기
백엔드/스프링

[Inflearn] AppConfig 리팩터링(DIP 만족)

by dustnn 2025. 2. 23.

어떤 역할이 있고, 그 역할이 어떻게 구현되는지가 한 눈에 딱 보여야 한다.

 

 

OrderServiceImpl

 

클라이언트코드

DiscountPolicy 추상화 인터페이스에만 의존하도록 코드 변경(객체 지정을 AppConfig에게 맡김)

 

AppConfig

 

<기존 AppConfig 코드>

package hello.core;

import hello.core.discount.FixDiscountPolicy;
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;
import org.springframework.core.OrderComparator;

public class AppConfig {

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

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

}

 

1. new MemoryMemberRepository() 부분이 중복된다.

2. 애플리케이션 전체 구성(역할/구현)이 어떻게 되어 있는지 코드만 보고 한 눈에 파악이 어렵다.

 

 

<수정된 AppConfig 코드>

 

memberService()가 아니라 memberRepository()를 따로 두어

그 안에서 MemoryMemberRepository()라고 객체 지정을 했다.

그리고 orderService()가 아니라 discountPolicy()를 따로 두어

그 안에서 FixDiscountPolicy()라고 객체 지정을 했다.

package hello.core;

import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
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;
import org.springframework.core.OrderComparator;

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(){
        return new FixDiscountPolicy();
    }

}

 

이렇게 한다면 한 눈에 보일 뿐더러 나중에 혹시 memberRepository() 나 discountPolicy() 종류를 바꾸고 싶다면

언제든 바꿀 수 있어 효율적인 코드다.

 

1. new MemoryMemberRepository() 부분 중복 제거됨

2. 회원 저장소와 할인 정책 부분이 한 눈에 들어와 구조를 한 눈에 파악할 수 있다.