오늘 뭐했냐/개발에 대한 주저리

23.09.30 NestJS에서 의존성 주입

스스로에게 2023. 10. 3. 08:55

 NestJS는 기존에 사용해왔던 Express와 다르게 어떻게 의존성 주입을 할까?

 

전체적인 과정

 

1. 서비스 생성하기

import { Injectable } from '@nestjs/common';

@Injectable()
export class CatsService {
  findAll(): string[] {
    return ['cat1', 'cat2'];
  }
}

 

2. Module에 Provider 추가하기

import { Module } from '@nestjs/common';
import { CatsService } from './cats.service';

@Module({
  providers: [CatsService],
})
export class CatsModule {}

 

3. Service를 Controller에 주입하기

import { Controller, Get } from '@nestjs/common';
import { CatsService } from './cats.service';

@Controller('cats')
export class CatsController {
  constructor(private catsService: CatsService) {}

  @Get()
  findAll(): string[] {
    return this.catsService.findAll();
  }
}

// 위에 코드와 같다.
export class CatsController {
  private catsService: CatsService;

  constructor(catsService: CatsService) {
    this.catsService = catsService;
  }
}

이 방식으로, CatsController는 생성될 때 CatsService의 인스턴스를 생성자를 통해 주입받게 된다.

 

주요 구성 요소

프로바이더 (Providers)

  • 서비스, 리포지토리, 설정, 데이터베이스 연결 등과 같은 애플리케이션에서 사용되는 값을, 클래스 또는 함수의 형태로 제공하는 것을 의미한다.
  • 클래스 프로바이더는 @Injectable() 데코레이터와 함께 사용되며, 다른 클래스의 생성자에 주입될 수 있다.
  • 사용자 정의 토큰을 사용해 값이나 팩토리 기반의 의존성도 주입 가능하다.

 

import { Injectable } from '@nestjs/common';

@Injectable()
export class CatsService {
  findAll(): string[] {
    return ['cat1', 'cat2'];
  }
}

 

 

모듈 (Modules)

  • @Module() 데코레이터를 사용하여 모듈을 정의하고, 해당 모듈 내에서 사용할 프로바이더를 providers 배열에 등록한다.

 

import { Module } from '@nestjs/common';
import { CatsService } from './cats.service';

@Module({
  providers: [CatsService], // <- 여기 
})
export class CatsModule {}

 

데코레이터 (Decorators)

  • @Injectable(): 클래스를 주입 가능하게 만드는 데코레이터이다.
  • @Inject(): 특정 의존성을 주입하도록 지시하는 데코레이터로, 주로 사용자 정의 토큰이나 특정 의존성에 사용된다.

 

컨테이너 (Container):

  • 내부적으로 의존성 주입 컨테이너를 사용하여 프로바이더와 모듈 간의 의존성을 관리한다
  • 프로바이더 클래스를 인스턴스화하고, 필요한 의존성을 주입하며, 애플리케이션의 부분을 모듈화하고, 의존성을 해결하는데 사용 된다.

 

정리하면 NestJS에서 의존성 주입은 데코레이터로 프로바이더를 만들고 이것을 모듈에서 설정하여 사용하며, 컨테이너가 관리한다.