# 개요

Node.js의 Express를 사용하지만, 다양한 라이브러리와 호환성을 제공하여 외부 플러그인을 쉽게 사용할 수 있는, back-end 프레임워크이다.

ES7(혹은 타입 스크립트)에 새로 추가된  @ 데코레이터(Decorator)를 주로 이용하여, 구현된다.

Nestjs는 기본적으로 Controller라는 Decorator를 통해, Routing(라우팅)을 구현한다.

(ex) /dogs 경로로 들어오는 리퀘스트를 처리



# 장점

- TypeScript 사용하여, 구현 + 바닐라 JavaScript와의 호환성 유지

- 객체지향 프로그램  [ OPP (Object Oriented Programming) ] 

- 기능적 프로그램 [ FP (Functional Programming) ]

- FRP (Functional Reactive Programming)


# 설치

1. npm i -g @nestjs/cli     // NestJs 프레임워크 cli global 설치

2. nest new project-name // 신규 NestJs Project 생성

기본 node module과 여러개의 boilerplate 파일들이 생성된다.


# 메인 소스 구조

Angular와 마찬가지로, 대부분의 작업은 src 폴더 내에서 이루어 진다. 타입스크립트 기반으로

src/

app.controller.ts : 기본 컨트롤러 샘플(하나의 Route를 가진)

app.module.ts : App의 Root 모듈

<<app.module.ts 증>>

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

import { CatsController } from './cats.controller'; //개인이 구현한 Controller

 

@Module({

  controllers: [CatsController],                         //추가

})

export class AppModule {}


main.ts : App의 Entry 파일(하나의 Next Application 객체를 만들기 위해, 핵심 함수인 NestFactory를 사용한다)

<<main.ts 중 >>

import { NestFactory } from '@nestjs/core';

import { AppModule } from './app.module';


async function bootstrap() {

  const app = await NestFactory.create(AppModule); //실질적인 App의 부팅과정

  await app.listen(3000);                                      //3000 포트를 계속 listening 하게 됨

}

bootstrap();


# Platform 지원

Nestjs는 Node HTTP Framework(Platform)과도 호환 가능하도록 만들어진 프레임워크입니다.

platform-express : Node를 위한 최소한의 웹 프레임워크 > @nestjs/platform-express가 기본적으로 사용된다.

platform-fastify : 고성능과 낮은 오버헤드를 타겟팅으로한 프레임워크이다.


# Application 실행

npm run start : 서버를 가볍게 시작할 수 있따.


# 기본 작성 예시

1. 기본적으로 하나의 요청경로 별로 하나의 Controller를 정의한다. 

import {Controller, Get} from '@nestjs/common';

 

@Controller('dogs')  -----> /dogs 경로로 리퀘스트가 왔을 경우, 처리하는 로직 장성

export class DogsController {

   @Get() -----> Get Method로 요청을 받았을 경우, 처리하는 로직 작성

   findAll(): string {    //논리적 기능 이름 사용자가 정의 가능

    return 'This action returns all dogs';

   }

}


(요청에 대한 상세 정보가 필요한 경우)

import { Controller, Get, Req } from '@nestjs/common';

import { Request } from 'express';


@Controller('cats')

export class CatsController {

  @Get()

  findAll(@Req() request: Request): string {

    return 'This action returns all cats';

  }

}


2. 하나의 Controller 내에 요청과 관련된 Method 처리를 진행한다.

import {Controller, HttpCode, Get, Post, Header, Param, Body} from '@nestjs/common';

import {CreateCatDto} from "./create-cat.dto"; //사용자가 정의DTO[Data Transfer Object] 객체

 

@Controller('cats')

export class CatsController {


  @Post('dto') -------> /cats/dto로 post 요청 보냈을 경우

  async createWithDto(@Body() createCatDto: CreateCatDto) {

    return 'This action adds a new cat: ' + JSON.stringify(createCatDto);

  }

 

  @Post() -----> /cats 경로로 post 요청만 보냈을 경우

  @Header('Cache-Control', 'none') ----->To specify a custom response header(응답 헤더에 붙여서 전송)

  create(): string {

    return 'This action adds a new cat';

  }

 

  @Get() -----> /cats 경로로 get 요청만 보냈을 경우

  findAll(): string {

    return 'This action returns all cats';

  }


@Get('docs')

getDocs(@Query('version') version) {

  if (version && version === '5') {

    return { url: 'https://docs.nestjs.com/v5/' };

  }

}


  @Get(':id') ------> /cats/5로 get 요청을 보냈을 때, 5를 값으로 받고 싶은 경우, ":"라는 키워드와 함께 id라고 명명해준뒤, Params으로 접근해야한다.

  Routes with static paths won't work when you need to accept dynamic data as part of the request (e.g., GET /cats/1 to get cat with id 1)

  findOne(@Param() params): string {

    console.log(params.id);

    return `This action returns a #${params.id} cat`;

  }

 

  @Get('ab*cd') -----> /cats/abcd, ab_cd, abecd 일 경우 // ?,.+,*을 포함할 경우 ()로 감싸주어야함

  wildcards() {

    return 'This route uses a wildcard';

  }

 

  @Get()

  @Redirect('https://nestjs.com', 301) // To redirect a response to a specific URL(다른 Url로 statecode(기본:302)와 함께 다시 redirect시킬 경우)


  @Get('status')

  @HttpCode(500)                         //HttpCode 500으로 RESPOND하기를 원할 경우

  withStatusCode() {

    return 'This route status code 500';

  }

 

  

}

 

//(다른 파일) create-cat.dto.ts

export class CreateCatDto {

    readonly name: string;

    readonly age: number;

}


# Decoration 주석

@Request()req
@Response(), @Res()*res
@Next()next
@Session()req.session
@Param(key?: string)req.params / req.params[key]
@Body(key?: string)req.body / req.body[key]
@Query(key?: string)req.query / req.query[key]
@Headers(name?: string)req.headers / req.headers[name]
@Ip()req.ip

# 비동기 작업(요즘 대부분 이렇게 개발)

@Get()

async findAll(): Promise<any[]> {

  return [];

}


@Get()

findAll(): Observable<any[]> {

  return of([]);

}


둘중 아무거나 가능하다.


# 가장 기본 CRUD

import { Controller, Get, Query, Post, Body, Put, Param, Delete } from '@nestjs/common';
import { CreateCatDto, UpdateCatDto, ListAllEntities } from './dto';

@Controller('cats')
export class CatsController {
  @Post()
  create(@Body() createCatDto: CreateCatDto) {
    return 'This action adds a new cat';
  }

  @Get() // /cats/?id=1 일경우?? 모르겠네
  findAll(@Query() query: ListAllEntities) {
    return `This action returns all cats (limit: ${query.limit} items)`;
  }

  @Get(':id')
  findOne(@Param('id') id: string) {
    return `This action returns a #${id} cat`;
  }

  @Put(':id')
  update(@Param('id') id: string, @Body() updateCatDto: UpdateCatDto) {
    return `This action updates a #${id} cat`;
  }

  @Delete(':id')
  remove(@Param('id') id: string) {
    return `This action removes a #${id} cat`;
  }
}


# 기타 요소들 (서버 개발에 필요한 다양한 개념들)

- Middleware

- Exception Filters

- Pipes

- Guards

- Interceptors

- Custom decorators


# 출처

- https://backback.tistory.com/383 [Back Ground]


  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기