NestJS 프레임워크 사용을 위한 기본 개념에 대해 간략하게 정리해 보고자 한다.
본 포스팅에서는 NestJS의 기본 구조와 Controller 패턴에 대해 알아보도록 하겠다.
< 목차 >
- Setup
- src/ 디렉토리 구조
- Controllers
1. Setup
Nest CLI 를 사용해서 프로젝트를 생성해보고자 한다. 우선 npm을 사용해 @nestjs/cli 를 global로 설치해준다.
설치가 완료되었다면, nest new [프로젝트명] 명령어를 통해 보일러 플레이트 코드(Boilerplate code)와 함께 NestJS 프로젝트를 생성할 수 있다.
## Nest CLI 설치
$ npm i -g @nestjs/cli
## Nest 프로젝트 생성
$ nest new [project-name]
보일러 플레이트 코드?
프로그래밍에서 보일러 플레이트 혹은 보일러 플레이트 코드(Boilerplate Code)라고 부르는 것은 최소한의 변경으로 여러 곳에서 재사용되며 반복적으로 비슷한 형태를 띄는 코드를 의미한다. 다시말해, 변화없이 여러 군데에서 반복되는 코드를 말한다.
2. src/ 디렉토리 구조
- app.controller.ts
- 하나의 라우트(route)가 있는 기본 컨트롤러
- Express를 사용해 보았다면, 라우팅을 위해 만들었던 route 파일과 비슷한 역할 수행
- app.controller.spec.ts
- 컨트롤러를 위한 유닛 테스트
- app.module.ts
- 애플리케이션의 루트 모듈
- app.service.ts
- 단일 메소드를 사용하는 기본 서비스
- 비즈니스 로직 수행
- main.ts
- 애플리케이션 entry 파일
- 핵심 기능인 NestFactory를 사용하여 Nest 애플리케이션 인스턴스를 생성
3. Controllers
Controller(컨트롤러)는 들어오는 요청을 처리하고 클라이언트에 응답을 반환한다. 다시 말해, 컨트롤러의 목적은 애플리케이션에 대한 특정 요청을 수신하는 것에 있다.
다음의 app.controller.ts 파일을 살펴보자.
// app.controller.ts 파일
import { Controller, Get, Req, Body, Param } from '@nestjs/common';
import { AppService } from './app.service';
import { Request } from 'express';
@Controller('home')
export class AppController {
constructor(private readonly appService: AppService) {}
@Get('hello/:id/:name')
getHello(@Req() req: Request, @Body() body: BodyDto, @Param() param: { id: string; name: string }): string {
return this.appService.getHello();
}
}
우선 AppController 클래스에 @Controller( ) 데코레이터가 설정되어 있는 것을 확인할 수 있는데 이는 NestJS에서 데코레이터 패턴을 사용하기 때문이다. NestJS는 기본 컨트롤러를 생성하기 위해 클래스와 데코레이터를 사용한다.
데코레이터 패턴? (Decorator pattern)
주어진 상황 및 용도에 따라 어떤 객체에 책임(기능)을 동적으로 추가하는 패턴을 말한다. 기능 확장이 필요할 때 사용된다.
데코레이터를 통해 함수나 클래스에 기능을 첨가할 수 있으며 이를 통해 재사용성을 극대화시킨다.
@Controller( ) 데코레이터의 인자값으로 'home'을 전달하였는데 이는 AppController의 경로 접두사(path prefix)를 지정해 주는 행위이다. 즉, 경로의 기본 엔드 포인트가 /home이 된다는 의미이다. @Get( ) 데코레이터에서도 엔드 포인트를 지정해 줄 수 있는데 이로써 getHello( )의 엔드 포인트는 /home/hello/:id/:name 이 된다.
요청 객체를 핸들링 할 때 역시 데코레이터가 사용된다. ( @Req() , @Body() , @Param() 등등,, )
참고로 request body의 경우, DTO를 사용해서 type 지정을 하고 body에 대한 validation을 진행하는 방식을 주로 사용한다.
다음으로 AppController 클래스 안의 constructor( ) 함수를 살펴보면 AppService를 사용하기 위해 의존성 주입(Dependency Injection) 방식이 사용된 것을 알 수 있는데 의존성 주입에 관해서는 추후에 다시 알아보도록 하자.
Reference)
본 포스팅은 NestJS 공식문서를 참고하여 작성되었습니다.
'Node > NestJS' 카테고리의 다른 글
NestJS - Pipes & Interceptors (0) | 2023.03.26 |
---|---|
NestJS - Exception filter 설정 (0) | 2023.03.16 |
NestJS - LoggerMiddleware 설정 (0) | 2023.03.13 |
NestJS - 캡슐화(Encapsulation) & Modules (0) | 2023.03.10 |
NestJS - 의존성 주입(DI) & Providers (0) | 2023.03.10 |