[NestJS] Providers

hahaha·2021년 10월 10일
0

NestJS

목록 보기
3/11
post-thumbnail
$ nest g service [name]

Providers

  • service, repository, factory, helper 등
  • 종속성으로 주입 가능
  • 컨트롤러는 HTTP 요청을 처리하고 더 복잡한 작업은 Providers에게 위임
  • module에서 providers로 선언된 JS 클래스

생성

// interface/cat.interface.ts
export interface Cat {
  name: string;
  age: number;
  breed: string;
}

// cats.service.ts
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;
  }
}

사용

  • 클래스 생성자(constructor)를 통해 주입
// cats.controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common';
import { CreateCatDto } from './dto/create-cat.dto';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';

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

  @Post()
  async create(@Body() createCatDto: CreateCatDto) {
    this.catsService.create(createCatDto);
  }
}

종속성 주입

  • Nest는 일반적으로 종속성 주입 디자인 패턴을 기반으로 구축
  • TS 기능 덕에 종속성이 유형별로 쉽게 관리됨
constructor(private catsService: CatsService) {}

스코프

  • 일반적으로 애플리케이션 수명주기와 동기화된 수명(범위)를 가짐
  • 애플리케이션이 종료되면 각 프로바이더는 삭제
  • 프로바이더 수명을 요청 범위로 만드는 방법도 존재

- 범위 유형

1. DEFAULT

  • 프로바이더 인스턴스의 수명 = 애플리케이션 수명주기
  • 싱글톤 범위
  • 프로바이터가 요청 범위여야 하는 경우가 아니면, 기본 싱글톤 범위 사용 권장

2. REQUEST

  • 들어오는 각 요청에 대해 독점적으로 프로바이터의 인스턴스 생성
  • 요청 처리 후, 인스턴스는 가비지 수집

3. TRANSIENT

  • 일시적인 임시 프로바이더
  • 각 소비자는 새로운 전용 인스턴스를 갖게 됨

- 주입 범위 지정

  • @Injectable() 데코레이터의 scope 속성 사용
  • 요청 범위 프로바이더 사용 시, 원래 요청 객체에 대한 참조에 접근 가능(REQUEST 개체 삽입, GraphQL의 경우 CONTEXT 삽입)
import { Injectable, Scope } from '@nestjs/common';

@Injectable({ scope: Scope.REQUEST })
export class CatsService {
	constructor(@Inject(REQUEST) private request: Request) {}
}

컨트롤러 스코프

  • 모든 요청 메서드 핸들러에 적용되는 스코프 설정 가능
  • ControllerOptions 객체의 scope 속성 사용
@Controller({
  path: 'cats',
  scope: Scope.REQUEST,
})
export class CatsController {}

Custom providers

https://docs.nestjs.kr/fundamentals/custom-providers

Optional providers

  • 구성 프로바이더가 없어도 되는 경우(프로바이더가 선택 사항인 경우)
  • 생성자 서명에 @Optional() 데코레이터 사용
import { Injectable, Optional, Inject } from '@nestjs/common';

@Injectable()
export class HttpService<T> {
  constructor(@Optional() @Inject('HTTP_OPTIONS') private httpClient: T) {}
}

속성 기반 주입

  • <-> 생성자 기반 주입
  • 속성 수준에서 @Inject() 데코레이터 사용
import { Injectable, Inject } from '@nestjs/common';

@Injectable()
export class HttpService<T> {
  @Inject('HTTP_OPTIONS')
  private readonly httpClient: T;
}

적용

  • @Module() 데코레이터 내에 providers 배열에 해당 서비스 포함
// app.module.ts
import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class AppModule {}
profile
junior backend-developer 👶💻

0개의 댓글