Back to the Basics

[NestJs] NestJs의 IoC container 에 대하여 본문

Programming Languages/Typescript & NestJS

[NestJs] NestJs의 IoC container 에 대하여

9Jaeng 2024. 1. 7. 23:03
728x90

 [NestJS] IoC(Inversion of Control) 제어의 역전과 DI(Dependcency) Injection)에 대해 알아보자

 

[NestJS] IoC(Inversion of Control) 제어의 역전과 DI(Dependcency) Injection)에 대해 알아보자

Nest.js의 레이어는 기본적으로 [ Controller - Service - Repository ] 레이어로 구성이 된다. Controller Class에서는 Service를 호출하고 Service Class에서는 Repository를 호출한다. 이렇듯 각 Class는 다른 Class에 대한

sora9z.tistory.com

 

이전 포스팅에서 IoC가 무엇인지 DI가 무엇인지에 대해 알아보았다. 이번 포스팅에서는 Nest.js에서 의존성 주입이 어떻게 이루어지고있는지 정리해보았다.

1. IoC Container or DI Container

이전 포스팅에서 아래와 같이 언급하였다. 

의존성 주입이란 이렇게 종속 관계에 있는 Class들이 직접 종속성을 생성하는 것이 아닌 외부에서 주입받는 것을 의미한다.
A Class에서 직접 B를 생성하는 것이 아닌 외부에서 B를 주입받는 것이다. 여기서 외부는 프레임워크 즉, Nest.js이다.

Nest.js의 Conrainer 라는 곳에서 종송석을 주입(Injection)하게 된다.

출처: https://sora9z.tistory.com/132 [Back to the Basics:티스토리]

종속성을 Class에서 수동으로 넣는 것이 아니라 Nest.js의 IoC container 에서 종속성을 주입을 해준다.IoC Container는 몇 개의 속성을 갖고있는 객체이다. 

단순하게 List of classes and their dependencies , List of instances that I have created 두 가지 정보 세트를 저장한다고 해보자

NestJS IoC Container

DI Container가 종속성을 등록하는 순서는 아래와 같다.

1. NestJS APP이 시작한다

2. APP이 시작할 때 controller를 제외한 모든 class를 찾고 클래스의 생성자를 확인하여 의존성을 파악한다.

예를 들면 MessageService를 찾으면 그 생성자에서 MessageRepository에 대한 의존성을 확인한다.

3. MessagService와 그 의존성을 "List of classes and their dependencies" 에 추가한다. 

4. 그 후 MessageRepository 생성자를 살펴본 후 의존성이 없음을 확인하고 이를 "List of classes and their dependencies" 에 추가한다.

5. 그런 다음 MessageRepository의 Instance를 생성하고 "List of instances that I have created"에 추가한다.

6. MessageRepository Instance가 생성되어 사용이 가능하므로 MessageService의 instance를 생성 후  "List of instances that I have created " 에 추가한다.

7. 마지막으로 controller의 종속성인 MessageService가 사용가능하기 때문에 Controller의 Instance를 생성한다.

2. DI Container Flow

위에서 나열한 것을 정리해보면 아래와 같다.

1. APP 시작시 모든 클래스를 Container에 등록한다.

2. 컨테이너는 각 클래스의 의존성을 파악한다.

3. 필요할 때마다 컨테이너에 instance를 생성해 달라고 요청한다.

4. 컨테이너는 (controller가 필요로 하는)모든 필요한 의존성을 생성하고 Instance를 제공한다.

5. 컨테이너는 생성된 인스턴스를 보유하고 필요한 경우 재사용한다

이런 방법으로 추가적인 종속성을 생성할 필요 없이 IoC를 계속 사용할 수 있고. 하나의 인스턴스만 생성되게된다.

3. Injectable decorator

컨테이너는 @Injectable 를 사용해서 각 클래스의 의존성을 파악한다.

이 데코레이터는 클래스를 DI 컨테이너에 등록하는 것을 표시한다. 하지만 controller에는 @Injectable 을 사용하지 않는다. 그 이유는 controller는 consumer이기 때문에 DI container에 등록하지 않는다.

여기까지 NestJs에서 Ioc container와 DI에 대해 알아보았다.

 

728x90
Comments