NestJS Providers

paduck·2024년 6월 11일
0

NestJS

목록 보기
4/24

Services, Repositories, Factories, Helpers 등과 같은 클래스들이 포함

종속성으로 주입이 될 수 있다 라는 명제가 핵심

  • Object 가 다양한 관계를 맺을 수 있고, Nest 런타임에 이를 위임하는 것
  • Controllers 에서 복잡한 작업을 위임
  • 모듈 에 providers 에 명시되는 단순한 JavaScript 클래스

Nest를 사용하면 보다 OO 방식으로 종속성을 설계하고 구성할 수 있으므로 SOLID 원칙을 따르는 것이 좋습니다.

Services

export interface Cat {
  name: string;
  age: number;
  breed: string;
}

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;
  }
}

CLI를 사용하여 서비스를 생성하려면 $ nest g service cats명령을 실행하기만 하면 됩니다.

@Injectable() 데코레이터에 유의

  • Nest IoC container 에 의해 관리될 수 있음을 선언하는 메타데이터
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);
  }

  @Get()
  async findAll(): Promise<Cat[]> {
    return this.catsService.findAll();
  }
}
  • controller 클래스 생성자에 Injected 된 service
  • 클래스의 생성자에서 선언과 초기화를 동시해해 가독성 증가
import { Controller, Get } from '@nestjs/common';
import { CatsService } from './cats.service';

@Controller('cats')
export class CatsController {
  private readonly catsService: CatsService;

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

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

Dependency Injection

DI 패턴을 기반으로 설계된 프레임워크

TS 형태로 종속성 관리의 이점

  • 타입을 통해 의존성 대상임을 확인하고, 명확한 대상을 주입할 수 있음
constructor(private catsService: CatsService) {}

Scopes

Application 생명주기와 동기화된 수명 주기를 가짐

  • bootstrap 되면 모든 의존성이 해결되어야 함(provier의 인스턴스화)
  • 종료 시에도 동일하게 적용

    request-scoped 도 가능하다.

Custom providers

여기

Optional providers

간혹 반드시 주입이 일어나지 않아도 되는 의존성이 있을 수 있음
@optional() 데코레이터를 통해 명시

Property-based injection

하나 이상의 종속성 주입이 필요한 경우, 클래스 속성에 직접 의존성 주입

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

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

클래스가 다른 클래스를 확장하지 않는 경우 항상 생성자 기반 주입을 사용하는 것이 좋습니다 . 생성자는 어떤 종속성이 필요한지 명시적으로 설명하고 @Injct() 주석이 달린 클래스 속성보다 더 나은 가시성을 제공합니다.

Provider registration

provider 등록

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

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class AppModule {}

Manual instantiation

  1. 기존 인스턴스를 가져오거나 동적으로 provider 인스턴스화
  2. bootstrap() 과정에서 provider 필요할 때
profile
학습 velog

0개의 댓글