nestJS Intro

melangyun·2020년 7월 5일
9
post-thumbnail

1. NodeJS

node.js덕분에, Javascript 는 웹의 front-end와 back-end 모두에서 lingual franca 가 되었다.

lingua franca
모국어가 다른 사람들이 상호 이해를 위하여 만들어 사용하는 언어.

node.js는 javascript를 기반으로 하여 러닝커브가 짧다.
서버가 내장되어 있기 때문에, 웹 서버를 실제로 띄우기에도 타 언어에 비해 빠르고 간편하다.
개발을 전혀 모르는 경우에도 친절한 설명만 있다면 30분내로 node.js기반 서버를 띄울 수 있을 것이라 생각한다.
node.js는 한마디로, 쉽고, 빠르고, 간편하다.

또 node.js는 보편적으로 유연한 프로그램 구조 및 아키텍쳐를 사용할 수 있다.
node.js 의 기초인 모듈 형식만 지켜준다면_ ~~(아니, 지키지 않고 index나, router에 모든 코드를 때려 넣어도)~~ 아무튼간에 어찌 저찌 돌아간다.

이것은 곧 프로젝트가 커지는 동시에 엄청난 단점이 된다.

가장 유명하고 보편적인 Express라는 프레임워크도 프로젝트를 어떻게 구성할 것인가 에 대하여 공식적으로 제시하지 않는다.

프로젝트의 인터페이스에 대한 시행착오가 부족한 상태로는, 프로젝트가 커짐에 따라 (코드 량이 늘어나고, 협업자가 증가하고) 점차 개발자간 협의가 힘들어지며, 코드가 정돈되지 않아 스파게티 코드가 되어버리기 십상인 것이다.

시행착오?

그렇다면, 훌륭한 인터페이스를 이용하기 위해선 무수히 많은 시간을 버리며 스파게티 코드들을 견디고 뜯어고치는 시행착오들을 견디어야 할까?

개인의 사이드 프로젝트 뿐만아니라, 프로젝트의 인터페이스 외에도 겪어야 할 시행착오가 너무 많은 프로덕트는?

~~어떠한 풍파도 존버하는 자가 승리자다.~~
검색하면 구글이 금방 알려주는 시대에 사는 우리는, 조금 더 스마트한 방법으로 적은 시행착오로 프로젝트를 확장할수는 없을까?

2. NestJs


프로그램 아키텍쳐 및 파일 구조는 사실 정답이랄게 없다.

물론 이 글(Bulletproof node.js project architecture )과 같이 튼튼한 아키텍쳐를 위한 지침을 지시해주는 글들이 꽤 많고 정말 좋다. 하지만 각각의 아키텍쳐 지침들을 이해하고 어디까지 구현할 것인지, 내게 현재 적절한 선이 어디까지 일까 고민하고 기존 코드들을 뜯어고치는 시간들이 내게 있어서 굉장히 고된 시간이였다.

초심자도 적은 시행착오로 높은 코드 효율성을 갖을 순 없을까?

여러가지 방법들이 많겠지만,
나의 경우에는 이 니즈를 충족시켜줬던 것이 nestJS였다고 생각한다!

nest JS공식 피셜

nest provides an out-of-the-box application architecture which allows developers and teams to create highly testable, scalable, loosely coupled, and easily maintainable applications. The architecture is heavily inspired by Angular.

nestJs는 (거의)정형화된 인터페이스를 제공해주며, 논리적이며 효과적인 파일 트리를 구성하기 쉽다. 이말은 즉, 협업이 ~~비교적 (협업은 늘 노력해야해...)~~ 수월해 지고 코드 정돈(=재활용) 이 수월해 진다는 것이기도 하다.

controller 예시

import { Controller, Get, Post, Body } from '@nestjs/common';
import { CreateCatDto } from './dto/create-cat.dto';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';

@Controller('cats')
export class CatsController {
  constructor(private catsService: CatsService) {}

  @Post()
  async create(@Body() createCatDto: CreateCatDto) {
    this.catsService.create(createCatDto);
  }

  @Get()
  async findAll(): Promise<Cat[]> {
    return this.catsService.findAll();
  }
}

service 예시

import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';

@Injectable()
export class CatsService {
  private readonly cats: Cat[] = [];

  create(cat: Cat) {
    this.cats.push(cat);
  }

  findAll(): Cat[] {
    return this.cats;
  }
}

Spring과 유사하다

개인적으로 nestJs의 첫인상은 JAVA Spring과 코드의 생김새나 사용법이 거의 유사하다고 느꼈다.
그래서 첫 학습 때에 러닝 커브가 조금은 짧지 않았을까 생각한다.
~~스프링도 잘 못하는게 함정이라면 함정~~

하지만, Spring과 비할 바 없이 초기 세팅이 간단하다.

npm이 있다면, nestCLI를 설치하고, nest new prject를 터미널에 입력하면, 서버를 켜는데에 최소한의 초기세팅이 모두 끝난 프로젝트가 자동으로 생성된다.

하지만, Express에 비하면 복잡하다.

파일 트리를 정형화 시키기때문에 어느정도는 당연한 것 이겠지만, 조금 더 이 프로젝트를 사용자 화 하기위해서는 Framework에 대한 공부가 추가로 필요하다.

보편적인 아키텍쳐에 대한 거의 모든 지원을 하고있어서, 공부 시간이 아깝지 않게 훨씬 더 편안하게 서버 구축을 할수 있을 것이라 생각한다.

공식문서 & 채널

공식문서가 미친듯이 친절하다.
또한, 공식으로 서포트하는 디스코드 채널이 있어 세팅을 하거나 무언가 알 수 없는 문제에 직면할때, 혹은 에러를 발견했을 때 개발자들과의 질의응답이 가능하기도 하다!

물론, 보편적으로 헷갈리거나 마주할 수 있는 문제에 대해서는 구글신님이 거의 모두 알고계셔서 디스코드까지 가는 경우는 많이 없긴 했다. 하핫..

3. 시작하기

표준(standard) 아키텍쳐 (monolithic)으로의 시작은 정말로 간단하다.

  1. nest cli 를 글로벌로 설치하고
  2. cli로 프로젝트를 만든다.
  3. npm start

3000번 포트로 서버가 돌아간다.

$ npm i -g @nestjs/cli
$ nest new project-name
$ npm start

조금 더 선택적으로 nestJS 프로젝트를 만들고 싶다면 nest-core를 설치하여, 직접 설정하는 방법도 있다.

npm i --save @nestjs/core @nestjs/common rxjs reflect-metadata

참조 : https://docs.nestjs.com

참조 : https://velog.io/@hopsprings2/견고한-node.js-프로젝트-아키텍쳐-설계하기

profile
개발을 즐겁게!

1개의 댓글