๐Ÿค  NestJS ๊ฐœ๋… ํ›‘๊ธฐ ๐Ÿค 

9rganizedChaosยท2021๋…„ 10์›” 25์ผ
0
post-thumbnail

๊ธฐ๋ณธ์ ์œผ๋กœ NestJS๋Š” NodeJS ์œ„์—์„œ ์›€์ง์ด๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. Express๋ฅผ ์ด์šฉํ•˜๋ฏ€๋กœ, Express ์œ„์—์„œ ์›€์ง์ด๋Š” ๊ฒƒ์ด๋ผ๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. NestJS๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋“ค์˜ ๋ฐฑ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์˜ ํŠน์ง•์„ ๊ทธ๋Œ€๋กœ NodeJS๋กœ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. NestJS๋Š” ๋ช…ํ™•ํ•œ ๊ตฌ์กฐ๊ฐ€ ์žˆ๋‹ค. ์ด ๋ฃฐ์„ ๋”ฐ๋ผ ๋ฐฑ์—”๋“œ๋ฅผ ๊ตฌ์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

Installation

NestJS๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๊ณ , ๋ฏธ๋ฆฌ ์„ธํŒ…๋œ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด ๋ณต์žกํ•œ ์ž‘์—…์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  cli ์„ค์น˜๋งŒ์œผ๋กœ๋„ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

$ npm i -g @nestjs/cli
$ nest new [ํ”„๋กœ์ ํŠธ ์ด๋ฆ„]

์„ค์น˜ ํ›„ ์ฝ”๋“œ์—๋””ํ„ฐ์—์„œ ํด๋”๋ฅผ ์—ด๊ณ  npm run start:dev๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์„ฑ๊ณต์ ์œผ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋˜์—ˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ๋ง์ธ ์ฆ‰, localhost:3000์—์„œ ์•ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง!

Overview

NestJS๋Š” main.ts ํŒŒ์ผ์„ ๊ฐ–๊ณ  ์žˆ๊ณ , ์ด๊ฑธ ๋ฐ”๊พธ๋ฉด ์•ˆ ๋œ๋‹ค!

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

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000); // app์ด 3000๋ฒˆ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค!
}
bootstrap();

๊ทธ๋ ‡๋‹ค๋ฉด Hello World๋Š” ์–ด๋””์„œ ์ถœ๋ ฅ๋˜๋Š” ๊ฑธ๊นŒํ•˜๊ณ , create ๋‚ด๋ถ€์˜ AppModule์„ ํด๋ฆญํ•ด๋ณด๋ฉด!

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

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {} 
// ๋น„์–ด์žˆ๋Š” ํด๋ž˜์Šค๋กœ ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ ๋‚ด์šฉ์€
// ์œ„ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์— ์žˆ๋Š” ๊ฒƒ!

์œ„ ๋ชจ๋“ˆ ๊ด„ํ˜ธ ์•ˆ์ชฝ์œผ๋กœ ๋‘˜๋Ÿฌ์Œ“์ธ ํ•จ์ˆ˜๋ฅผ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ผ๊ณ  ํ•œ๋‹ค. NestJS๋ฅผ ์“ฐ๋ ค๋ฉด ์ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์— ์ต์ˆ™ํ•ด์ ธ์•ผ ํ•œ๋‹ค. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํด๋ž˜์Šค์— ํ•จ์ˆ˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์•ˆ์˜ ์ฝ˜ํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ดํŽด๋ณด์ž

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

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

์—ฌ๊ธฐ์—๋Š” Controller๋ผ๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์žˆ๊ณ , ๊ทธ ์•ˆ์— ๋‹ค์‹œ Get์ด๋ผ๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋‚ด๋ถ€์˜ AppService๋ฅผ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํŒŒ์ผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

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

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}

Hello World๋Š” ์—ฌ๊ธฐ์„œ ์ถœ๋ ฅํ•ด์ค€ ๊ฒƒ์ด๋‹ค!

Controller

