의존성 주입

종종2·2023년 8월 5일
0

의존성 주입

객체간의 의존성을 객체 외부에서 주입하는 것을 의미한다.
객체지향 프로그래밍에서는 객체간의 의존성이 있다는 것은 객체간에 의존 관계가 있다고 한다.
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)으로 만들어 주는 방식이 있다.
이를 디커플링이 된다고도 하는데

느슨한 결합

  • Nest.js에서 이 역할을 해주는 기능이 있다.
  • 코드의 유지보수성을 높여주며, 유닛테스트 하기가 쉽다.

강한결합

  • 하나의 객체를 변경하면 다른 객체들도 변경이 당연해서 쉽게 놓칠 수 있다.
  • new를 과도하게 사용하게 되어 메모리를 많이 사용하게 된다.

의존관계역전원칙

 - 상위 모듈은 하위 모듈에 의존X 둘다 추상화에 의존
 - 추상화는 세부사항에 의존 X 세부사항은 추상화에 따라 달라져야함          

IoC(Inversion of Control)

프로그램의 제어 흐름과 의존성 관리를 개발자가 아닌 프레임워크같은 것에 위임하는 것 결합도를 낮춰주고 유지보수성을 향상시킨다.

그럼 IoC와 DI의 차이점은 무엇인가?

나도 이에 대해서 매번 헷갈리고 봐도 모르겠던 내용이다. 이번에 공부해보면서 차이에 대해 이해해보려고 했는데, 내가 이해한 것은 IoC는 프레임워크에 대한 개념이고, DI는 소프트웨어 디자인 패턴 중 일부로 IoC의 일부형태가 DI라고 이해하면된다.

profile
나 이현종

0개의 댓글