Nest.js

[Nest.js] Providers란?

Hoo_Dev 2023. 1. 25. 13:35

Providers란?

프로바이더는 Nest의 기본 개념이다. 대부분의 기본 Nest 클래스는 서비스, 리포지토리, 팩토리, 헬퍼 등 프로바이더로 취급될 수 있다. 프로바이더의 주요 아이디어는 종속성으로 주입할 수 있다는 것. 즉, 객체는 서로 다양한 관계를 만들 수 있으며 객체의 인스턴스를 연결하는 기능은 대부분 Nest 런타임 시스템에 위임 될 수 있다. provider는 단순히 @Injectable() 데코레이터가 달린 클래스이다.

@Injectable 데코레이터를 사용하여 Nest IoC 컨테이너에서 관리할 수 있는 클래스임을 선언하는 메타데이터를 첨부할 수 있다.

 

서비스

서비스는 컨트롤러에서 사용됩니다. 데이터 저장과 출력을 담당하고, 이후 예시인 CatsController에서 사용 될 것이다

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

cats.servive.ts에는 하나의 프로퍼티와 두 개의 메소드를 갖는 CatsService 클래스를 가지고 있다.

그 위에 @injectable() 데코레이터를 추가함으로써 모든 Nest 컴포넌트에 주입할 수 있는 프로바이더가 되는 것 이다. 즉 위에 말한 것과 같이 Nest IoC 컨테이너에 의해 관리될 수 있는 클래스임을 선언하고, Cat과 같은 인터페이스에서 이를 사용할 수 있다.

// interfaces/cat.interface.ts

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

프로바이더 등록

위에서 생성한 서비스 프로바이더를 컨트롤러에서 사용하기 위해선, 모듈에 등록을 해주어야 한다.

@Module({
	...
	providers: [CatService]
}

export class CatsModule {}

컨트롤러에서의 사용

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

  @Get()
  async findAll(): Promise<Cat[]> {
    return this.catsService.findAll();
  }
}

생성자에 CatService 클래스를 삽입하고 CatService를 선언과 동시에 실행 할 수 있다.