작성 코드 문제점
package hello.core.order;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixedDiscountPolicy;
import hello.core.member.*;
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository = new MemoryMemberRepository();
private final DiscountPolicy discountPolicy = new FixedDiscountPolicy();
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
Member member = memberRepository.findById(memberId);
int discountPrice = discountPolicy.discount(member,itemPrice);
return new Order(member.getId(),itemName,itemPrice,discountPrice);
}
}
코드의 문제점
private final DiscountPolicy discountPolicy = new FixedDiscountPolicy();
-> private final DiscountPolicy discountPolicy = new RatedDiscountPolicy();


해결방안
public class OrderServiceImpl implements OrderService {
//private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
private DiscountPolicy discountPolicy;
AppConfig
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository);
}
public OrderService orderService() {
return new OrderServiceImpl(
new MemoryMemberRepository(),
new RatedDiscountPolicy());
}
}
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
...
}
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
public OrderServiceImpl orderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
...
}
AppConfig는 애플리케이션의 실제 동작에 필요한 구현 객체를 생성
- MemberServiceImpl, MemoryMemberRepository, OrderServiceImpl, FixedDiscountPolicy
AppConfig는 생성한 객체 인스턴스의 참조(레퍼런스)를 생성자를 통해서 주입
- MemberServiceImpl -> MemoryMemberRepository,
OrderServiceImpl -> MemoryMemberRepository, FixedDiscountPolicy
생성자 주입을 통해서 MemberServiceImpl은 MemberRepository 인터페이스만 의존. MemberServiceImpl 입장에서 어떤 구현 객체가 들어올지 알수 없고 MemberServiceImpl의 생성자를 통해서 어떤 구현 객체를 주입할지는 외부(AppConfig)에서 결정된다.
-> MemberServiceImpl은 의존관계에 대한 고민 여부는 외부에 맡기고 실행에만 집중하게 된다.

