[Spring] AppConfig

노유성·2023년 7월 11일
0
post-thumbnail

들어가며

[Spring] 예제1 에서 마지막에 DIP 위반 문제가 있다고 하고 마무리가 되었다.

public class MemberServiceImpl implements MemberService{
    private MemberRepository memberRepository = new MemoryMemberRepository(); // 인터페이스와 구현체에 모두 의존하고 있음. DIP 위반
    @Override
    public void join(Member member) {
        memberRepository.save(member);
    }

    @Override
    public Member findMember(Long memberId) {
        return memberRepository.findById(memberId);
    }
}

MemberService는 MemberRepository 즉, interface에만 의존해야하는데 오른쪽 생성자를 보면 구체에도 의존하고 있다는 것을 알 수 있다. MemberServcie의 관심사는 어떤 repository던 간에 개의치 않고 join과 find의 기능을 수행하는 것인데 현재 위 코드에서는 그 뿐만 아니라 어떤 repository를 이용할 것인지에 대한 책임도 갖고 있다.

이를 해결하기 위해서 우리는 관심사를 분리해야한다.

관심사의 분리


위 예시를 보면은 로미오의 역할은 줄리엣의 역할에만 집중해야 하지 어떤 배우를 줄리엣의 역할로 임명할 지에 대해서는 관심이 없어야한다. 어떤 배우이던 줄리엣의 역할만 한다면 로미오에게는 문제가 없고 또 그것이 로미오의 관심이어서는 안 된다. 그러면 누가 줄리엣 역할에 어떤 배우를 캐스팅할지는 신경 써야할까? 바로 기획지이다.

배우는 배역에만 집중하고 어떤 배역에 어떤 배우를 캐스팅할지는 기획자가 집중해야 하는 부분이다. 그래서 이를 해결하기 위해 AppConfig 파일을 만들었다.

AppConfig

App의 전체 동작을 구성하기 위해, 구체를 생성하고 연결의 책임을 갖는 즉, 기획자 역할을 하는 클래스를 만들었다.
/AppConfig.java

public class AppConfig {

    // 생성자를 통해서 주입한다.
    public MemberService memberService() {
        return new MemberServiceImpl(new MemoryMemberRepository());
    }

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

이렇게 memberService 객체가 필요하면 AppConfig를 통해서 생성하면 의존 관계가 설정되고 각 객체들은 자신의 역할에만 집중하게 할 수 있다.

/member/service/MemberServiceImpl

public class MemberServiceImpl implements MemberService{
//    private MemberRepository memberRepository = new MemoryMemberRepository(); // 인터페이스와 구현체에 모두 의존하고 있음. DIP 위반
    private final MemberRepository memberRepository;

    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
    
    ...

이제 MemberService는 더이상 구체에 의존하지 않으며 구체를 모른다. 단지 생성자를 통해서 누군가가 주입해주기를 기다릴 뿐이다. 이로써 DIP 원칙이 지켜졌다.

/order/OrderServiceImpl

public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }

OrderService도 마찬가지이다.

profile
풀스택개발자가되고싶습니다:)

0개의 댓글