객체간의 의존성을 객체 외부에서 주입하는 것을 의미한다.
객체지향 프로그래밍에서는 객체간의 의존성이 있다는 것은 객체간에 의존 관계가 있다고 한다.
A가 B를 의존한다고 하면, B가 변하면 A에 영향을 끼친다.
//의존한다.
class B{
aaa(){
console.log("aaa함수");
}
}
class A{
bbb(){
new B().aaa();
}
}
위의 코드처럼 의존한다는 것은 B클래스가 변하면 A클래스가 마찬가지로 변하기 때문에 A가 B에 의존한다고 한다.
//
class Controller{
constructor(service){
this.service = service;
}
aaa(){
this.service.bbb();
}
}
class Service(){
bbb(){
console.log("주입")
}
}
const service = new Service();
const controller = new Controller(service);
controller.aaa() // "주입";
의존성 주입을 하다보면 강한결합(tight-coupling)의 경우가 있는,
메인모듈이 직접 다른 하위 모듈에 의존성을 주지 않고, 의존성 주입자 (Dependency Injector)를 주어 간접적으로 의존성을 주입하는 방식을 통해 느슨한 결합(loose-coupling)으로 만들어 주는 방식이 있다.
이를 디커플링이 된다고도 하는데
느슨한 결합
강한결합
- 상위 모듈은 하위 모듈에 의존X 둘다 추상화에 의존
- 추상화는 세부사항에 의존 X 세부사항은 추상화에 따라 달라져야함
프로그램의 제어 흐름과 의존성 관리를 개발자가 아닌 프레임워크같은 것에 위임하는 것 결합도를 낮춰주고 유지보수성을 향상시킨다.
나도 이에 대해서 매번 헷갈리고 봐도 모르겠던 내용이다. 이번에 공부해보면서 차이에 대해 이해해보려고 했는데, 내가 이해한 것은 IoC는 프레임워크에 대한 개념이고, DI는 소프트웨어 디자인 패턴 중 일부로 IoC의 일부형태가 DI라고 이해하면된다.