Nestjs

Providers

KimJye 2019. 11. 5. 10:44

provider는 단순히 @Injectable()데코레이터로 주석이 달린 클래스.

controller는 HTTP 요청을 처리하고 더 복잡한 작업을 provider에게 위임해야한다.

SOLID원칙을 따르는 것이 좋다 .


Service

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

Interface Cat

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

controller 수정

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 readonly catsService: CatsService) {}

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

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

속성 기반 주입

최상위 클래스가 하나 이상의 provider에 의존하는 경우, super()생성자에서 하위 클래스를 호출하여 모든 클래스를 전달하는 것은 지양해야함. 따라서 @Inject()속성 수준에서 데코레이터를 사용.

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

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

클래스가 다른 provider를 확장하지 않는 경우, 항상 생성자 기반 주입을 사용.