๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
NestJS

NestJS ํ”„๋กœ์ ํŠธ ์‹œ์ž‘๊ณผ ๊ตฌ์กฐ์˜ ์ดํ•ด

by LasBe 2024. 10. 28.
๋ฐ˜์‘ํ˜•

๐Ÿ“’ NestJS ํ”„๋กœ์ ํŠธ ์‹œ์ž‘๊ณผ ๊ตฌ์กฐ์˜ ์ดํ•ด

์ง€๊ธˆ์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์ด์ง€๋งŒ ํ•ญ์ƒ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ๋„ ํ•จ๊ป˜ ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ์ง€๋‹ˆ๊ณ  ์‚ด์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜์ค‘์— ์ข‹์€ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์œผ๋ฉด ํ˜ผ์ž์„œ ์˜ค๋กฏ์ด ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ์˜ค๋ž˜ ์‚ด์•„๋‚จ์„ ์ˆ˜ ์žˆ๊ฒ ๋‹ค๊ณ  ๋Š๊ผˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

์•„๋ฌด๋ž˜๋„ ์ž๋ฐ”์™€ ์Šคํ”„๋ง์ด ์—ฌ๋Ÿฌ๋ชจ๋กœ ์œ ๋ฆฌํ•œ ๋ฉด์ด ๋งŽ์ง€๋งŒ, ๊ฑฐ์˜ ์—…๊ณ„ ํ‘œ์ค€์ด ๋œ ๋ฆฌ์•กํŠธ์™€ ํ•จ๊ป˜ JS, TS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” NestJS ๋ผ๋ฉด ์‹œ๋„ˆ์ง€ ํšจ๊ณผ๋กœ ์ธํ•ด ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์ •๋ง ๋น ๋ฅด๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ์„ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ NestJS๊ฐ€ ์Šคํ”„๋ง์˜ ๊ตฌ์กฐ์™€ ๊ฑฐ์˜ ์œ ์‚ฌํ•œ๋ฐ, ์ด๋Š” ์ „์— ์Šคํ”„๋ง ํ•™์Šต์„ ํ•ด ๋‘” ๋•์— ๋น ๋ฅธ ์ ์‘์„ ํ•  ์ˆ˜ ์žˆ์–ด์„œ NestJS๋ฅผ ๋ฐฐ์›Œ๋ด์•ผ๊ฒ ๋‹ค๋Š” ์ฃผ์š”ํ•œ ๊ณ„๊ธฐ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ์•ž์œผ๋กœ NestJS ํ•™์Šต์„ ์‹œ์ž‘ํ•˜๋ฉฐ ๊ทธ ์‹œ์ž‘์ธ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ๋ถ€ํ„ฐ ๊ธฐ๋กํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“Œ NestJS ์„ค์น˜

$ npm i -g @nestjs/cli
$ nest new project-name
$ nest --version

npm์„ ์ด์šฉํ•ด ๊ธ€๋กœ๋ฒŒ๋กœ @nestjs/cli ๋ชจ๋“ˆ์„ ์„ค์น˜ ํ•œ ๋’ค nest new ๋ช…๋ น์–ด๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „ ํ™•์ธ์„ ํ†ตํ•ด ์ œ๋Œ€๋กœ ์„ค์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ํ›„ ๋ณธ์ธ์ด ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ์„ ํƒํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ์€ ๋งˆ์น˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๐Ÿ“Œ ์ดˆ๊ธฐ ์ƒ์„ฑ ํ•ต์‹ฌ ํŒŒ์ผ

ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋‹ค์Œ 5๊ฐœ์˜ ํ•ต์‹ฌ ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๊ทธ ํŒŒ์ผ๋“ค์˜ ์—ญํ• ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

app.controller.spec.ts ์ปจํŠธ๋กค๋Ÿฌ์— ๋Œ€ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ.
app.controller.ts ๋‹จ์ผ ๊ฒฝ๋กœ๋ฅผ ๊ฐ–์ถ˜ ๊ธฐ๋ณธ ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค.
app.module.ts ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฃจํŠธ ๋ชจ๋“ˆ.
app.service.ts ๋‹จ์ผ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
main.ts NestFactoryNest ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”์–ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ž…๋ ฅ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค .

 

๊ทธ๋Ÿผ ์ฃผ์š” ํŒŒ์ผ์— ๋Œ€ํ•œ ์—ญํ• ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊นŒ์š”?

 

๐Ÿ”Ž main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(process.env.PORT ?? 3000);
}
bootstrap();

์•ฑ์— ์‹œ๋™์„ ๊ฑธ์–ด์ฃผ๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š” main ํŒŒ์ผ์€ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ด ํŒŒ์ผ์—์„œ๋Š” HTTP ๋ฆฌ์Šค๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ธ๋ฐ”์šด๋“œ HTTP ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฌ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ”Ž app.controller.ts

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller() // ์ปจํŠธ๋กค๋Ÿฌ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get() // HTTP GET ์š”์ฒญ์„ ์ฒ˜๋ฆฌ
  getHello(): string {
    return this.appService.getHello();
  }
}

