Backend를 공부해보자 마음먹고 미루고 미루다가 드디어 시작하기로 마음먹었다. Front 공부만하기도 벅차지만 그래도 맛은봐야지 않겠는가
예전에 Django를 이용해서 니꼬쌤 강의를 들으면서 airbnb 클론 코딩을 진행해본적이 있기도 하고, 지금 회사에서 serverless lambda function의 기반을 python으로 두고 있어서 다시 장고나 python 관련 프레임워크로 진행하려고 했으나, 백엔드를 내가 실무를 치고 있는 것도 아니고, Django를 해본지는 너무 오래되기도 했고, 지금 내가 가장 편하게 할 수 있는건 javascript 기반 프레임워크라고 판단돼서 Nest JS를 선택했다.
NestJS 특징
- 사용, 학습이 간단하다.
- 생산성 향상 및 개발 단순성을 위한 강력한 CLI가 존재한다.
- 단위 테스트 프로그램이 사용하기 편하다.
- Typescript를 지원한다.
- TypeORM, Mongoose, GraphQL, 로깅, 유효성 검사, 캐싱, WebSocket 등과 같은 인기 있는 기술 및 아이디어와 쉽게 인터페이스할 수 있도록 하는 수백 개의 중첩 특정 모듈을 지원한다.
Controllers
컨트롤러는 들어오는 요청을 처리하고 클라이언트에 응답하는 역할을 한다. 특정 HTTP요청을 수신하고 라우팅 시스템은 어떤 컨트롤러가 어떤 요청을 받는지 결정한다.
그런 다음 보낼 적절한 답변을 작성한다. 클래스와 데코레이터의 도움으로 간단한 수집기가 만들어지고 각 컨트롤러에는 다양한 작업을 수행하기 위한 고유한 경로 집합이 있다.
Providers
Provider는 Nest의 핵심 아이디어 이다. services, repositories, factories, helpers, 등 많은 핵심 Nest 클래스 Provider로 처리할 수 있다.
Provider의 기본 개념은 종속성으로 주입될 수 있다는 것이다. 이는 개체가 서로 다양한 연결을 형성할 수 있으며 개체의 인스턴스를 "연결"하는 역할을 주로 Next 런타임 시스템에 아웃소싱할 수 있음을 의미한다.
Module
Module은 애플리케이션 구조의 구성 요소를 구성하는 @Module() 데코레이터가 있는 클래스이다. 각 응용 프로그램에는 응용 프로그램 그래프를 구성하는 데 사용되는 루트 모듈이 있으며, 이는 공급자와 모듈 간의 종속성과 상호작용을 추가로 해결한다.
이 데코레이터는 애플리케이션 코드에서 사용할 구성 요소, 컨트롤러 또는 기타 리소스를 식별하고 단일 세트로 결합하기 위해 NestJS에 메타데이터를 제공한다.
Install
npm i -g @nestjs/cli
nest new nest-tutorial
명령어를 입력하고 나면 어떤 패키지 메니저를 사용할건지 물어본다.
나는 yarn!
여기서 고민... 과연 nest에도 yarn berry가 잘 작동할까...? 그냥 안할래..
설치가 완료되면 프로젝트 디렉토리가 생성되고 node_modules 및 여러가지 파일들로 구성된다.
nest js 공홈에서 핵심파일에 대한 설명을 해준다.
- app.controller.ts
- 단일 경로가 있는 기본 컨트롤러이다. (컨트롤러??)
- app.controller.spec.ts
- 컨트롤러에 대한 단위 테스트이다.
- app.module.ts
- 애플리케이션의 루트 모듈이다.
- app.service.ts
- 하나의 방법으로 기본 서비스를 제공한다.
- main.ts
- 핵심 기능 NestFactory를 사용하여 Nest 애플리케이션 인스턴스를 생성하는 애플리켜이션의 항목 파일이다.
NestJS
Controller
Nest의 빌딩 블록은 컨트롤러이고 이는 인바운드 요청이 처리될 위치이다. 아래 코드와 같이 HTTP Method (get, post, put, delete 등) 데코레이터를 사용하여 경로를 지정할 수 있다.
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()
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`;
}
}