Nest.js 소개
효율적이고, 스케일링이 쉬운 NodeJS 서버를 만드는데 사용하는 프레임워크
차세대 Javascript를 사용하며, Typescript로 만들어졌으며, Typescript를 완전 지원한다
Express 같은 견고한 HTTP 서버 프레임워크를 사용한다.
상당히 많은 NodeJS 라이브러리, 헬퍼, 툴 등이 있음에도 아키텍처 설계에 대한 해결책은 존재하지 않았다.
자체적으로 서버 아키텍처를 제공하며, 테스트하기 쉽고 유지보수가 편한 서버를 제작해준다.
Windows에서의 환경설정
먼저, NodeJS 공식 사이트를 통해 LTS 버젼을 다운받습니다.
https://nodejs.org/ko/download
Node.js — Node.js® 다운로드Node.js® is a free, open-source, cross-platform JavaScript runtime environment that lets developers create servers, web apps, command line tools and scripts.nodejs.org
이후, Windows Powershell에 관리자 권한으로 접속해 다음과 같은 명령어를 입력합니다.

다음으로, npm과 yarn 버젼도 확인합니다.

npm이 정상적으로 설치되었으므로, npm install -g @nestjs/cli 명령어를 칩니다.
이렇게 되면, Nest.js 코드를 터미널에서 실행할 수 있는 CLI 툴이 설치됩니다.
http를 이용해 기본 서버 만들기
Nest.js의 아키텍처를 더 쉽게 이해하기 위해 먼저 기본 NodeJS의 라이브러리를 사용하여 서버 구축을 해봅니다.
NodeJS에서 기본으로 제공해주는 http 패키지를 사용해서 간단한 서버 구축을 해보겠습니다.
루트 폴더에 server.js 라는 파일을 생성합니다.
먼저, require라는 CommonJS 문법을 사용하여 http 패키지를 가져옵니다.
const http = require('http')그리고, 호스트와 포트 번호를 저장합니다.
const host = 'localhost'
const port = 3000여기서 localhost는 127.0.0.1 이라는 IP를 의미하고, 이것은 Loop Back이라고도 하며, 서버를 실행한 컴퓨터입니다.
이제 http를 통해 서버를 만듭니다.
createServer 함수를 이용해, 서버를 만들고, 어떤 요청과 응답을 어떻게 처리할지 설정합니다.
http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html' })
res.end('<h1>Hello World</h1>')
})응답으로 Status Code를 넣기 위해 writeHead 함수를 사용하며, header 객체를 추가합니다.
마지막으로, end 함수를 통해 실제 어떤 데이터를 보내줄지 명시합니다.
이제 서버를 생성을 했으니 서버를 실행을 해야합니다. 앞서 createServer에서 반환값을 받습니다.
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html' })
res.end('<h1>Hello World</h1>')
})이제 서버 객체에서 listen 함수를 통해 host와 port에서 서버를 듣도록 만듭니다.
server.listen(port, host, () => { console.log('server running on http://localhost:3000') })이제 터미널에서 node server.js 실행문을 통해 서버를 실행시킵니다.

이제 http://localhost:3000/ 에 접속해 서버에 요청을 넣습니다.

응답으로 이렇게 h1 태그가 나오면 성공입니다.
Express.js로 RESTful API 구현하기
먼저 Express.js의 설치하기 위해 npm 초기화를 해줍니다.

그러면 package.json 파일에 여러가지 정보가 담깁니다.
이제 npm install express를 통해 설치합니다.

이제 본격적으로 코드를 작성해보겠습니다. 먼저, express 패키지를 불러옵니다.
const express = require('express')그리고 express를 실행합니다.
const app = express()이제 이 app 변수에 원하는 엔드포인트들을 붙일 수 있습니다. http method들을 함수로 사용합니다.
예를 들어, get 요청을 보내는 함수를 작성할 것인데, 첫번째 파라미터에는 라우팅될 path를 넣습니다.
두번째 파라미터에는 req, res를 파라미터로 받는 콜백 함수를 넣어줍니다.
이제 응답값으로 어떤 객체나 값을 반환하려면, res.send 함수를 사용하면 됩니다.
이러면, 첫번째 파라미터의 엔드포인트로 요청이 들어오면, 두번째 파라미터의 콜백 함수로 라우팅 됩니다.
app.get('/', (req, res) => {
res.send('<h1>Home Page</h1>')
})
app.get('/post', (req, res) => {
res.send('<h1>Post Page</h1>')
})반대로, 404 에러 처리를 위해서는 app.use 함수를 사용합니다.
위에서 라우팅 처리된 엔드포인트 이외에 경우에 use 함수로 트리거된다고 생각하면 됩니다.
app.use((req, res) => {
res.status(404).send('<h1>Error Page</h1>')
})이제 express도 서버를 listen 시킵니다.
app.listen(3000, () => {
console.log('server running on http://localhost:3000')
})이후에 node server.js를 통해 서버를 실행하고 확인합니다.
이를 통해 확인할 점은 현재 엔드포인트는 2~3개밖에 되지 않아 한 파일에서 처리했지만,
엔드포인트가 기하급수적으로 많아지고 비즈니스 로직이 복잡해지면 파일 및 아키텍처 관리가 필요해집니다.
이를 위해 Nest.js 프레임워크가 등장했습니다.
Nest.js 통한 hello-world
먼저 Nest.js 초기 셋팅을 위해 Nest CLI를 사용합니다. [nest new [project_name]] 명령어를 입력해주세요.

여러 체크 옵션에 대해서는 자유롭게 체크하시고 설치합니다.
일단 Nest.js가 어떤 아키텍처로 구성되어 있는지 알아봅시다.
1. main.ts -> Nest.js 프로젝트를 시작하는 파일
2. app.service.ts -> 비즈니스 로직 / 기능 구현에 사용되는 파일
3. app.module.ts -> Controller와 Service를 포함하는 Provider 관리 (의존성 관리)
4. app.controller.ts -> HTTP 메소드를 통해 요청에 대한 응답을 처리하는 구간
5. app.controller.spec.ts -> app.controller.ts에 있는 코드에 대한 테스트
예시로 app.controller.ts 코드를 다음과 같이 수정해서 엔드포인트를 여러 개 만들어봅시다.
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service.js';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) { }
@Get()
getHome() {
return 'Home Page'
}
@Get('post')
getPost() {
return 'Post Page'
}
@Get('user')
getUser() {
return 'User Page'
}
}이를 통해 Express.js를 제대로 구조화된 아키텍처가 Nest.js 임을 이해할 수 있었습니다.