app.controller.ts๋Š” NestJS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ณธ ์ปจํŠธ๋กค๋Ÿฌ ํŒŒ์ผ๋กœ, ์š”์ฒญ์„ ๋ฐ›์•„ ํŠน์ • ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ์ ์ ˆํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ๋Š” ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์„œ๋น„์Šค ๊ณ„์ธต์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์ด ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

 

๐Ÿ”Ž app.service.ts

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

@Injectable() // ์„œ๋น„์Šค ํด๋ž˜์Šค๋ฅผ ์ฃผ์ž… ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์ •์˜
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}

app.service.ts๋Š” NestJS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์„œ๋น„์Šค ๊ณ„์ธต์˜ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” ํŒŒ์ผ๋กœ, ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์š”์ฒญ์„ ๋ฐ›์•„ ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ์™ธ๋ถ€ API ํ˜ธ์ถœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์„œ๋น„์Šค๋กœ๋ถ€ํ„ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ”Ž app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

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

app.module.ts๋Š” NestJS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ตœ์ƒ์œ„ ๋ชจ๋“ˆ ํŒŒ์ผ๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ •์˜ํ•˜๊ณ  ์„ค์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

NestJS๋Š” ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ, app.module.ts๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ชจ๋“ˆ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ app.module.ts๋Š” ์ปจํŠธ๋กค๋Ÿฌ, ์„œ๋น„์Šค, ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋“ค์„ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

@module ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์•ˆ์— ์ปจํŠธ๋กค๋Ÿฌ, ์„œ๋น„์Šค ๊ฐ™์€ ๋ชจ๋“ˆ์„ ์ •์˜ํ•ด์ฃผ์–ด์•ผ NestJS๊ฐ€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Nest CLI๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด ๋ชจ๋“ˆ๋“ค์„ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ์ด ํŒŒ์ผ์— ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ์ด๋Ÿฌํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.

 

๐Ÿ“Œ Nest CLI Generator

Nest CLI์˜ Generator๋Š” NestJS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์‹œ ๊ตฌ์กฐ ์ƒ์„ฑ์„ ์ž๋™ํ™”ํ•˜๋Š” ๋„๊ตฌ๋กœ, ํŠน์ • ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“ˆ, ์ปจํŠธ๋กค๋Ÿฌ, ์„œ๋น„์Šค ๋“ฑ์„ ๋น ๋ฅด๊ฒŒ ์ƒ์„ฑํ•ด ์ค๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๋ณต์ ์ธ ํŒŒ์ผ ์ƒ์„ฑ๊ณผ ์ดˆ๊ธฐ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด users๋ž€ ์ด๋ฆ„์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ nest generate controller users
$ nest g co users

์œ„์™€ ๊ฐ™์ด ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ์™€ ๋ชจ๋“ˆ ๋“ฑ๋ก์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ๋กœ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์„ค๋ช…๋“œ๋ ธ๋Š”๋ฐ์š”.

๊ทธ ์™ธ์—๋„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด $ nest ๋ช…๋ น์–ด๋กœ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

ํ’€๋„ค์ž„ ๋ณด๋‹จ alias๋ฅผ ์ด์šฉํ•œ ์ถ•์•ฝ์–ด๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ํ›จ์”ฌ ํŽธํ•˜๋‹ˆ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

 

๐Ÿ“Œ NestJS์˜ ๊ตฌ์กฐ

NestJS๋Š” ๋ชจ๋“ˆํ™”์™€ ์˜์กด์„ฑ ์ฃผ์ž…(DI) ์›์น™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋œ ๊ตฌ์กฐ๋กœ, ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ฌ๋Ÿฌ ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ ๊ณ„์ธต์ด ํŠน์ • ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”Ž Modules

NestJS๋Š” ๋ชจ๋“ˆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋ฉฐ, ๊ฐ ๋ชจ๋“ˆ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋Šฅ์ ์ธ ๋‹จ์œ„๋กœ ์—ญํ• ์„ ๋‚˜๋ˆ„์–ด ๋ชจ๋“ˆํ™”๋œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  • ๋ชจ๋“ˆ ํŒŒ์ผ(*.module.ts)์€ @Module() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ์ •์˜๋˜๋ฉฐ, ํ•ด๋‹น ๋ชจ๋“ˆ์˜ ์ปจํŠธ๋กค๋Ÿฌ์™€ ์„œ๋น„์Šค๋“ค์„ ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“ˆ์€ ํŠน์ • ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋„๋ก ๋ถ„๋ฆฌ๋˜๋ฉฐ, ๋‹ค๋ฅธ ๋ชจ๋“ˆ๊ณผ์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • AppModule์€ ์ตœ์ƒ์œ„ ๋ชจ๋“ˆ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฃจํŠธ ๋ชจ๋“ˆ ์—ญํ• ์„ ํ•˜๋ฉฐ, ์—ฌ๊ธฐ์„œ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋“ค์„ imports๋กœ ๋ถˆ๋Ÿฌ์™€ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ”Ž Controller

