IoC ( Inversion of Control ) : 제어의 역전이란 뜻으로 프로그램의 제어 흐름을 구현체가 직접 제어하는 것이 아닌 외부에서 관리하는 것을 의미한다.
DI (Dependency Injection) : 의존관계 주입이란 뜻으로 의존관계는 정적인 클래스 의존 관계와, 실행 시점에 결정되는 동적인 객체(인스턴스)의존 관계로 분리해서 생각해야 한다. DI는 애플리케이션 실행 시점에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결되는 것을 의존관계 주입이라고 한다.
위와 같은 Ioc, DI의 예시코드를 보자.
public class AppConfig {
public MemberService memberService(){
return new MemberServiceImpl(memberRepository());
}
public OrderService orderService(){
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public DiscountPolicy discountPolicy(){
return new RateDiscountPolicy();
}
}
여기서 AppConfig는 외부에서 프로그램의 흐름을 제어해주는 IoC, 그리고 외부에서 의존관계를 연결해주는 DI를 만족하는 클래스이다. 이것을 흔히 IoC 컨테이너 또는 DI 컨테이너라고 한다. 위의 AppConfig가 제어하는 객체들을 그림으로 표현하자면 아래와 같다.
