NestJs 스터디(2)

연꽃·2022년 2월 16일
1

NestJs

목록 보기
2/7
post-thumbnail

프로바이더(Provider)

🏀 프로바이더란?

  • NestJs의 핵심 개념으로서 제공하고자 하는 핵심 기능, 즉 비즈니스 로직을 수행하는 역할을 하는 것이 프로바이더이다.
  • 컨트롤러가 이 역할을 수행할 수도 있겠지만 소프트웨어 구조상 분리해 두는 것이 단일 책임 원칙(SRP, Single Responsibility Principle)에 부합한다.
  • 서비스, 리포지토리, 헬퍼 등과 같은 Nest 클래스는 프로바이더로서 대표적이다.
  • 프로바이더의 주요한 아이디어는 바로 의존성 주입이 가능하다는 것이고, 이것을 통해서 객체간에 다양한 관계를 쉽게 맺을 수 있고, 객체 인스턴스를 연결짓는 일을 Nest 런타임 시스템에 위임할 수 있다.

🏀 서비스(Service)

  • 서비스는 보통 컨트롤러에 주입되어, 비즈니스 로직을 수행하는 역할을 한다.

아래 예제를 살펴보자

// /src/cats/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;
  }
}
  • 위 클래스에 지정한 @Injectable() 데코레이터는 이것을 Nest의 IoC(제어 역전) 컨테이너가 관리하게 한다.

그리고 아래 예제와 같이 컨트롤러에서 사용한다.

// /src/cats/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();
  }
}
  • CatsService가 클래스 생성자에서 매개변수로 주입되었다.
  • TypeScript에서 private으로 선언한 매개변수는 클래스 인스턴스의 멤버가 된다.(??)

🏀 의존성 주입(Dependency Injection)

  • OOP에서 많이 활용하고 있는 기법이다.
  • 의존성 주입을 이용하면 객체를 생성하고 사용할 때 관심사를 분리하여, 코드 가독성과 재사용성이 높은 SW를 만들게 도와준다.
  • 생성자 기반 주입과 프로퍼티 기반 주입을 사용할 수 있다.
  • 그런데 클래스가 다른 프로바이더를 확장하지 않는 경우, 생성자 기반 주입 방법을 사용하세요.라는 주의 문구가 공식문서에 있으니, 일단 생성자 기반 주입을 사용한다고 생각하자.

🏀 선택적 프로바이더 의존

  • 때로는 의존성이 반드시 필요한 것은 아닌 경우, 설정 프로바이더가 누락되면 기본값을 사용하는 것입니다.
  • 그렇게 하려면 생성자의 시그니처에 @Optional() 데코레이터를 사용해서 프로바이더가 선택적인 옵션이게 할 수 있다.
  • 하지만 나는 언제 쓰이는지 정확히 잘 모르겠다.

🏀 모듈에 프로바이더 등록

  • 위에서 정의한 의존성인 프로바이더 CatsService가 소비자인 CatsController에 주입되려면 모듈에 등록해야한다.
  • 컨트롤러를 등록하는 것처럼 프로바이더도 모듈 파일에서 다음과 같이 등록합니다.

아래 예제를 살펴보자

import { Controller, Get, Req } from '@nestjs/common';
import { Request } from 'express';

@Controller('cats')
export class CatsController {
  @Get()
  findAll(@Req() request: Request): string {
    return 'This action returns all cats';
  }
}

참고: 네스트 공식문서

profile
우물에서 자라나는 중

0개의 댓글