뉴렉쳐님 강의를 재구성하여 작성합니다.
A 노트북에 B라는 부품이 쓰인다고 생각해보자.
A 노트북을 만들때 2가지 선택이 가능하다.
평생 B 부품만 쓴다면 일체형도 상관은 없을듯하다.
그러나 B 를 업그레이드해서 C가 새로 나온다면
교체형이 필수적일 것이다.
이와 같은 일이 java에서도 일어난다.
(출처:뉴렉쳐님 강의)
A에서 B가 사용된다면 2가지 방식으로 구현할 수 있다.
1. A가 B를 스스로 생성.
2. A가 (완성된) B를 참조.
왼쪽이 일체형(Composition)이고 오른쪽이 교체형(Association)이다.

Dependency : 부품
Injection : 부착
이걸 java에서는 A를 생성하기 위해서 B라는 부품(Dependency)을 부착(Injection)한다고 한다.
A는 B를 참조로 받아올때 2가지가 가능하다.
1. setter
2. constructor

setter는 여러번 호출이 가능해 불변성이 지켜지지 않고
constructor는 컴파일 단계에서 매개변수가 빠진것을 체크할 수 있다는 특징이 있을거같다.
위에 비유를 다시 가져와 A 노트북에 B말고도 C도 필요하고
D도 필요한데 D는 E,F가 필
요하다고 생각해보자.
A |-B
|-C
|-D |-E
|-F
A가 전부다 부착(Injection)하려면 조금 벅찰거같다.
그래서 이 일을 누군가 대신 해주면 A 입장에서는 편할것이다.

다음과 구체적인 주문서를 작성해 조립 업체한테 맡기면 편할것이다.
이때 조립 업체 역할을 하는것이 IoC 컨테이너다.
컨테이너 : 상자(완성된 부품을 필요할때 갖다 쓰면 됨)
조립 업체(IoC)에서 조립을 깔끔하게 해주면 A는 완제품을 상자(Container)에서 꺼내 쓰듯이 사용하면 된다.

근데 DI를 대행 해주는 상자면 DI 컨테이너라고 불러야하지 않을까?
조립은 단순히 부품을 만드는 일 뿐만 아니라 순서도 알아서 맞춰줘야한다.

DI를 직접적으로 구현한다면 A부터 순차적인 생산이 아니라
D부터 역순으로 생산해야한다.
그래서 생산의 역전의 의미를 담아 IoC라고 부른다.
스프링에서는 Aplication Context(인터페이스)가 IoC 컨테이너 역할을 수행한다.(스프링 IoC라고도 불림)
(Aplication Context가 IoC 컨네이터 역할을 수행하는거지 그 역할만 있는건 아니다.)