본문 바로가기
Back-end/nest.js

#1. Nestia : 네스티아를 배워보자 - 초기 설정

by hsloth 2023. 7. 2.

 

우선, 본 포스팅에 앞서 네스티아란 nest.js(node.js)쪽에서 되게 유명하신 삼촌님이라는 분이 계신데 그 분이 만드신 라이브러리이다.

내가 네스티아를 배우려고 하는 이유를 말해보자면, 아래와 같은 장점들이 있어서이다. (아직 사용해보지는 않았지만 그렇다고한다)

 

1. 프론트엔드와 백엔드의 언어가 같다는 이점을 극한으로 활용해서 서버 개발자가 SDK를 배포하고, 클라이언트 개발자가 해당 SDK를 활용하여 타입을 중복으로 정의하는 일이 없도록 할 수 있다.

2. Swagger 문서를 자동으로 만들어준다.

3. Class-validator, Class-transformer를 사용하는 것 보다 훨씬 빠른 속도를 자랑하는 Typia 라이브러리를 사용한다.

 

아직 내가 본격적으로 해본 게 아니라서 위의 세 가지 장점을 정확하게 설명을 못하고 두루뭉술하게 설명을 해봤는데, 나중에 사용해보고 가능하면 더 자세히 설명을 적도록 할 예정이다.

 

https://nestia.io/docs/

 

Nestia Guide Documents - Index

NestJS Helper Libraries

nestia.io

위의 공식 문서를 천천히 따라가 보자.


먼저, Introduction을 보면 nestia의 특징이 나와있다.

  • @nestia/core : 완전 빠른 데코레이터
  • @nestia/sdk
    • 클라이언트를 위한 SDK 생성
    • 보다 향상된 Swagger 데코레이터
    • 자동 e2e 테스트 함수 생성

그리고 그 아래에 보면, class-validator보다 2만배 이상 빠르고, class-transformer보다 200배 빠르다고 되어있다.


Setup


새로 프로젝트를 시작하기 위해서는 Boilerplate에 적혀있는 명령을 따라 작성하면 된다.

터미널에

npx nestia start <프로젝트명>

다음과 같이 명령을 입력해주자. 참고로 npx는 npm을 설치해서 쓰기에 부담될 때 사용한다.

원래라면 nestia start <프로젝트명> 으로 명령을 쳐야할 것을 npx를 이용하여 nestia를 따로 global하게 설치하지 않아도 사용할 수 있게된다.

 

그런데... 이렇게 하면 내가 평소에 사용하던 폴더구조가 아니고, 익숙하지 않은 파일들이 마구마구 생기게 된다... 그래서 일단 Nest프로젝트를 설치한 뒤, Setup Wizard를 사용하기로 했다.

nest new <project이름>

cd <prject이름>

npm install --save-dev nestia

npx nestia setup

위의 명령을 차례대로 입력해주자.

 


Pure Typescript


네스티아는 순수한 타입스크립트를 사용한다고 한다.

 

보통은 Nestjs에서 DTO를 위해 타입을 설정해주면, 이를 class-validator와 swagger에서 이중, 삼중으로 따로 정의를 해줘야하는 문제가 있다. 이건 매우 귀찮고, 실수를 유발할 수 있고, Typescript 컴파일러가 감지하기 어렵기 때문에 type safe하지 않다고 할 수 있다.

예를 들자면, validator를 설정하고, swagger를 설정해주기 위해서는 해당 property에 데코레이터를 무수히 많이 달아야하는데, nestia를 쓰면 단 한개의 데코레이터로 validator과 swagger를 설정할 수 있다는 말인 것 같다.

 


TypedRoute, TypedBody, TypedParam, TypedQuery


 

간단하게 설명하겠다.

 

위의 데코레이터들은 class-transformer의 역할도 동시에 수행하는데, JSON 직렬화 이전에, data validation까지 해주는 것으로 보인다.

 

