IoC, DI, Container

Mina Park·2022년 8월 15일
  1. 제어의 역전: IoC(Inversion of Control)
  • 프로그램의 제어 흐름을 직접하기보다는, 외부에서 관리하는 것
    ex) AppConfig에서 구현체 생성,
    OrderServiceImpl에서는 필요한 인터페이스만 호출하고 어떤 구현객체가 실행될지는 알 수 없음
public class AppConfig {

    //생성자 주입방식
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    private MemoryMemberRepository memberRepository() {
        return new MemoryMemberRepository(); //역할과 구현 클래스 분리
    }

    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

    private DiscountPolicy discountPolicy() {
//        return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }

}
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;
    }

    @Override
    public Order createOrder(Long memberId, String itemName, int itemPrice) {
        Member member = memberRepository.findById(memberId);
        int discountPrice = discountPolicy.discount(member, itemPrice);

        return new Order(memberId, itemName, itemPrice, discountPrice);
    }
}

프레임워크 vs 라이브러리

  • 프레임워크: 내가 작성한 코드를 제어하고 대신 실행 (ex. JUnit)
  • 라이브러리: 내가 작성한 코드가 직접 제어의 흐름을 담당
  1. 의존관계 주입: DI(Dependency Injection)
  • 의존관계는 정적인 클래스 의존 관계와, 실행 시점에 결정되는 동적인 객체(인스턴스) 의존 관계를 분리해서 생각해야 한다

    • 정적인 의존 관계: import 코드만 보고 파악 가능
      • but 실제 어떤 객체가 주입되는지는 알 수 없음
    • 동적인 의존 관계: 어플리케이션 실행시점에 실제 생성된 객체 인스턴스의 참조가 연결된 의존 관계
    • 의존관계 주입 사용시 정적인 클래스 의존관계는 변경하지 않고 동적인 의존관계만 쉽게 변경
  1. IoC Containter, DI Container
  • AppConfig처럼 객체를 생성하고 관리하면서 의존관계를 연결해주는 것
  • 의존관계 주입에 초점을 맞춰 주로 DI 컨테이너라고 부름

0개의 댓글