IoC(Inversion of Control)와 DI(Dependency Injection)는 애플리케이션의 모듈 간 결합도를 낮추고, 확장성 및 유지보수성을 향상시키기 위해 사용된다.
"제어의 역전"이라는 뜻으로, 말 그대로 프로그램의 흐름이나 객체의 생명주기를 개발자가 아닌 프레임워크가 제어하는 디자인 패턴을 말한다. 전통적인 프로그래밍에서는 프로그램의 흐름이 코드에 의해 명시적으로 관리되었는데, IoC를 사용하면 이 과정을 프레임워크에 위임하고 개발자는 각 구성 요소에만 집중할 수 있다.
IoC를 구현하는 데 있어서 핵심적인 부분으로, 객체의 생명주기와 의존성을 관리하는 역할을 한다. 이 컨테이너는 객체를 필요할 때 생성하고, 의존성을 주입하며, 객체 간의 관계를 설정한다. 이를 통해 개발자는 인스턴스 생성에 대해 고민할 필요 없이 필요한 객체를 사용할 수 있다.
IoC의 한 형태로, 클래스의 의존성을 그 클래스 내부에서 생성하는 대신, 외부에서 주입받는 방식을 말한다. 다시 말해서 각 클래스가 자신의 의존성을 직접 관리하지 않고, 다른 클래스나 프레임워크에 의해 해당 의존성이 제공되는 방식이다. 이러한 방식은 소프트웨어 구성 요소 간의 결합도를 낮추고, 단위 테스트를 쉽게 만들며, 코드의 재사용성과 관리를 쉽게 할 수 있다.