요즘 노드 백엔드 포지션에서 많이 쓰는 프레임워크다.
회사를 다니면서 ExpressJS와 AdonisJS를 많이 사용해 봤지만
NestJS는 기본적인 강의만 들어본 게 다였다.
DB랑 연결한 것도 아니고 편의상 소스로 데이터 더미를 만들어서 사용했다.
4월말에 회사를 퇴사하고 재취업을 준비하면서
정말 많은 회사들이 NestJS를 사용한다는 것을 알게 되었다.
서류통과 후 과제를 받을 때도 NestJS로 하라는 게 꽤 있었다.
많이 쓰는 건 이유가 있다고 생각하기도 하고
대세가 NestJS라면 따라야 한다고 생각해서
각잡고 배워야겠다고 생각했다.
이론적인 부분은 벨로그에 작성하고
소스는 깃허브에 올려서 공유할 계획이다.
화이팅!
효율적이고 확장 가능한 Node.js 서버 측 애플리케이션을 구축하기 위한 프레임워크
js를 사용하고 ts로 빌드 된다.
내부적으로 Express와 같은 HTTP 서버 프레임 워크를 사용하며
선택적으로 Fastify를 사용하도록 구성할 수 있다.
Node를 위한 훌륭한 라이브러리 등이 많지만
이 중 어떤 것도 아키텍처의 주요 문제를 효과적으로 해결하지 못함.
Nest는 개발자와 팀이 고도로 테스트 가능하고 확장 가능하며
느슨하게 결합되고 유지 관리가 쉬운 애플리케이션을 만들 수 있는
즉시 사용 가능한 애플리케이션 아키텍처를 제공한다.
이 아키텍처는 Angular에서 크게 영감을 받았다.
출처: NestJs 공식문서
$ npm i -g @nestjs/cli
설치
$ npm new project-name
프로젝트 생성
새 프로젝트 디렉터리가 생성되고
초기 핵심 Nest파일 및 지원 모듈로 디렉터리가 채워져
프로젝트의 기존 기본 구조가 생성됨
$ nest --version
설치 확인
모듈은 @Module () 데코레이터로 주석이 달린 클래스입니다.
@Module () 데코레이터는 Nest가 애플리케이션 구조를 구성하는 데 사용하는 메타 데이터를 제공합니다.
각 응용 프로그램에는 하나 이상의 모듈 (루트 모듈)이 있습니다.
루트 모듈은 Nest가 사용하는 시작점입니다.
모듈은 기본적으로 싱글톤이므로 여러 모듈간에 쉽게 공급자의 동일한 인스턴스를 공유할 수 있습니다.
Board 모둘 생성 명령어
nest g module boards
명령어 뜻 풀이
nest: using nest
g: generate
module: schrmatic that i want to create
boards: name of the schematic
결과: sre내에 boards/boards.module.ts 파일이 생김
app.module.ts에 새로생긴 파일이 연결됨
들어오는 요청을 처리하고 클라이언트에 응답을 반환
콘트롤러는 @Controller 데코레이터로 클래스를 데코레이션하여 정의됩니다.
Handler란?
핸들러는 @Get @Post @Delete 등과 같은 데코레이터로 장식 된
컨트롤러 클래스 내의 단순한 메소드입니다.
nest g controller boards --no-spec
--no-spec: 테스트를 위한 소스 코드 생성x
Service에서는 데이터베이스 관련된 로직을 처리합니다.
nest g service boards --no-spec
@Controller('boards')
export class BoardsController {
boardService: BoardsService; // ts라서 선언이 필요함. 없으면 에러
constructor(boardsService: BoardsService) {
this.boardsService = boardsService;
}
}
이걸 아래처럼 간소화해서 쓸 수 있다.
@Controller('boards')
export class BoardsController {
constructor(private boardsService: BoardsService) {
this.boardsService.getAllboards() // 이렇게 바로 사용 가능
}
}
접근 제한자(pubilc, private 등)을 생성자(constructor) 파라미터에 선언하면 접근 제한자가 사용된 생성자 파라미터는 암묵적으로 클래스 프로퍼티로 선언됩니다.
Nest의 기본 개념
대부분의 기본 Nest 클래스는 서비스, 레포지토리, 팩토리, 헬퍼등 프로바이더로 취급될 수 있습니다.
프로바이더의 주요 아이디어는 종속성을 주입할 수 있다는 것입니다.
즉 객체는 서로 다양한 관계를 만들 수 있으며 객체의 인스턴스를 연결하는 기능은 대부분 Nest 런타임 시스템에 위임될 수 있습니다.
Service란?
서비스는 소프트웨어 개발 내의 공통 개념이며, NestJS ,JS에서만 쓰는 개념이 아닙니다.
@Injectable 데코레이터로 감싸져서 모듈에 제공되며, 이 서비스 인스턴스는 애플리케이션 전체에서 사용될 수 있다.
@Injectable()
export class AppService{
getHello(): string {
return 'Hello World!';
}
}
계층간 데이터 교환을 위한 객체
DB에서 데이터를 얻어 서비스나 컨트롤러 등으로 보낼 때 사용하는 객체
DTO는 데이터가 네트워크를 통해 전송되는 방법을 정의하는 객체이다.
interface나 class를 이용해서 정의될 수 있다.
(하지만 클래스를 이용하는 것을 NestJS에서 추천하고 있다.)
데이터 유효성을 체크하는데 효율적입니다.
더 안정적인 코드를 만들어 줍니다.
많은 곳에서 프로퍼티를 사용하다가 이름이 바뀌면 수정하기 힘들어서
보통은 DTO를 두고 관리한다.
파이프는 @injectable ()데코레이터로 주석이 달린 클래스입니다.
파이프는 data transformation 과 data validation을 위해서 사용합니다.
파이프는 컨트롤러 경로 처리기에 의해 처리되는 인수에 대해 작동합니다.
Nest는 메소드가 호출되기 직전에 파이프를 삽입하고 파이프는 메소드로 향하는 인수를 수신하고 이에 대해 작동합니다.
data transformation
입력데이터를 원하는 형식으로 변환(예: 문자열에서 정수로)
data validation
유효성 검사
파이프를 사용하는 법
필요한 모듈
npm install class-validator class-transformer --save
커스텀 파이프 구현 방법
PipeTransform이란 인터페이스를 새롭게 만들 커스텀 파이프에 구현해줘야 합니다.
이 PipeTransform 인터페이스는 모든 파이프에서 구현해줘야 하는 인터페이스입니다.
그리고 이것과 함께 모든 파이프는 transform() 메소드를 필요합니다.
transform() 메소드
이 메소드는 두 개의 파라미터를 가집니다.
1. 처리된 인자의 값
2. 인자에 대한 메타 데이터를 포함한 객체
transform()메소드에서 리턴된 값은 route 핸들러로 전해집니다.
만약 예외가 발생하면 클라이언트에 바로 전해집니다.
$ npm new project-name
Error: Cannot find module 'node:url'