NestJS 기초 (5) 프로바이더

2022. 10. 4. 17:16·개발/NestJS

프로바이더(Provider)는 Nest의 핵심 개념 중 하나입니다. 컨트롤러가 요청과 응답을 처리하는 역할을 한다면, 프로바이더는 로직을 따라 업무를 수행하는 역할을 합니다.

 

프로바이더는 모듈 내에 providers로 선언된 자바스크립트 클래스입니다. 서비스, 리포지토리, 팩토리, 헬퍼 등과 같은 Nest 클래스 대부분이 프로바이더로 간주됩니다.

 

프로바이더의 핵심 개념은 디펜던시로 삽입(injected)될 수 있다는 것입니다. 이는 객체가 다른 객체와 다양한 관계를 맺을 수 있으며, 객체 인스턴스의 연결 함수가 Nest 런타임 시스템에 할당될 수 있다는 의미입니다.

이전 글에서 CatsController를 생성했습니다. 이를 통해 컨트롤러가 HTTP 요청을 처리하고 보다 복잡한 일을 프로바이더에게 할당하는 방법에 대해 알아보도록 하겠습니다.

서비스

서비스는 컨트롤러에서 사용됩니다. 여기서는 간단한 CatsService를 생성하는 것으로 시작해보겠습니다. 이 서비스는 데이터 저장과 출력을 담당하며, 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;
  }
}

참고로 CLI를 통해 서비스를 만들려면 $ nest g service cats 커맨드를 사용할 수 있습니다.

 

위에서 생성한 CatsService는 하나의 프로퍼티와 두 개의 메소드를 갖는 클래스입니다.

 

새롭게 @Injectable() 데코레이터가 추가되었다는 점에 주목해보시기 바랍니다. 클래스 위에 @Injectable() 데코레이터를 달아줌으로써 이는 모든 Nest 컴포넌트에 주입할 수 있는 프로바이더가 됩니다. 즉, CatsService가 Nest IoC 컨테이너에 의해 관리될 수 있는 클래스임을 선언하는 것이며 이를 통해 Cat과 같은 인터페이스에서 이를 사용할 수 있습니다.

// interfaces/cat.interface.ts

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

이제 우리는 정보를 받아올 수 있는 서비스를 만들었습니다.

프로바이더 등록하기

위에서 생성한 서비스와 같은 프로바이더를 컨트롤러에서 사용하려면 이를 모듈에 등록해줘야 합니다.

@Module({
    ...
    providers: [CatService]
}
export class CatsModule {}

컨트롤러에서 사용하기

이제 이를 CatsContoller 내에서 사용해보도록 하겠습니다.

// 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는 클래스 constructor를 통해 삽입되었습니다. 여기서 private 구문을 사용했는데요. 이를 통해 catService를 선언하고 동시에 실행할 수 있습니다.

디펜던시 인젝션

디펜던시 인젝션(Dependency Injection)은 Nest의 핵심 디자인 패턴 증 하나입니다. 디펜던시 인젝션에 대한 개념은 앵귤러의 공식 문서를 참고해보시기 바랍니다.

 

Nest에서는 타입스크립트를 사용하여 무척 간편하게 디펜던시를 관리할 수 있습니다. Nest는 다음과 같이 CatsService의 인스턴스를 생성하고 반환하여 catsService를 사용할 수 있습니다. 디펜던시는 컨트롤러의 constructor를 통해 사용할 수 있습니다.

constructor(private catsService: CatsService) {}

참고 자료

  • https://docs.nestjs.com/providers

'개발 > NestJS' 카테고리의 다른 글

NestJS 기초 (6) 모듈  (0) 2022.10.04
NestJS 기초 (4) 데이터베이스 연동  (0) 2022.10.01
NestJS 기초 (3) 컨트롤러  (0) 2022.09.30
'개발/NestJS' 카테고리의 다른 글
  • NestJS 기초 (7) 환경 변수 관리하기
  • NestJS 기초 (6) 모듈
  • NestJS 기초 (4) 데이터베이스 연동
  • NestJS 기초 (3) 컨트롤러
휘Hwi
휘Hwi
여행, 사진, 개발, 책 이야기를 기록하는 여행자 휘의 블로그 𓂍
Klook.com
  • 휘Hwi
    휘: 끝나지 않은 이야기
    휘Hwi
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 기록
        • 일상 에세이
        • 인사이트
        • 투자와 재테크
        • 코인 이야기
        • 아카이빙
        • 집무실 레터
        • 사랑에 대하여
        • 번역 이야기(完)
        • 프리랜서 일지(完)
      • 여행
        • 🌎 세계 여행기 S1 (完)
        • 🌊 삼삼한 여행기 (完)
        • 🚶 온더로드
        • 🇯🇵 일본
        • 🏝️ 발리
        • 🇻🇳 베트남
        • 🇱🇰 스리랑카
        • 🇮🇳 인도
        • 🇹🇭 태국
        • 🇸🇬 싱가포르
        • 🇦🇺 호주
        • 🇭🇰 홍콩
        • 🇰🇷 한국
        • 🍚 여행자의 한 끼
        • ℹ️ 여행 정보
      • 사진
        • 사진가
        • 사진 이론과 생각
        • 사진 관련 정보
      • 영상
        • 파이널컷 모션 공부
        • 고프로 GoPro
        • 영상 관련 정보
      • 책
        • 책 읽고 쓰기
      • 개발
        • 티스토리
        • Internet
        • HTML
        • CSS
        • JavaScript
        • Typescript
        • React
        • Node.js
        • Express
        • NestJS
        • Python
        • Django
        • MySQL
        • MongoDB
        • AWS
        • Deployment
        • Terminal
        • Git
        • Glossaries
        • Articles
        • Projects
        • TIL;
      • 미분류
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
휘Hwi
NestJS 기초 (5) 프로바이더
상단으로

티스토리툴바