의존성 주입

2023년 10월 10일

의존성 주입은 무엇일까. 의존성, 주입. 너무 안 어울리는 단어 두개를 붙여놨으니 단번에 이해가 안되는 게 당연하다. (네이밍이 이래서 중요하다)

의존성 주입을 이해하려면 일단 ‘의존성’, ‘IoC 컨테이너’개념을 알아야한다.

의존성

하나의 클래스가 다른 클래스에 의존하는 상태를 만들한다.

class A {
	const b = new B()
}

class B{
	//...
}

위 코드를 보면 클래스A는 클래스B의 인스턴스를 생성해서 사용한다. 이럴 경우 클래스A는 클래스 B에 의존성이 있는 상태가 된다.

IoC(Inversion of Control) 제어의 역전

~~클래스A는 클래스B에 의존하는데. 근데 이게 역전..이 되어..? 그럼 B가 A에게 의존하는 걸로 바뀐다는 건가? → 아니다~~

A가 B의 객체 인스턴스를 직접 생성했지만, 이러한 작업을 중간의 매개체에게 위임할 수 있다. 이럴 경우 A는 B에 의존적이지 않게 된다. 직접 B 인스턴스를 생성할 필요없이 매개체가 주는 인스턴스를 받아서 사용하니까.

이런 매개체를 IoC 컨테이너라고 부른다.

(원래 있던 제어(의존성)의 방향을 바꿨으니 제어의 역전이라고 부르는 것이고)

IoC 컨테이너의 역할

  • 개발자에게 위임받아 인스턴스를 생성, 해제, 관리하는 역할을 해준다.
  • 프레임워크가 이 역할을 담당해준다. NestJS를 사용한다면 Nest 런타임이 이런 역할.

의존성 주입

그럼 의존성 주입은 간단히 설명하자면.

  • Ioc 컨테이너가 객체 생성을 비롯한 관리를 해주고
  • 그걸 객체를 사용하는 쪽이 ‘의존성을 주입’받는다고 한다.

의존성 주입의 장점

굳이 이런식으로 만드는데는 다 이유가 있다.

  • 직접 생성하는 것이 아니라 IoC컨테이너를 통해 주입받아서 사용하기 때문에, 서비스, 프로바이더들 간의 의존성이 감소한다. 이는 재사용성, 유지 보수에 용이하다.
  • 원하는 객체의 상태를 직접 세팅할 수 있게 때문에 테스트 코드 작성이 수월해진다.

NestJS 의존성 주입

Nest 런타임이 IoC 컨테이너로서 의존성을 관리해준다. 별다른 설정이 없으면 프로세스에서 인스턴스가 여러 개 생기지 않고 1개만 생기도록 해준다.(싱글턴)

아래와 같은 방식으로 NestJS에서 의존성 주입을 사용할 수 있다.

1) 프로바이더에서

서비스, 리포지토리, 팩토리, 핼퍼 클래스 상단에 @Injectable()데코레이터를 사용한다. 이렇게 하면 객체를 관리하는 역할을 Nest에서 위임하게 된다.

@Injectabel()
class TestService {}

2) 의존성 주입받는 쪽에서

Nest가 생성, 관리해주는 객체를 받아 써먹는 경우(=의존성을 주입받는 경우) 이렇게 사용하면 된다.

예시) Controller에서 Service를 주입받아 사용하는 경우.

  • 인스턴스를 생성할 필요 없이, 객체 사용할 수 있따.
class TestController {
	constructor(
		private testService:TestService 
	){}
}

*원래 Javascript라면 아래 처럼 적어야하는데, Typescript라서 이렇게 축약해서 적을 수 있다. (참고 - 타입스크립트 → 자바스크립트 변환 코드)

class TestController{
	constructor(testService: TestService){
		this.testService = testService;
	}
}

그래서

의존성 주입을 쉽게 풀어서 쓴다면. 뭐라고 쓸 수 있을까…? ”객체를 직접 생성, 관리하는 게 아니라, 다른 관리 주체에 위임하고 그걸 받아서 쓰는 것” 정도로 할 수 있지 않을까.

위에서 네이밍이 어렵게 됐다고 했는데, 짧은 단어로 표현할 좋은 대안이 생각나지 않는다. 많은 개념이 쌓인 상태에서 짧은 단어로 만들려다보니 어려워져서 그렇다. 사실 개발의 많은 개념이 그렇다. 한 개념을 이해한 그 레이어 위에 이해를 해야 개념을 이해할 수 있어서 개념어만 보고 이해하기 어렵다. 이해를 하고 난 다음에야 그 개념어의 효용이 생긴다. 알고난 뒤에만 제대로 이해하면서 부를 수 있는 마치 호그와트 필요의 방 같은 것.

끝!


참고 자료


TAGS
NEST.JS