# nestjs

현재 회사의 신규 프로젝트로 nestjs로 구성된 서버를 빌드업 중에 있다.

앞으로 nestjs + mongodb + graphql + swagger + jest 에 대한 내용을 천천히 살펴볼 예정이다.

이번 글에서는 nestjs와 그 핵심 개념에 대하여 알아보도록 하겠다.

# nestjs

nestjs 홈페이지 메인을 살펴보면 이러한 문구를 가장 처음 만날 수 있다.

A progressive Node.js framework for building efficient, reliable and scalable server-side applications.

효율적이고 안정적이면서 확장성 있는 서버사이드 어플리케이션을 구축하기 위한 진보한 node.js 프레임워크이다.

과연 이 말은 어디까지가 진짜이고 어디까지가 가짜인 것일까 한번 살펴보기로하자.

우선은 진보한 node.js framework이라는 것은 기존의 node.js 서버사이드 프레임워크인 express가 대표적인 비교군이 될 것 같다.

소개 페이지를 살펴보면 완벽한 Typescript를 지원하고, 선택적으로 javascript또한 지원하며 OOP, FP, FRP 등의 페러다임을 모두 조합하는 것 또한 가능하다고 한다.(와우...)

# Philosophy

nest.js의 철학은 매우 빠르고 효과적인 프론트엔드 프레임워크들은 존재 하지만, 편의성뿐 아니라 구조적(Architecture)에 대한 문제도 해결할 수 있는 server-side 프레임워크에 대한 부제(javascript)에 대한 갈증을 해결하기 위하여 등장하였다고 한다.

아키텍쳐 자체는 Angular에서 큰 영감을 받았고, 테스트 가능성과 느슨한 결합, 쉬운 유지 관리, 확장성등을 확보하는 것을 주요한 철학으로 생각한다고 한다.

# nest Cli

nest.js에 경우에는 간단하게 CLI를 통해서 프로젝트를 시작할 수 있다.

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

이러한 커맨드를 통해서 기본적인 nest.js 프로젝트 파일을 만들고, npm run start를 통해서 3000 포트로 서버를 열어 볼 수 있다.

# nest 기본 구조

nest.js를 구성하는 핵심 구조에 대하여서 알아보자. nest.js App을 구성하는 필수적인 구성요소에 대해 다룬다.

nest project 구조를 살펴보면

src
 - app.controller.spec.ts
 - app.controller.ts
 - app.module.ts
 - app.service.ts
 - main.ts

이러한 구조의 파일 트리를 볼수 있을 것이고

nest.js 홈페이지에서 각각의 확장자들이 어떤역활을 하는지 알 수 있다.

files description
controller.ts single router를 포함한 기본 컨트롤러
controller.spec.ts unit test
module.ts 어플리케이션의 모듈
service.ts single method를 포함한 기본 service
main.ts 서버의 시작 파일 NestFactory 함수를 사용하여 어플리케이션의 인스턴스를 생성
main.ts;
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();

NestFactory의 내장 메소드를 통하여 서버를 생성하고, 열어줄 수 있다. 이는 Express서버에서 사용하는 일반적인 구조와 유사하다.

기본적으로 nest.js는 node 환경의 http를 사용하는 모든 프레임워크와 호환이 가능하니 참고하자.

# Controller

컨트롤러는 요청(Request)를 처리하고 응답(Response)를 반환하는 역활을 한다.

© Devlog from jeong