(NestJs) NestJs - Provider

최건·2025년 5월 7일

참고 문서

Provider란?

  • 서비스, 리포지토리, 팩토리, 헬퍼와 같은 많은 기본 Nest 클래스이다.
  • Provider는 종속성으로 주입될 수 있어 객체가 서로 다양한 관계를 형성할 수 있다.

Service 생성 CLI 명령어

nest g service [경로]/[모듈명] 
nest g service api/cats 

-> src/api/cats/cats.service.ts 생성

  • 만약 경로를 설정하지 않고 바로 모듈명을 입력하면 src아래 모듈아래 생성된다.
    -> src/cats/cats.service.ts 생성
  • 본인이 사용하고 있는 디렉토리 구조에 맞게 생성하면 된다.
nest g service api/cats  --no-sepc
  • --no-spec을 붙이면 테스트 코드가 같이 생기지 않는다.

@Injectable() 데코레이터

  • @Injectable()를 추가하면 NestJS가 해당 클래스를 "의존성 주입 컨테이너(DI)"에서 관리할 수 있도록 설정한다.
  • 의존성 주입이란? : 객체 간의 의존성을 직접 생성하는 대신, 외부에서 주입하여 관리하는 디자인 패턴
import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';

@Injectable()
export class CatsService {
  private readonly cats: Cat[] = [];

  create(cat: Cat) {
    this.cats.push(cat);
  }

  findAll(): Cat[] {
    return this.cats;
  }
}
  • 위와 같이 CatsService를 구성했을 때, 다른 컴포넌트(예: 컨트롤러)에서 주입(Injection)하여 사용할 수 있다.
@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {} // DI (의존성 주입)

Provider 등록

  • NestJS는 IoC (Inversion of Control) 원칙에 따라 클래스 간 의존성을 Nest가 자동으로 주입해주는 구조이다
  • 이를 위해선 Nest가 해당 provider(CatsService 같은)를 미리 알고 있어야 한다.
import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';
import { CatsService } from './cats/cats.service';

@Module({
  controllers: [CatsController],   // 요청을 처리하는 컨트롤러 등록
  providers: [CatsService],        // 주입받을 서비스(= Provider) 등록
})
export class AppModule {}

스코프란?

  • NestJS에서 스코프(Scope)는 Provider(서비스, 리포지토리, 가드 등)의 생명 주기를 결정하는 설정이다.
  • 기본적으로 NestJS의 Provider는 싱글톤(Singleton)으로 동작하며, 애플리케이션이 실행될 때 한 번만 생성한다.
  • 하지만 특정 경우(예: 요청마다 새로운 인스턴스 필요)에는 Request-Scoped(요청 단위 스코프)로 변경할 수 있다.

기본 Provider의 생명 주기 (Singleton)

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

@Injectable()
export class CatsService {
  private count = 0;

  increment() {
    this.count++;
    return this.count;
  }
}
  • 애플리케이션이 실행되는 동안 단 하나의 인스턴스만 유지한다.
  • 즉, 모든 요청에서 CatsService 내부는 count 값을 공유한다.

Request-Scoped (요청 단위 스코프)

  • 요청(Request)마다 새로운 인스턴스를 생성하고 싶다면, 스코프를 Scope.REQUEST로 설정하면 된다.
import { Injectable, Scope } from '@nestjs/common';

@Injectable({ scope: Scope.REQUEST }) // 요청 단위 스코프 설정
export class CatsService {
  private count = 0;

  increment() {
    this.count++;
    return this.count;
  }
}
  • 매번 요청이 들어올 때마다 새로운 CatsService 인스턴스가 생성된다.
  • count 값이 요청마다 초기화됨 → 요청 간 데이터 공유 X.
  • 특정 요청 단위에서만 유지해야 하는 상태(예: 트랜잭션, 요청 ID 추적 등)에 유용하다.
profile
개발이 즐거운 백엔드 개발자

0개의 댓글