TypedRoute는 라우터 경로를 설정하는 데코레이터이다. @TypeRoute.Get('url') 같은 형식으로 사용할 수 있다.

 

TypedBody는 HTTP 메세지의 body를 받아오는 데코레이터이다.

 

TypedParam은 Param을 받아오는 데코레이터이다.

 

TypedQuery는 Query를 받아오는 데코레이터이다.

 

각각 다음과 같이 사용할 수 있다.

@TypedRoute.Post('user/:id')
async createUser(
	@TypedBody() body: CreateUserDto,
    @TypedParam('id') id: number,
    @TypedQuery() query: CreateUserQueryDto
    ) {
    ...
}

Typed관련 데코레이터들을 사용하면, typia에서 작성한 코멘트들로 validation을 해준다.

그리고 Swagger설정도 자동적용이 되어서 좋다.

 


Swagger Documents


Nestia는 Swagger를 자동으로 생성해준다. Typed관련 데코레이터를 사용했다는 가정하에, 모든걸 자동으로 생성해준다.

그리고, comment로 api끼리 태그를 묶을 수 있다.

 

 

이제 swagger를 위해서 nestia.config.ts 파일을 설정해보도록 하자.

nestia.config.ts 파일 설정

// nestia.config.ts
// nestia configuration file
import type sdk from '@nestia/sdk';

const NESTIA_CONFIG: sdk.INestiaConfig = {
  /**
   * List of files or directories containing the NestJS controller classes.
   */
  input: 'src/**/*.controller.ts',
  /**
   * Output directory that SDK would be placed in.
   *
   * If not configured, you can't build the SDK library.
   */
  output: 'src/api',

  /**
   * Building `swagger.json` is also possible.
   *
   * If not specified, you can't build the `swagger.json`.
   */
  swagger: {
    /**
     * Output path of the `swagger.json`.
     *
     * If you've configured only directory, the file name would be the `swagger.json`.
     * Otherwise you've configured the full path with file name and extension, the
     * `swagger.json` file would be renamed to it.
     */
    output: 'dist/swagger.json',
    /**
     * List of server addresses.
     */
    servers: [
      {
        url: 'http://localhost:3000',
        description: 'Local Server',
      },
    ],
    /**
     * Security schemes.
     */
    security: {
      bearer: {
        type: 'http',
        scheme: 'bearer',
        bearerFormat: 'Authorization',
      },
    },
  },
  /**
   * Whether to wrap DTO by primitive type.
   *
   * If you don't configure this property as `false`, all of DTOs in the
   * SDK library would be automatically wrapped by {@link Primitive} type.
   *
   * For refenrece, if a DTO type be capsuled by the {@link Primitive} type,
   * all of methods in the DTO type would be automatically erased. Also, if
   * the DTO has a `toJSON()` method, the DTO type would be automatically
   * converted to return type of the `toJSON()` method.
   *
   * @default true
   */
  primitive: false,
};
export default NESTIA_CONFIG;
  • input : 컨트롤러 파일이 있는 경로가 들어가면 된다. 컨트롤러를 한 폴더에 모아 두었다면 src/controller 정도로 설정해줘도 되지만, 나의 경우에는 컨트롤러가 다 다른 폴더에 있어서 정규표현식을 사용했다.

 

  • output : SDK를 위한 옵션인 것 같다. SDK관련 파일들이 위치할 경로를 지정해주면 된다.

 

  • swagger
    • output : swagger.json파일이 위치할 경로를 적으면 된다. 나의 경우 dist/swagger.json으로 했다.
    • servers : 스웨거에 들어갈 서버정보를 적으면 된다. 서버를 여러개 설정해서 원하는 서버로 바꿔서 사용할 수 있다.
    • security : 보안관련 옵션이다. 나의 경우 jwt를 이용한 로그인을 염두해두었기 때문에 bearer옵션을 위와같이 설정해주었다.

나머지 기능들은 아직 써보지 않아서 잘 모르겠다. 나중에 쓸 일이 있으면 그때 포스팅을 하도록 할 생각이다!