본문 바로가기
JavaScript│Node js

Nestjs 사용하고 느낀점

by 자유코딩 2020. 1. 10.

Expressjs 기반의 타입스크립트 프레임워크

써보고 현재까지 느낀 장점

1. 스웨거 문서화가 간단하다. 아래 코드를 보고 쉽게 할 수 있었다

import { NestFactory } from '@nestjs/core';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { ApplicationModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(ApplicationModule);

  const options = new DocumentBuilder()
    .setTitle('Cats example')
    .setDescription('The cats API description')
    .setVersion('1.0')
    .addTag('cats')
    .build();
  const document = SwaggerModule.createDocument(app, options);
  SwaggerModule.setup('api', app, document);

  await app.listen(3000);
}
bootstrap();

/api 에 접속해보면 스웨거 페이지가 나옵니다.

 

2. Spring 의 restdocs 같은 문서를 아주 쉽게 생성할 수 있다.

명령어로 api 의 의존관계까지 나오는 문서를 만들 수 있다.

 

3.스프링과 사용 경험이 유사하다. 근데 스프링보다 간단하다

스프링처럼 구조화는 잘 되어 있는데 설정은 간단하다

 

4. 명령어로 컨트롤러를 만들면 테스트 코드 틀이 다 만들어져서 나온다.

틀 안에 테스트 코드를 채워넣기만 하면 된다.

 

5. TypeORM 이라는 ORM을 제공한다

javascript 에서 쓰는 ORM은 Sequelize 도 있다. 그런데 개인적인 생각으로는 Sequelize 는 Expressjs에 Typescript 만 도입한 형태일때 잘 어울린다. Nestjs 를 쓴다면 TypeORM이 더 적절해보였다. 

NoSQL은 자바스크립트니까 Mongoose 를 쓸 수 있다.

 

6. 간편한 validation 

validation 로직은 작성하다 보면 정말 길어지고 실수를 하게 될 수도 있다.

nest js 에서는 class 에 정의하고 서버에 한줄 추가하는 것만으로 validation 을 할 수 있다.

async function bootstrap() {
  const app = await NestFactory.create(ApplicationModule);
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(3000);
}
bootstrap();

nest js 문서에서 가져온 코드

쓰게 된 이유

타입스크립트를 express에서 사용하는 방법도 있다.

그런데 tsconfig.json , lint.json 등등의 json 파일을 만들고 세팅하는 과정이 너무 귀찮기도 했다.

장고, 스프링같은 경우에는 처음에 만들면 틀이 잡혀서 나온다.

틀이 잡혀있고 로직에만 집중해서 채워넣을 수 있는게 편하긴 하다.

 

express 는 사실상 직접 만들어가야 하는 구조다.

deno 를 사용한 접근도 시도했었다

deno 를 사용하면 트랜스파일링 없이 ts 파일 자체로 실행 할 수 있다.

그런데 여기서 문제가 하나 있었다

express 는 원래 node js 의 프레임워크다.

deno 를 사용했을때는 다른 프레임워크를 써야한다.

 

아래 사이트에 들어가면 deno 로 개발하는 web framework 들이 있다

https://github.com/denolib/awesome-deno

 

denolib/awesome-deno

🎉A curated list of awesome things related to Deno. Contribute to denolib/awesome-deno development by creating an account on GitHub.

github.com

거기서 골라서 개발을 하면 되긴 하는데.!

문제는 아직 아래 코드처럼 웹에서 불러오는 방식은 vscode의 지원이 약하다

import { abc } from "https://deno.land/x/abc/mod.ts";

const app = abc();

app
  .get("/hello", c => {
    return "Hello, Abc!";
  })
  .start({ port: 8080 });

npm module 로 다운 받는 것은 모듈이 로컬에 저장되기 때문에 자동완성이 매우 편리하다.

웹은 그렇게 자동완성이 되지 않는다.

 

json 데이터를 다루기가 편리하고 타입이 있길래 TS를 쓰긴 써야겠다고 생각했는데 마땅한 도구가 뭔지 고민했다

 

결국 아래와 같은 이유로 nestjs 를 쓰는 것 같다

1. 아직은 미약한 deno 프레임워크 생태계

2. 장고처럼 cli 로 틀을 찍어낼 수 있다

3. 스프링처럼 구조가 잡혀있는 코드

4. 꽤 괜찮은 ORM 지원

5. 어쨌든 자바스크립트기 때문에 json 다루기 편하다

 

향후 deno framework 지원이 좋아진다면 deno 도 생각 해볼 것 같다.

 

 

명령어

설치하기

npm install -g @nestjs/cli

어디서든 nest new <프로젝트 이름>으로 프로젝트를 만들고 사용할 것이다.

-g옵션을 사용해서 설치해야 한다.

 

여기서 설치가 안 되는 경우가 있다.

mac에서는 xcode 관련 에러가 나오는 경우가 있는데 아래 링크를 참고해서 해결하면 된다.

 

gyp: No Xcode or CLT version detected!

https://github.com/schnerd/d3-scale-cluster/issues/7

 

npm install fails on node-gyp rebuild with "gyp: No Xcode or CLT version detected!" · Issue #7 · schnerd/d3-scale-cluster

error code > ckmeans@1.0.1 install /Users/project/node_modules/ckmeans > node-gyp rebuild xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/L...

github.com

 

설치했다면 프로젝트를 만든다.

프로젝트 생성

nest new <프로젝트 이름>

 

도메인 단위로 앱 추가하기

컨트롤러 생성하기

nest g controller user

모듈 생성하기

nest g module user

서비스 생성하기

nest g service user

 

DB 연결 참고사항 - MySQL을 쓰는 경우

typeorm 문서에서 ormconfig.json 파일을 가져온다

https://typeorm.io/index.html#/

 

TypeORM - Amazing ORM for TypeScript and JavaScript (ES7, ES6, ES5). Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server,

 

typeorm.io

{
   "type": "mysql",
   "host": "localhost",
   "port": 3306,
   "username": "test",
   "password": "test",
   "database": "test",
   "synchronize": true,
   "logging": false,
   "entities": [
      "src/entity/**/*.ts"
   ],
   "migrations": [
      "src/migration/**/*.ts"
   ],
   "subscribers": [
      "src/subscriber/**/*.ts"
   ]
}

여기서 주의사항이 있다.

entities 아래의 

      "src/entity/**/*.ts"

 이 경로를 dist 파일 안으로 해줘야 한다.

ts 파일로 하지말고 컴파일 이후의 js 파일로 설정해야 한다.

 

 

댓글