์ปจํŠธ๋กค๋Ÿฌ๋Š” HTTP ์š”์ฒญ์„ ๋ฐ›์•„ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ ์ ˆํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ๋กœ ๋ผ์šฐํŒ… ๋ฐ ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

  • ์ปจํŠธ๋กค๋Ÿฌ ํŒŒ์ผ(*.controller.ts)์€ @Controller() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์ง€์ •๋œ ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์š”์ฒญ์˜ ์ข…๋ฅ˜(GET, POST ๋“ฑ)์— ๋งž๊ฒŒ ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์„œ๋น„์Šค ๊ณ„์ธต์„ ํ˜ธ์ถœํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ”Ž Providers / Service

NestJS์˜ ์˜์กด์„ฑ ์ฃผ์ž… ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์ธ์Šคํ„ด์Šคํ™”๋˜์–ด ์ œ๊ณต๋˜๋Š” ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ ํ”„๋กœ๋ฐ”์ด๋”์ž…๋‹ˆ๋‹ค.

์„œ๋น„์Šค, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ, ํŒฉํ† ๋ฆฌ ๋“ฑ ๋‹ค์–‘ํ•œ ์—ญํ• ์„ ํ”„๋กœ๋ฐ”์ด๋”๊ฐ€ ๋‹ด๋‹นํ•˜๋ฉฐ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ํ”„๋กœ๋ฐ”์ด๋” ํŒŒ์ผ(*.service.ts ๋“ฑ)์€ @Injectable() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ์ •์˜๋˜์–ด ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์ฃผ์ž…๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, UsersService๋Š” ์‚ฌ์šฉ์ž ๊ด€๋ จ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค๋กœ UsersController์— ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค.

 

๐Ÿ”Ž Middleware, Guards, Interceptors, Pipes

NestJS์—๋Š” ์ถ”๊ฐ€์ ์ธ ์ฒ˜๋ฆฌ ๊ณ„์ธต์„ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Middleware
    ์š”์ฒญ์„ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ›๊ธฐ ์ „์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณ„์ธต์ž…๋‹ˆ๋‹ค.
    ๋กœ๊น…, ์ธ์ฆ ๋“ฑ์˜ ์‚ฌ์ „ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Guards
    ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋˜๊ธฐ ์ „, ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œ์–ดํ•˜๋Š” ๋กœ์ง์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
    @UseGuards() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ํŠน์ • ์š”์ฒญ์— ๋Œ€ํ•ด Guard๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Interceptors
    ์š”์ฒญ/์‘๋‹ต์„ ๊ฐ€๋กœ์ฑ„์–ด ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด, ์‘๋‹ต ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™˜, ์บ์‹ฑ ๋กœ์ง ๋“ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • Pipes
    ์š”์ฒญ ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™˜ ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    DTO์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด ์š”์ฒญ ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹๊ณผ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ“Œ NestJS ๋‹ค๋ฅธ ๊ธ€

Docker๋กœ PostgreSQL ์„ค์น˜ํ•˜๊ณ  NestJS + prisma ์—ฐ๋™ํ•˜๊ธฐ

 

Docker๋กœ PostgreSQL ์„ค์น˜ํ•˜๊ณ  NestJS + prisma ์—ฐ๋™ํ•˜๊ธฐ

๐Ÿ“’  Docker๋กœ PostgreSQL ์„ค์น˜ํ•˜๊ณ  NestJS + prisma ์—ฐ๋™ํ•˜๊ธฐNestJS๋กœ ๊ฐœ๋ฐœํ•  ๋•Œ ์ฃผ๋กœ prisma์™€ postgresql์„ ์‚ฌ์šฉํ•˜๋Š” ์ถ”์„ธ์ž…๋‹ˆ๋‹ค.์™œ ์–ด๋– ํ•œ ํŠน์žฅ์ ์ด ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ดˆ๊ธฐ ์„ค์น˜ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ

lasbe.tistory.com

 

NestJS์™€ prisma๋กœ ํŽธ๋ฆฌํ•˜๊ฒŒ CRUD ๊ตฌํ˜„ํ•˜๊ธฐ

 

NestJS์™€ prisma๋กœ ํŽธ๋ฆฌํ•˜๊ฒŒ CRUD ๊ตฌํ˜„ํ•˜๊ธฐ

๐Ÿ“’ NestJS๋กœ ํŽธ๋ฆฌํ•˜๊ฒŒ CRUD ๊ตฌํ˜„ํ•˜๊ธฐ์š”์ฆ˜ NestJS๋ฅผ ์กฐ๊ธˆ์”ฉ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ง„๋„๋ฅผ ๋‚˜๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.๊ทธ๋Ÿฐ๋ฐ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜๋ก "์ •๋ง ํŽธ๋ฆฌํ•˜๋‹ค"๊ณ  ๋Š๋ผ๋Š” ์ค‘์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ NestJS์™€ prisma๋กœ CRUD api๋ฅผ ๊ตฌ

lasbe.tistory.com

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€


์˜คํ”ˆ ์ฑ„ํŒ