# 개요
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]
'[DEV] App Dev ∕ Web Back > Framework ∕ NestJS' 카테고리의 다른 글
[NestJS] google login tutorial (0) | 2022.04.05 |
---|---|
[Nest.js/Angular] WebSocket으로 실시간 채팅[업데이트] 구현해보기 (0) | 2020.12.02 |
[배포] 윈도우 방화벽 포트 열기 (0) | 2020.11.18 |
NestJS : JWT 토큰/ Config / Pagination (0) | 2020.10.20 |
최근댓글