NestJS 란?
Nest JS는 자바스크립트 모듈인 Node(노드)의 Express와 같은 서버 프레임워크중 하나입니다.
그러나 express는 쉽게 서버를 만들 수 있는 반면에,
시스템 디자인 측면에서는 지원되는 항목이 거의 없습니다.
따라서 Nest JS는 nodejs의 서버 측 어플리케이션을 구축하기 위해서 제작된 프레임 워크로
Typescript기반의 OOP(Object Oriented Programming), FP(Functional Programming)
FPR(Functional Reactive Programming)을 지원합니다.
다양한 디자인 패턴들이 적용되어 있고, 그 패턴에 맞도록 서버를 구성해줘야 합니다.
typescript를 네이티브로 지원하고 데코레이터 클래스를 통해
다양한 기능들을 정형화/구조화 하여 설계할 수 있습니다.
하지만 대부분 클래스 구문을 통해 설계 되기에 자바스크립트 클래스에 대한 확실한 이해도가 필요합니다.
NestJS의 기본 컨셉
Nest.js의 기본 컨셉으로는 Provider(프로바이더), Controller(컨트롤러)를 module(모듈)로 합치고
그런 모듈들을 최종적으로 app.module.ts 파일에 합쳐 사용하는 방식입니다.
NestJs에서는 Singleton 패턴을 지향하기 때문에 인스턴스를 직접 생성하지 않고 모듈을 통해
Injection 하는 패턴을 권장하고 있습니다.
직접 인스턴스를 생성해 등록하는 방법도 있으나, 보통에는 NestJs에게 맡기는 것을 권장합니다.
Controller
백엔드에서는 흔히 사용되는 controller입니다.
요청이 들어올 수 있도록 설계해줘야 하는데
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
NestJS는 데코레이터를 사용합니다.
Controller를 만들기 위해서 NestJS가 제공하는 @Controller 데코레이터를 반드시 적용해야 합니다.
또한 Http Method(HTTP 메소드)를 지정할 때에도 @Get()과 같이 데코레이터를 적용시켜아 합니다.
위 코드는 Get Method로 들어오는 요청이 있을때 getHello 함수를 실행하고
getHello는 appService의 getHello 함수를 실행시키는 로직입니다.
Provider
Provider에는 NestJS의 모든 데이터 처리 및 비즈니스 로직을 담당합니다.
다만 역할에 따라 이름이 달라질 때도 있는데
- 사용자 인증 부분: Guards
- 클라이언트가 보내는 데이터 필터링: Pipes
- 비즈니스 로직: Service or Handler
- 예외 처리: Execption Filters
- Provider: 처리 과정 중 위에 해당하지 않는 무언가를 처리하고 싶을 때: Interceptor
- 미들웨어: Express의 Middleware과 동일
Provider(프로바이더)는 Middleware(미들웨어)를 거친 후에 해당 api에 접근 가능한 유저인지를 확인하는
Gaurd(가드)를 거칩니다. 이후 Pipes에서 클라이언트가 전달한 데이터를
원하는 형태로 가공합니다. 이후 비즈니스 로직을 처리하는 Handler(Service)에서 필요한 작업을 수행한 후
클라이언트에게 데이터를 전송합니다.
이 과정 중에 발생한 예외로는 Exception Filter에서 처리합니다.
Module
Module은 Provider 와 Controller를 합치는 역할을 합니다.
또한 Provider의 export와 import 처리를 돕습니다.
@Module({
imports: [
TodoModule,
],
controllers: [AppController],
providers: [AppService],
exports: [AppService]
})
export class AppModule {}
- exports에 AppService 작성: AppModule을 임포트 하면 AppService 사용 가능
- import에 ToModule 작성: TodoModule이 export 하는 provider를 AppModule의 provider.controller가 사용 가능 NextJS는 클라이언트의 요청별로 Controller와 Provider로 제작하고 이를 Module로 역어 하나의 단위를 만든다고 할 수 있다.
참고자료
'백엔드 > nestjs' 카테고리의 다른 글
[NestJS] Heroku 에 Nest.js 프로젝트 배포하기 (0) | 2022.04.15 |
---|