[inflearn] 스프링 핵심 원리 - 기본편/섹션 3 - 객체 지향 원리 적용
15. AppConfig 리팩터링
슬픈 야옹이
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 (리팩터링 후)
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()의 구현체가 무엇인지 한 눈에 파악하기 쉬워졌다.
또한 각 인터페이스의 구현체가 변경되어도 해당 메서드만 수정하면 되므로 코드 유지보수도 훨씬 용이해졌다.
다음 포스트에서는 새롭게 설계된 구조로 할인 정책을 다시 적용해본다.