main.ts์—์„œ ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š” AppModule์€ ์ผ์ข…์˜ ๋ฃจํŠธ ๋ชจ๋“ˆ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

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

์•ฑ ๋ชจ๋“ˆ์—์„œ ์•Œ์•„์•ผ ํ•  ๊ฒƒ์€ ๋‘ ๊ฐ€์ง€์ด๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ์™€ ํ”„๋กœ๋ฐ”์ด๋”.
์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ•˜๋Š” ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ url์„ ๊ฐ€์ ธ์˜ค๊ณ  ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ปจํŠธ๋กค๋Ÿฌ๋Š” express์˜ ๋ผ์šฐํ„ฐ ๊ฐ™์€ ์กด์žฌ์ด๋‹ค. (url์„ ๊ฐ€์ ธ์˜ค๊ณ  ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ)

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

AppController์—์„œ @Get ์ด ๋ถ€๋ถ„์ด express์˜ get๋ผ์šฐํ„ฐ์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์‹ค์ œ๋กœ app.controller.ts ํŒŒ์ผ ํ•˜๋‹จ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด!

  @Get('/hello')
  sayHello(): string {
    return 'Hello everyone';
  }

localhost:3000/hello๋กœ ์ ‘์†ํ•ด sayHello ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ ๋กœ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ ํ•จ์ˆ˜ ์‚ฌ์ด์— ๋นˆ์นธ์„ ๋‘์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค!

์ง€๊ธˆ๊นŒ์ง€ ์‚ดํŽด๋ณธ ๋ฐ”์™€ ๊ฐ™์ด NestJS์—์„œ๋Š” ํŠน๋ณ„ํžˆ ๋ผ์šฐํŒ…์„ ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋งŒ ์ž‘์„ฑํ•ด์ฃผ๋ฉด get ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ œ ๊ถ๊ธˆํ•  ๋งŒํ•œ ์ ์€ ์ปจํŠธ๋กค๋Ÿฌ ํŒŒ์ผ์—์„œ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” Service์— ๋Œ€ํ•œ ๋ถ€๋ถ„์ด๋‹ค!

Service

์ด๋ฏธ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ ํ•จ์ˆ˜๋งŒ์œผ๋กœ ์š”์ฒญ์„ ๋ฐ›๊ณ , ์‘๋‹ต์„ ์ค„ ์ˆ˜ ์žˆ๋Š”๋ฐ, Service๋ผ๋Š” ๊ฒƒ์ด ์™œ ํ•„์š”ํ• ๊นŒ?
NestJS๋Š” ์ฝ˜ํŠธ๋กค๋Ÿฌ๋ฅผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๊ตฌ๋ถ„์ง“๊ณ  ์‹ถ์–ดํ•œ๋‹ค.
์ปจํŠธ๋กค๋Ÿฌ๋Š” ๊ทธ๋ƒฅ url์„ ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• ์ผ ๋ฟ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
๋‚˜๋จธ์ง€ ํ•จ์ˆ˜์˜ ๊ตฌ์ฒด์ ์ธ ์‹คํ–‰์— ๋Œ€ํ•œ ๊ฒƒ์€ ์„œ๋น„์Šค๋กœ ๋„˜๊ฒจ์ฃผ๊ณ  ์‹ถ์€ ๊ฒƒ!
์„œ๋น„์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‹ค์ œ function์„ ๊ฐ–๋Š” ๋ถ€๋ถ„์ด๋‹ค!

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }

  @Get('/hello')
  sayHello(): string {
    return this.appService.getHi();
  }
}

์œ„์™€ ๊ฐ™์ด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๊ณ  ์‹ค์ œ function์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์„œ๋น„์Šค์— ์ž‘์„ฑํ•ด์ค€๋‹ค!

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

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello Nest!';
  }
  getHi(): string {
    return 'Hi Nest';
  }
}
profile
๋ถ€์ •ํ™•ํ•œ ์ •๋ณด๋‚˜ ์ž˜๋ชป๋œ ์ •๋ณด๋Š” ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๋น ๋ฅด๊ฒŒ ์ˆ˜์ •ํ† ๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€