Provider 작성

HanSH·2024년 1월 15일

NestJS

목록 보기
4/29

단순히 @Injectable() 데코레이터가 있으면 Provider라고 하나보다.

정확히는 services, repositories, factories, helpers, and so on. '서비스, 레포지토리, 팩토리, 헬퍼 등을 포함하는 모든 것' 이라고 볼 수 있겠다.

controller는 http 요청을 받고 보내는 역할만 하고, 복잡한 작업은 provider에 책임을 준다.
복잡한 작업이라 함은 데이터베이스를 조작한다거나 다른 서버에 또 데이터를 요청한다거나...
이렇게 작성하는 것이 더 좋다고 판단한 듯

스프링에서 하는 방법을 조금 봐놔서 크게 어렵진 않을 것 같다.


이전의 Controller까지 만든 것에서 Service를 만들었다.
nest g s Cats로 Service를 만들어보자.
그리고 아래의 공식 예제를 써보자.

// cats.service.ts
import { Injectable } from '@nestjs/common';
import { Cat } from './interface/cat.interface';

@Injectable()
export class CatsService {
    private readonly cats: Cat[] = [];

    create(cat: Cat) {
      this.cats.push(cat);
    }
  
    findAll(): Cat[] {
      return this.cats;
    }
}
// ./interfaces/cat.interface.ts
export interface Cat {
    name: string;
    age: number;
    breed: string;
}

여기서 추가된거라고는 @Injecteable() 데코레이터밖에 없다.
이 데코레이터를 사용한 클래스는 Nest IoC container에 의해 관리될 수 있다고 한다.

Interface는 단순히 '데이터가 어떻게 될 것이다'를 알려주는 용도로 추측된다.

이제 controller를 수정해보자.
공식 예제를 사용하였다.

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

과정을 요약하면
req → controller → service → database(서비스에 존재) → service return → controller return → res 이 된다.

profile
저는 말하는 싹 난 감자입니다

0개의 댓글