[NestJS] 3장 프로바이더

1. 프로바이더(Provider)

NestJS에 프로바이더는 애플리케이션의 의존성 주입 시스템의 핵심 구성요소로, 프로바이더는 서비스, 레포지토리, 팩토리 등과 같은 객체를 생성하고 관리하는 데 사용합니다. 일반적으로 비즈니스 로직을 포함하고, 다른 클래스에서 사용할 수 있도록 주입됩니다.

# 서비스 생성
nest generate service cats

 

생성된 서비스 코드는 다음과 같습니다.

import { Injectable } from "@nestjs/common";

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

  create(cat) {
    this.cats.push(cat);
  }

  findAll() {
    return this.cats;
  }

  findOne(id: number) {
    return this.cats[id];
  }
}
  • @Injectable(): 데코레이터는 이 클래스가 다른 클래스에 주입될 수 있음을 나타냄

2. 프로바이더 사용

프로바이더는 모듈에서 등록되어야 하며, 이를 통해서 다른 클래스에서 사용할 수 있습니다. prviders 배열에 CatsService를 추가하여 이 서비스를 모듈의 프로바이더로 등록합니다.

/* eslint-disable prettier/prettier */
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatsController } from './cats/cats.controller';
import { CatsService } from './cats/cats.service';

@Module({
  imports: [],
  controllers: [AppController, CatsController],
  providers: [AppService, CatsService],
})
export class AppModule {}

3. 의존성 주입 

컨트롤러나 다른 프로바이더에서 생성한 프로바이더를 주입할 수 있습니다.

import { Controller, Get, Body, Post, Param } from "@nestjs/common";
import { CatsService } from "./cats.service";

@Controller("cats")
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @Post()
  create(@Body() cat) {
    this.catsService.create(cat);
  }

  @Get()
  findAll() {
    return this.catsService.findAll();
  }

  @Get(":id") // 경로 매개변수 사용
  findOne(@Param("id") id: number) {
    return this.catsService.findOne(id);
  }
}

4. 모듈 설정

서비스 컨트롤러를 포함하는 모듈을 설정합니다.

// cats/cats.module.ts
import { Module } from "@nestjs/common";
import { CatsService } from "./cats.service";
import { CatsController } from "./cats.controller";

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {}

 

애플리케이션을 실행하고 Postman이나 curl을 사용해 API를 테스트할 수 있습니다.

  • 고양이 생성:
    • POST: /cats 
    • Body: { "name": "Tommy" }
  • 고양이 조회:
    • GET: /cats/id 
  • 고양이 삭제
    • cats 서비스에 고양이 삭제 메서드 추가
    • DELETE 요청: http://localhost:3000/cats/0 (0번 인덱스의 고양이를 삭제)
import { Injectable } from "@nestjs/common";

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

  create(cat) {
    this.cats.push(cat);
  }

  findAll() {
    return this.cats;
  }

  findOne(id: number) {
    return this.cats[id];
  }

  delete(id: number): boolean {
    if (id < 0 || id >= this.cats.length) {
      return false; // 유효하지 않은 인덱스의 경우
    }
    this.cats.splice(id, 1); // 해당 인덱스의 고양이 삭제
    return true; // 삭제 성공
  }
}
  • 컨트롤러에 삭제 메서드 추가
import { Controller, Get, Body, Post, Param, Delete } from "@nestjs/common";
import { CatsService } from "./cats.service";

@Controller("cats")
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @Post()
  create(@Body() cat) {
    this.catsService.create(cat);
    return { message: "Cat created" };
  }

  @Get()
  findAll() {
    return this.catsService.findAll();
  }

  // 고양이 등록 조회
  @Get(":id") // 경로 매개변수 사용
  findOne(@Param("id") id: number) {
    return this.catsService.findOne(id);
  }

  // 고양이 삭제
  @Delete(":id")
  delete(@Param("id") id: number) {
    const result = this.catsService.delete(id);
    if (result) {
      return { message: "Cat deleted successfully" };
    } else {
      return { message: "Cat not found" };
    }
  }
}

 

 

GitHub - Koras02/nestjs-tutorial-blog

Contribute to Koras02/nestjs-tutorial-blog development by creating an account on GitHub.

github.com

 

LIST

'Back-End > NestJS' 카테고리의 다른 글

[NestJS] 2장 컨트롤러  (0) 2025.03.07
[NestJS] 1장 NestJs의 탄생 Nestjs는 무엇인가?  (0) 2025.02.11