DI(Dependency Injection / 의존성 주입)
Tight Coupling(강한 결합)을 Loose Coupling(느슨한 결합)으로 전환 시키는 방법
제어의 역전(Inversion of Control)의 기술 중 하나
- 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴
- 인터페이스를 사이에 둬서 클래스 레벨애서는 의존 관계가 고정되지 않도록 하고
런타임 시 관계를 동적으로 주입
정리
- 두 객체 간의 관계라는 관심사의 분리
- 두 객체 간의 결합도를 낮춤
- 객체의 유연성을 높임
- 테스트 작성을 용이하게 함
의존성 주입의 3가지 방법
- 생성자 주입(Constructor Injection)
- 생성자 주입은 호출 시점에 1회 호출되는것을 보장
- 주입받은 객체가 변하지 않거나, 반드시 객체의 주입이 필요한 경우 강제하기 위해 사용
- 많은 디자인 패턴에서 권장됨
- 수정자 주입(Setter Injection)
- 필드 값을 변경하는 Setter를 통해서 의존 관계를 주입하는 방법
- 주입받는 객체가 변경될 가능성이 있는 경우에 사용
- 주입할 대상이 없는 경우 오류가 발생할수 있음
- 필드 주입(Field Injection)
- 필드에 바로 의존관계를 주입하는 방법
- 코드가 간결해져서 과거에 많이 사용하는 방법
- 필드 주입은 외부에서 접근이 불가능하다는 단점 존재
생성자 주입을 사용해야하는 이유
많은 DI 프레임워크들이 대부분 생성자 주입을 권장함
- 객체의 불변성 확보
- 테스트 코드의 작성
- 순환 참조 에러 방지
IoC(Inversion Of Control, 제어의 역전)
일반적인 프레임워크 디자인 패턴 중 하나
IoC의 개념이 나오게 되면서 프레임워크가 dependency를 container화 시켜 생명주기를 관리
개발자가 작성한 객체나 메서드의 제어를 개발자가 아니라 외부에 위임하는 설계 원칙을 제어의 역전이라고 함
제어 역전에서는 오브젝트 스스로가 사용할 오브젝트를 결정하지도, 생성하지도 않음
원칙의 이름 그대로 제어에 대한 권한이 개발자에서 외부 환경으로 역전 되는 것