-
Dependency Injection의 약자로 의존성 주입 또는 의존관계 주입이라 부른다.
-
의존성을 분리시켜 사용하며 결합도를 낮추는 작업이다.
-
장점
- 의존성이 줄어든다.
- 재사용성이 높은 코드가 된다.
- 테스트하기 좋은 코드가 된다.
- 가독성이 높아진다.
- 쉽게 말하면 A와 B가 존재할 경우 A가 변하는 것에 의해 B도 변한다면 B가 A에 대한 의존성을 갖는다 라고 말 할 수 있다.
- 흔히 아래와 같이 Class 내부에 Instace를 직접 생성하면 의존성이 생긴다고 본다.
class A{
public num : number = 1;
}
class B{
private a : A;
constructor(){
this.a = new A();
}
}
let instanceB = new B();
console.log(instanceB['a'].num);
/// 1
- Class 내부가 아닌 외부에서 객체를 생성해서 넣어주는 것이다.
class A{
public num : number = 1;
}
class B{
private a : A;
constructor(a : A){
this.a = a;
}
}
let instanceB = new B(new A());
console.log(instanceB['a'].num);
/// 1
- 의존관계 역전의 원칙으로 의존관계를 분리시킨다.
/// 인터페이스를 이용하여 의존성을 분리시킬 수 있다.
/// number를 변수로 갖는 class면 어떤 class여도 B class에 주입할 수 있다.
interface DIinterface{
num : number
}
class A implements DIinterface{
public num : number = 1;
}
class C implements DIinterface{
public num : number = 2;
}
class B{
private a : DIinterface;
constructor(a : DIinterface){
this.a = a;
}
}
let instanceB0 = new B(new A());
let instanceB1 = new B(new C());
console.log(instanceB0['a'].num);// 1
console.log(instanceB1['a'].num);// 2
/// interface가 제어의 주체가 된다.
interface DIinterface{
// num : number
}
class A implements DIinterface{
public num : number = 1;
}
class C implements DIinterface{
public num : number = 2;
}
class B{
private a : DIinterface;
constructor(a : DIinterface){
this.a = a;
}
}
let instanceB0 = new B(new A());
let instanceB1 = new B(new C());
console.log(instanceB0['a'].num);// error
console.log(instanceB1['a'].num);// error
- IoC는 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다.
- NestJS에서 Provider 간의 관계를 관리하는 ("IoC") 컨테이너가 있다.