IoC란?
- Inversion of Control = 제어의 역행
- 프로그램을 구동하는데 필요한 객체에 대한 생성, 변경 등의 관리를 프로그램을 개발하는 사람이 아닌 프로그램을 구동하는 컨테이너에서 직접 관리하는 것
- 스프링은 IoC 구조를 통해 구동 시 필요한 객체의 생성부터 생명 주기까지 해당 객체에 대한 관리를 직접 수행한다.
IoC 컨테이너의 역할
- 객체의 생명주기와 의존성을 관리한다.
- VO(DTO, POJO) 객체의 생성, 초기화, 소멸 등의 처리를 담당한다.
- 개발자가 직접 객체를 생성할 수 있지만 해당 권한을 컨테이너에 맡김으로써 소스 코드 구현의 시간을 단축할 수 있다.

DI란?
Dependency Injection = 의존성 주입
IoC구현의 핵심 기술로, 사용하는 객체를 직접 생성하여 만드는 것이 아닌 컨테이너가 빈의 설정 정보를 읽어와 자동으로 해당 객체에 연결하는 것을 말한다.
이렇게 의존성을 주입 받게 되면 이후 해당 객체를 수정해야 할 상황이 발생했을 때 소스 코드의 수정을 최소화 할 수 있다.
[ 장점 ]
- 개발자가 작성해야 할 코드가 단순해진다.
- 각 객체 간의 종속 관계(결합도)를 해소할 수 있다.
- 두 객체 간의 관계를 말하며, 각 객체간의 내용이 수정될 경우 영향을 미치는 정도를 낮추는 것을 의미함.
- ex) A Class에서 B Class를 생성할 경우, 만약 B Class의 생성자 경우, 만약 B Class의 생성자의 매개변수가 변경되거나 제공하는 메소드가 변경될 경우 이를 사용하는 A Class의 일부 정보도 필히 수정해야 하는 상황이 발생 → 두 객체간 종속관계(결합도)가 강하다 라고 표현
의존 관계 주입 Annotation