[인프런 스프링 핵심 원리 - 기본편 참고]
애플리케이션의 전체 동작 방식을 구성(config) 하기 위해, 구현 객체를 생성하고, 연결하는 책임을 가지는 별도의 책임 클래스
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
}
기존에 작성된 코드
FixDiscountPolicy
에서 RateDiscountPolicy
로 변경하기 의해서 OrderServiceImpl
의 소스 코드도 함께 변경해야 한다.OrderServiceImpl
은 DiscountPolicy
의 인터페이스 뿐만 아니라 구체 클래스(FixDiscountPolicy
)도 함께 의존하고 있다.AppConfig
를 사용하여 DIP,OCP를 위반하지 않게 할 수 있다.
AppConfig.java
public class AppConfig {
public MemberService memberService(){
return new MemberServiceImpl(new MemoryMemberRepository());
}
public OrderService orderService(){
return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
}
public
}
MemberServiceImpl
MemoryMemberRepository
OrderServiceImpl
FixDiscountPolicy
OrderServiceImpl.java
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;
}
}
MemberServiceImpl
은 구현체에 의존하지 않는다. -> DIP 지킴MemberServiceImpl
은 의존관계에 대한 고민은 외부에 맡기고 실행에만 집중하면 된다.OrderApp.java
public class OrderApp {
public static void main(String[] args) {
AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
OrderService orderService = appConfig.orderService();
//MemberService memberService = new MemberServiceImpl();
//OrderService orderService = new OrderServiceImpl();
Long memberId = 1L;
Member member = new Member(memberId, "memberA", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(memberId, "itemA", 10000);
System.out.println("order = " + order);
}
}