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 |