Kim-Baek 개발자 이야기

[스프링 핵심원리] 17. AppConfig 리팩토링 본문

개발/Spring

[스프링 핵심원리] 17. AppConfig 리팩토링

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

지난번에 AppConfig를 만들어서 관심사를 분리해서, 각자 역할들이 본인들의 역할의 수행에만 집중할 수 있는 코드를 완성했다. 그런데 다시한번 보면 AppConfig가 중복이 있고, 역할에 따른 구현이 잘 안보이는 문제가 있다.

우리가 원하는 그림은 이런 것 일 것이다. 역할이 있고 구현 객체들이 어떤 것인지 명확하게 보이는 그림이다.

package core.order;

import core.order.discount.FixDiscountPolicy;
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(new MemoryMemberRepository());
    }

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

}

리팩토링을 하기 전의 AppConfig 의 모습이다. 중복으로 MemoryMemberRepository를 만드는 것도 있고, 역할에서 어떤 구현을 사용하는 지도 명확하게 보이지 않는다.

package core.order;

import core.order.discount.DiscountPolicy;
import core.order.discount.FixDiscountPolicy;
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();
    }


}

리팩토링을 한 AppConfig의 코드이다. 역할과 구현을 명확하게 파악할 수 있도록 변경했다. 이제 MemberRepoistory의 구현체를 변경하고 싶다면 memberRepositoy()에서 리턴해주는 구현체만 변경해주면 전체가 동일하게 변경이 될 것이다.

이렇게 변경하니 한눈에 애플리케이션의 구성이 어떻게 되는지 알아볼 수 있게 되었다.

 

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

 

GitHub - bgc8214/spring-core: 스프링 핵심기술 프로젝트

스프링 핵심기술 프로젝트. Contribute to bgc8214/spring-core development by creating an account on GitHub.

github.com


반응형
Comments