현재 AppConfig를 보면 중복이 있고, 역할에 따른 구현이 잘 안보입니다.
클라이언트가 주문할 때 생각해보면 주문 서비스 역할이 있었고, 주문 서비스 역할은 또 회원 저장소 역할이 있고, 할인 정책 역할이 있었습니다.
역할과 구현을 분리해서 한 그림에 보고 싶은데 현재 설정 정보에는 그런게 전혀 보이지 않습니다.
설정 정보에는 이게 한 그림으로 보여야 합니다.
그래서 역할들을 드러나게 하는게 중요합니다.
"이게 무슨 말인지 모르겠다면 일단 리펙터링을 해봅시다. 그럼 역할들을 드러나게 한다는 의미를 알 수 있습니다!"
🌟 [TIP]
Command + Option + M : 리펙터링 단축키
지정한 코드를 별도의 메소드나 파라미터 등등으로 뽑아내는 기능
→ 자세히
예) 커서를 new MemoryMemberRepository()에 두고 리펙터링을 하면 밖으로 뽑아낼 수 있습니다.
package hello.core;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
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;
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();
}
}
이렇게 리펙터링을 하면 어떤 장점이 있을까요?
코드만 봐도 역할이 다 드러납니다. 메서드 이름만 봐도 역할을 알 수 있습니다.
즉, MemberService 역할에서는 MemberServiceImpl 구현체를 쓰겠다, MemberRepository 역할에서는 MemoryMemberRepository를 쓰겠다를 한번에 볼 수 있습니다.
만약 나중에 메모리를 DB로 바꾼다고 해도 return new MemoryMemberRepository();
부분만 바꾸면 될 것입니다.