심플코더
간단한 코딩 공간
   

글쓰기    관리    수식입력
  • 분류 전체보기 (84)
    • AWS (1)
    • JavaScript (11)
    • 개인학습 (5)
    • DB (11)
    • OS (9)
    • Network (7)
    • DevOps (0)
    • TypeScript (1)
    • 개발 (1)
    • CKA (28)
hELLO · Designed By 정상우.
심플코더

간단한 코딩 공간

NestJS란
JavaScript

NestJS란

NestJS

NestJS는 Node.js기반 server-side application을 만들기 위한 framework이다.

 

TypeScript와 JavaScript를 모두 지원하며, OOP, FP, FRP의 요소를 결합했다는 특징을 가지고 있다.

 

설치 방법

다음과 같은 명령어를 입력하여 NestJS를 설치할 수 있다.

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

`npm i -g @nestjs/cli`를 통해 NestJS를 설치하고,

`nest new project-name`을 통해 project-name을 폴더 명으로 하는 NestJS 기반 프로젝트를 생성할 수 있다.

 

NestJS의 구조

Controller

NestJS를 활용하여 프로젝트를 만들면 Controller 파일이 이미 생성되어 있는 것을 확인할 수 있다.

 

이 Controller는 서버로 들어오는 Request를 처리하고 Client에게 Response를 리턴하는 기능을 담당한다.

Controller의 목적은 application을 위해 특정한 Request를 입력받는 것이다.

이를 위해 `Routing mechanism`이 어떤 Controller가 Request를 받아들일지 결정하게된다.

 

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

@Controller('cats')
export class CatsController {
  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }
}

 

위 코드는 공식 문서(https://docs.nestjs.com/controllers) 에서 제공하는 예제 코드에 해당한다.

파일명은 cats.controller.ts이며, 파일명 그대로 cats에 대한 API 요청을 처리하기 위한 코드에 해당한다.

 

예제에서 사용된 `@Controller`는 basic controller를 정의하기 위해 필요한 Decorator에 해당한다.

@Controller 내부에 들어가는 값은 처리할 path의 prefix에 해당한다.

 

`findAll()` 함수 전에 위치한 `@Get()`은 HTTP request method decorator로, Nest에게 특정한 HTTP Request의 End point에 대한 handler를 정의하기 위해 사용된다. 이 경우, 해당 End Point에 대한 GET 요청을 처리하게 된다.

 

End Point는 Controller내부에 정의한 prefix 경로와, HTTP Request Method Decorator 내부에 정의한 경로를 합쳐 정의된다.

 

현재 예제에는 Get Decorator 내부가 비어있기 때문에, GET /cats 요청을 catch하게 되며, 만약 Decorator 내부에 "breed"가 들어있다면, GET /cats/breed 요청을 catch하게 된다.

 

Handler에서는 Client Request의 Detail한 정보에 접근할 수 있다. Nest에서는 default 설정으로 Express의 Request Object에 접근할 수 있다. 

 

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';
  }
}

위와 같이 @Req() 데코레이터를추가해 Nest에서 request object를 inject하게 할 수 있다.

 

아래 Decorator를 통해 다양한 properties에 접근할 수 있다.

@Request(), @Req() 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
@HostParam() req.hosts

 

Route wildcards

@Get('ab*cd')
findAll() {
  return 'This route uses a wildcard';
}

위와 같이 asterisk를 사용하여 matching되는 경로에 대해서도 API 처리를 진행할 수 있다.

 

Status Code

@Post()
@HttpCode(204)
create() {
  return 'This action adds a new cat';
}

response의 status code는 성공 시 default로 200으로 설정되어있는데(POST는 201) `@HttpCode()` decorator를 통해 status code를 변경할 수 있다.

 

Headers

@Post()
@Header('Cache-Control', 'none')
create() {
  return 'This action adds a new cat';
}

@Header Decorator를 통해 header 정보를 변경할 수 있다.

 

Redirection

@Get()
@Redirect('https://nestjs.com', 301)

@Redirect 를 통해 특정 URL에 reponse를 redirect 할 수 있다.

url과 status code를 인자로 받으며, status code의 default는 302이다.

 

Route parameters

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

 

Request의 경로로 넣은 Parameter를 받기 위해 @Param 데코레이터를 사용할 수 있다.

 

Provider

Provider는 Nest에서 매우 중요시되는 개념이다. 기본적인 Nest class들은 모두 provider에 해당한다. 이러한 클래스들에는 Service, Repository, Factory 등이 해당한다.

 

Provider의 main idea는 provider가 dependency 처럼 inject될 수 있다는 점이다.

이 말은 object가 서로 다양한 관계를 생성할 수 있다는 것이며 이러한 객체들은 연결하는 작업의 일부를 Nest 런타임 시스템에 위임할 수 있다는 뜻이다.

 

앞서 Controller의 구성을 살펴봤었는데, Controller는 HTTP request를 처리하고 복잡한 작업은 provider에게 위임하여 처리한다.

 

Services

Service는 data의 저장과 검색 기능을 담당하며, Controller에 의해 사용된다.

import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';

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

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

  findAll(): Cat[] {
    return this.cats;
  }
}

$ nest g service cats 

위 명령어를 사용하면 기본적인 Service 객체 구조를 생성할 수 있다.

 

 

 

 

 

 

 

 

 

 

'JavaScript' 카테고리의 다른 글

TypeScript 기초  (0) 2023.10.31
API란? + RESTful API  (0) 2023.09.18
(Node.js) Express에서 cookie, session 사용 방법  (1) 2023.09.11
ES class와 prototype  (0) 2023.09.11
(JavaScript) Fetch API  (0) 2023.09.07
    'JavaScript' 카테고리의 다른 글
    • TypeScript 기초
    • API란? + RESTful API
    • (Node.js) Express에서 cookie, session 사용 방법
    • ES class와 prototype
    심플코더
    심플코더

    티스토리툴바