Inversion of control, 제어의 역전
프로그램 제어 흐름 구조를 개발자가 아닌 라이브러리/프레임워크에서 관리하는 방법
개발자는 해당 흐름에 직접적으로 관여하지 않기 때문에 중복되는 코드 작성, 유지보수 과정을 줄일 수 있음
또한 외부에서 제어 흐름 구조를 담당하면 아래와 같은 장점이 있음
- 낮은 코드 결합도
- 해당 기능에 대해 애플리케이션 코드 간 간섭이 덜함
- 기능 확장 가능
- 동일한 애플리케이션 코드로 기능 변경
Dependency Injection
제어의 역전 중 한 가지로 객체지향 프로그래밍의 객체 간 의존성을 외부에서 주입하는 방법
기존에는 코드 내부에서 의존하는 객체를 직접 생성하여 참조했다면, DI는 생성하거나 의존할 객체를 특정 방식으로 선언하여 컨테이너에게 알림
컨테이너는 일괄적으로 객체를 관리하는 요소로서 객체의 생성, 의존성 등을 해결함
개발자가 일일이 객체 관리 기능에 관여하지 않기 때문에 유지보수 등에 용이함
Spring IoC, DI
스프링은 스프링 애플리케이션 객체의 생명주기와 의존성을 관리하는 IoC 컨테이너를 제공함
스프링 컨테이너는 @Component, @Bean 어노테이션이 붙은 클래스들을 스캔(컴포넌트 스캔)하여 스프링 빈으로 등록함
스프링 빈은 별도의 프로세스(초기화, AOP 등)를 거쳐서 등록, 관리됨