IoC와 DI는 혼동하기 쉬운 개념이다. 실제로, 이 둘을 동일하게 얘기하는 경우도 많다. IoC와 DI에 대한 개념을 정리해두자!
public class A {
B b = new B();
public void print() {
System.out.println(b.name);
}
}
class A가 제대로 동작하기 위해서는 class B가 필요하다. class A는 능동적으로 자신이 사용할 오브젝트를 생성하고, 오브젝트 내의 메소드를 사용한다. 자신이 사용할 클래스를 결정하고, 언제 어떻게 오브젝트를 만들지에 대해 결정한다. 이는 사용하는 쪽에서 모든 종류의 작업을 제어하는 구조이다.
제어의 역전이란 이런 제어 흐름의 개념을 뒤집는 것이다. 제어의 역전에서는 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하고 생성하지 않는다. 모든 제어의 권한을 자신이 아닌 다른 대상에게 위임하기 때문이다. 제어의 역전의 개념을 사용하게 되면 class A는 능동성을 잃고 수동적인 존재가 된다. 자신이 사용할 오브젝트들을 직접 생성하지 않고 다른 대상으로부터 공급받는 것이다.
이러한 제어의 역전 개념은 프레임워크만의 기술도 아니고 디자인 패턴에서도 발견할 수 있는 상당히 폭넓게 적용되는 프로그래밍 모델이다. IoC의 적용을 통해 얻을 수 있는 장점들은 아래와 같다.
스프링이 제공하는 IoC 방식의 핵심을 짚어주는 용어이다. IoC가 너무 폭넓게 사용되는 용어여서 스프링 IoC 컨테이너라고만 했을 경우 스프링이 제공하는 기능의 특징을 명확하게 표현하지 못한다. 따라서 좀더 의도가 명확히 드러나도록 DI, 의존성 주입이라는 용어를 사용하게 되었다. 구체적인 의존 오브젝트와 그것을 사용할 주체, 보통 클라이언트라고 불리는 오브젝트를 런타임 시에 연결해주는 작업을 말한다.
위의 코드에서 B 클래스와 같은 레퍼런스를 외부로부터 제공받고 이를 통해 다른 오브젝트들과 동적으로 의존관계가 만들어지는 것, 즉 제 3의 존재가 있다는 것이 DI의 핵심이다. 스프링의 애플리케이션 컨텍스트, 빈 팩토리, IoC 컨테이너 등이 이러한 제 3의 존재라고 볼 수 있다.
- 'A가 B에 의존하다'의 의미
(= A가 B를 사용한다)
(= B가 변하면 A에 영향을 미친다)
(= A가 변하면 B는 영향을 받지 않는다)
[참조] https://medium.com/@jang.wangsu/di-inversion-of-control-container-%EB%9E%80-12ecd70ac7ea
[참조] 토비의 스프링 3.1