Open minsoo0715 opened 11 months ago
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();
}
}
할인 정책을 변경했을 때 오직 AppConfig의 코드만 변경하면 됨. 사용 영역의 코드는 변경되지 않고, 구성 영역의 코드만 변경됨.
public DiscountPolicy discountPolicy() {
// return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
커밋
OrderServiceImpl
이 DIP를 만족하게 하기 위해서DiscountPolicy
및MemberRepository
의 할당을 없애고, 외부에서 Injection이 이루어지도록 생성자 작성 (생성자 주입)OrderServiceImpl
은DiscountPolicy
및MemberRepository
인터페이스만을 바라봄AppConfig을 통해서 구현 클래스를 선택하는 역할을 수행하도록 함. 이제 각 구현 클래스는 어떤 구현 클래스가 주입될지를 알 필요가 없고 각자 기능에 대한 책임만 지면 됨. (어떤 면에서 LSP 관점에서 개선된 것으로 볼 수 있음.)