의존성주입 (DI, Dependency Injection)이란 메인모듈 (main module)이 ‘직접’ 다른 하위 모듈에 대한 의존성을 주기보다는 중간에 의존성 주입자 (dependency injector)가 이 부분을 가로채 메인 모듈이 ‘간접’적으로 의존성을 주입하는 방식
- 의존한다 라는 의미 A가 B에 의존한다. = B가 변하면 A에 영향을 미치는 관계 = A - > B 를 의미하며 코드로는 이러한 것을 A가 B에 의존함

이를 통해 메인 모듈과 하위모듈간의 의존성을 조금 더 느슨하게 만들 수 있으며 모듈을 쉽게 교체 가능한 구조로 만듬
의존 관계 역전 원칙
의존성 주입을 할 때는 의존 관계 역전 원칙(DIP, Dependency Inversion Principle)이 적용
이는 2가지의 규칙을 지키는 상태를 말합니다
- 상위 모듈은 하위 모듈에 의존해서는 안된다. 둘 다 추상화에 의존해야 한다
- 추상화는 세부 사항에 의존해서는 안된다. 세부 사항은 추상화에 따라 달라져야 한다.
- 추상화는 변수처럼 데이터의 공통점을 묶거나, 프로세스의 세세한 과정을 보이지 않게 묶는다.
의존성 주입의 장점
- 외부에서 모듈을 생성하여 dev.add(new BackendDeveloper()) 이런 식으로 집어넣는 구조가 되기 때문에 모듈들을 쉽게 교체 할 수 있는 구조가 됩니다.
- 단위 테스팅과 마이그레이션이 (다른 운영환경으로 이동하는 것 (DB이동, 데이터 이동 등)) 쉬워집니다.
- 애플리케이션 의존성 방향이 좀 더 일관되어 코드를 추론하기가 쉬워집니다.
의존성 주입의 단점
- 결국에는 모듈이 더 생기게 되므로 복잡도가 증가합니다.
- 종속성 주입 자체가 컴파일을 할 때가 아닌 런타임 때 일어나기 때문에 컴파일을 할 때 종속성 주입에 관한 에러를 잡기가 어려워질 수 있습니다.
결국 DI DIP란 보다 좋은 코드(코드의 수정과 관리가 편함, 확장성이 있음 등)를 작성하기 위한 방법이라고 생각하면 됨