nest js vs express

개발정리·2022년 5월 15일
0
post-thumbnail

Intro

express를 1년 가까이해오면서 auth, mongodb, mysql 등등 모두 다 express로 배워왔다.
중간에 django나 flask ruby 이런것들 하나도 하지않고 only express만하고 있었다

문제점

너무 중구난방

express를 깊게하지않아도 몇번 express로 공부를하다보면
정말 중구난방이라는 느낌을 받을수있다. 단조로운 패턴 + express의 프리함
때문에 뇌를 빼고 가끔 삘타서 이것저것하다보면 엄청나게 복잡해져있는 내 프로젝트를 볼수있다.
떄문에 가끔 강의를 듣더라도 "이 사람은 왜 이렇게 짜증나게 해둔걸까"라는 생각도 든다.
근데 사실 그 강사분이 일부로 그랬을까? 그사람은 그런 구조가 편해서 사용했겠지만
나는 아니라는것이다.
요약하자면 정해진 아키텍쳐가 없기때문에 굉장히 짜증이난다

MVC패턴의 개념

내가 잘못배운걸수도있지만 나는 nest.js를 하면서 DTO Entity를 처음들어봤다.
진짜로 처음들어봤다. 근데 이게 spring boot에선 당연하게 사용하는것이다..
express를 하면서 DI? DTO? DAO 이런개념을 들어본적이없다.
좀 깊게 깊게 찾아보니 구현은 할수있지만 인지도가 적은게 맞는거같다.

express에서도 템플릿엔진을 사용할수있고 REST-API를 구현할수있지만
저런 개념들이 대중적이지못하다는 치명적인 단점이있다.

반복적인 작업들

mkdir project-name
cd project-name
mkdir views
mkdir public

npm install -s express
import express from "express"
const app = express()
const port = #portNumber

app.use(...)

app.listen(port, () => { console.log(`localhost:${port}`)}

프로젝트 만들때마다 계속해야한다. 아니면 만들어놓고
git clone해서 사용하거나 자기만의 cli 매니저를 만들어서 사용해야하는데
이게 보통 스트레스가아니다.

굳이 nestjs

사실 저런 문제점을 나만 느끼는게 아니라서 중구난방이라는 단점을 해결하기위해
이런것들이있다.
https://www.npmjs.com/package/express-generator-typescript
https://expressjs.com/ko/starter/generator.html

이런식으로 대충 아키텍쳐를 만들어준다 반복적인 작업을 할일이없어졌다!
하지만 이것도 뭐 추가하고 뭐 추가하고 하다보면 어쩔수없이 다시 중구난방이 될것이다
왜냐면 저거 이후에는 다시 자기 자신이 만들어야하기때문에..

nest js는?

이런식으로 만들어주는데

프로젝트 구조만 봐서는 이게 아까랑 뭐가 다른가 싶을수도있다.

app.controller.ts

import { Controller, Get, Render } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  HelloWord() {
    return this.appService.getHello();
  }
}

app.service.ts

import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}

main.ts

import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { NestExpressApplication } from '@nestjs/platform-express';
import { join } from 'path';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create<NestExpressApplication>(AppModule);

  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
      transform: true,
    }),
  );
  app.useStaticAssets(join(__dirname, '..', 'public'));
  app.setBaseViewsDir(join(__dirname, '..', 'views'));
  app.setViewEngine('hbs');
  await app.listen(3000);
}
bootstrap();

이게 Helloworld다

main.ts는 어떤 포트번호로 서버를 오픈할지,express로 치면 미들웨어들이나 view engine세팅 등등
여기서 담당한다

이런식으로 반 강제적으로 nest.js가 구조를 정해주기떄문에 사람마다 중구난방일수가없다.
좋든싫든 얘네가 정해진 규칙을 따를수밖에없으니까

단점

나는 nest.js를 배우면서 그냥 처음부터 nest.js나 spring boot로 시작했으면

조금 더 도움이되지않았을까 싶었다. 근데 또 처음부터 얘로 시작했으면

시작도안하고 포기했을거같기도하다 왜냐하면 express보다 난이도가 조금 있는편이다.

express Hello word를 보면

onst express = require('express')
const app = express()
const port = 3000


app.get('/', (req, res) => {
  res.send('Hello World!')
})


app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})

코드의 양 자체가 다르다 처음하는 사람들이면 코드의 양이 담당하는
심리적인 부담감은 없지않아있는게 사실이다.

코드의 양을 배제하더라도 기본적으로 한 파일에 모든 로직이 담겨있는것과

나도그랬으니까파일별로 그룹핑해서 관리되고있는 nestjs는 시작하기 두려울수있다.

나도그랬으니까

결론

nest.js 배우기는 조금 빡세다. 하지만 express로 crud를 구현해본사람이있다면

당장 nest.js로 똑같은 서비스를 제공하는 페이지를 만들어보면

미래지향적으로 생각했을떄 nest.js가 좀 더 많이 좋을거같은 느낌이 들거다.

게다가 typescript여서 익숙해져서 나쁠건 하나도없다.

그리고 개발 바닥의 향로님도 처음부터 그냥 nest.js로 시작하면 나쁘지않을거라고 하셨는데

정말정말 동의하는부분이다. 할수만있다면

https://www.youtube.com/watch?v=51xsW7fH7fU

profile
배운거 정리해요

0개의 댓글