DI(Dependency Injection)와 IoC(Inversion of Control)는 소프트웨어 설계 원칙과 패턴과 관련된 개념입니다.
이들은 특히 객체 지향 프로그래밍에서 코드의 유연성과 테스트 용이성을 향상시키는 데 사용됩니다.
DI
- 의존성 주입은 객체가 실행 시간에 외부에서 필요한 의존성(다른 객체나 서비스)을 받는 설계 패턴입니다.
- 이 패턴을 사용하면 객체는 자신이 의존하는 객체를 직접 생성하지 않고, 외부에서 제공받게 됩니다.
이를 통해 객체간의 결합도를 낮추고, 코드의 재사용성과 테스트 용이성을 향상시킬 수 있습니다.
- 예를 들어, 데이터베이스와 통신하는 서비스 객체가 있다고 할 때, DI를 사용하지 않는 경우 서비스 객체 내부에서 데이터베이스 연결 객체를 직접 생성합니다.
반면, DI를 사용하는 경우 데이터베이스 연결 객체는 외부에서 생성되어 서비스 객체에 주입됩니다.
- DI는 주로 생성자 주입, 세터 주입, 메서드 주입의 세 가지 방법으로 구현됩니다.
IoC
- 제어의 역전은 프로그램의 제어 흐름을 사용자 코드가 아니라 외부 프레임워크나 컨테이너가 관리하는 설계 원칙입니다.
- IoC의 핵심 아이디어는 프로그램의 제어 흐름을 사용자 정의 코드에서 프레임워크로 이동시키는 것입니다.
이를 통해 코드의 유연성과 확장성을 향상시킬 수 있습니다.
- DI는 IoC의 한 형태로 볼 수 있습니다.
DI를 통해 객체의 생성과 의존성 관리를 외부 컨테이너에 위임함으로써, 객체의 제어 흐름을 역전시킵니다.
- IoC는 DI 외에도 이벤트 핸들링, 콜백 메서드, 템플릿 메서드 패턴 등 다양한 형태로 구현될 수 있습니다.
간단히 말해, DI와 IoC는 객체 간의 결합도를 낮추고, 코드의 유연성과 테스트 용이성을 향상시키기 위해 사용되는 설계 원칙과 패턴입니다.
DI는 의존성을 외부에서 주입하는 방법으로 구현되며, IoC는 제어 흐름을 사용자 코드에서 외부 프레임워크로 이동시키는 것을 의미합니다.