본문 바로가기
NestJS/Basics

2장 Nest CLI로 시작하는 프로젝트 구조

by seunghyeok lee 2023. 7. 22.

이 장에서는 NestJS 프레임워크를 사용하여 실제로 돌아가는 아주 간단한 서버를 만들 겁니다. 해당 포스팅의 환경은 mac os 운영체제를 사용하고 있으며 에디터는 vsc를 사용하고 있습니다. 그리고 Nest 버전은 10.1.9입니다.

 

그리고 앞으로 내용은 js이나 다른 언어로 CRUD 애플리케이션을 한 번이라도 만든 경험이 있거나 express에 대해서 학습했으면 쉽게 이해할 수 있습니다.

 

2.1 Nest CLI로 빠르게 시작하기

우리는 이전 장에서 Nest CLI에 대해서 이야기를 했습니다. 해당 도구를 사용하면 초심자도 간단하게 NestJS 프레임워크로 짜인 CRUD 애플리케이션을 쉽게 구현할 수 있습니다.

 

다음과 같이 콘솔창에 해당 프로젝트 명과 함께 입력해 주세요.

 

nest new nest-basic // nest-basic: 프로젝트 명입니다!

 

그리고 다음과 같은 문구가 있을 겁니다. 우리는 이전에 이야기했듯이 npm 패키지 관리자를 사용할 겁니다.

npm에 엔터를 누르시면 됩니다.

 

그러면 위의 명령어는 "nest-basic"이라는 폴더 명이 생성되며 node modules과 몇 가지의 보일러플레이트 파일들이 설치를 합니다.

Nest CLI로 생성한 기본 구조

2.2 기본 프로젝트 구조

우리가 생성한 프로젝트에는 src라는 폴더가 있습니다. 해당 폴더에는 몇가지 핵심적인 파일들이 있습니다. 해당 파일들을 소개하겠습니다.

앞으로 추후에 배울 내용이라고 생각하고 넘어가시면 됩니다.

 

2.2.1  app.controller.ts

app.controller.ts는 단일 경로를 가진 기본 컨트롤러입니다. 해당 컨트롤러는 들어오는 요청을 처리하고 클라이언트에게 응답을 반환하는 책임이 있습니다. 자세한 내용은  Controller 챕터에서 다룰 예정입니다.

 

2.2.2 app.controller.spec.ts

 

app.controller.spec.ts는 app.controller.ts 가 유닛테스트 할 목적입니다. 해당 파일은 역시 추후에 유닛 테스트 장에서 설명하겠습니다.

 

2.2.3 app.module.ts

 

app.module.ts는 애플리케이션의 루트 모듈입니다. 루트 모듈은 Nest가 애플리케이션 그래프를 구축하는 데 사용하는 시작점으로, 모듈과 공급자 관계 및 종속성을 해결하는 데 사용하는 내부 데이터 구조입니다. 기본적으로 app 모듈이 존재하고 프로젝트의 로직에 따라 여러 개의 모듈을 사용합니다. 그리고 각 모듈은 밀접하게 관련된 기능 집합을 캡슐화합니다.

 

2.2.4 app.service.ts

 

말 그대로 단일 방식의 기본 서비스입니다.

 

2.2.5 main.ts

 

Nest 애플리케이션 인스턴스를 생성하기 위해 핵심 함수 NestFactory를 사용하는 애플리케이션의 엔트리 파일입니다.

main.ts는 express와 같이 애플리케이션을 생성하는 진입점과 같습니다.

 

해당 main.ts는  비동기 함수가 포함되어 있습니다. 이 비동기 함수 (bootstrap)은 우리의 애플리케이션을 실행할 것입니다.

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 class를 사용합니다. NestFactory는 몇 가지 정적 메서드가 있습니다.  해당 메서드는 애플리케이션 인스턴스를 생성합니다.

 

create() 메소는 INestApplication 인터페이스로 채워진 어플리케이션 객체를 반환합니다. 

 

반환된 객체는 애플리케이션이  HTTP 요청을 기다릴 수 있도록 HTTP 리스너를 시작하기만 하면 됩니다.

 

 await app.listen(3000);
그러면 기본적으로 해당 어플리케이션 로컬호스트 3000번 포트에서 대기하고 있습니다.
 
지금 까지 살펴본 내용은 마치 express와 비슷합니다. 여러분이 express를 알고 있다면 아래의 express 코드와 매우 비슷하구나를 이해하실 수 있습니다.
import express from "express";

const app = express();

app.listen(3000);

 

2.3 플랫폼

 

Nest는 플랫폼에 의존적인 프레임워크가 아닙니다. 그 말은 개발자가 원하는 타입의 애플리케이션의 이점을 취할 수 있다는 점입니다.

 

그래서 NestJS는 HTTP 플랫폼을 두 가지를 지원합니다. 해당 유형은 여러분이 원하는 요구에 맞춰서 선택하시면 됩니다.

 

2.3.1 platform-express

 

Express는 유명한 노드용 웹 프레임워크입니다. 기본적으로 @nestjs/platform-express 패키지가 사용됩니다. 많은 사용자가 Express를 잘 사용하고 있으며, 이를 활성화하기 위해 별도의 조치를 취할 필요가 없습니다.

 

2.3.2 platform-fastify

 

Fastify는 최대한의 효율성과 속도를 제공하는 데 중점을 둔 고성능, 낮은 오버헤드 프레임워크입니다.

 

어떤 플랫폼을 선택하든 그 자체의 애플리케이션 인터페이스를 노출합니다. 예를 들어 express platform 인 경우는 NestExpressApplication이며 Fastify는 NestFastifyApplication입니다.

 

만약 여러분이 NestFactory.create() 메서드에 특정 유형을 넣으면 app 객체는 특정 플랫폼에서만 사용할 수 있는 메서드가 생깁니다.

const app = await NestFactory.create<NestExpressApplication>(AppModule);

그러나 특정 플랫폼 API에 접근할 필요가 없으면 유형을 지정할 필요가 없습니다. 그래서 이 포스팅에서는 특정 유형을 선택하지 않을 것입니다.

 

2.4 애플리케이션 실행

 

애플리케이션을 실행하는 과정은 매우 간단합니다. package.json 파일을 보면 간단한 스크립트 명령어가 적혀있습니다. 이를 통해 우리는 직접 스크립트 부분을 건드릴 필요가 없습니다.

package.json 파일에서 명시되어 있듯이 우리는 개발단계이며 어플리케이션을 실행하고 싶습니다. 아래의 명령어를 실행하면 됩니다.

$ npm run start:dev

이 명령은 src/main.ts 파일에 정의된 포트에서 수신 대기 중인 HTTP 서버로 앱을 시작합니다. 

 

애플리케이션이 실행되면 브라우저를 열고 http://localhost:3000/ 로 이동합니다. Hello World! 메시지가 표시됩니다.

그리고 파일을 감시하여 서버를 자동으로 다시 컴파일하며 다시 로드합니다.

 

* 개발 프로세스 속도를 높이려면 스크립트에 -b swc  플래그를 전달하여 SWC 빌더를 사용할 수 있습니다! 다만 이 내용은 추후에 다루겠습니다.

nest start -b swc

 

 

 2.5  린트와 포매팅

생성된 Nest 프로젝트에는 코드 인터와 포매터가 모두 사전 설치되어 있습니다(각각 eslint와 prettier).

 

이러한 설치는 프로젝트의 환경을 안정성과 통합성을 높이게 되는 이점이 있습니다.

해당 린트와 prettier 설정 파일을 자체적으로 커스텀할 수 있게 되어서 프로젝트의 관리가 더욱 용이해집니다.


2.6 참고 자료

- Nest CLI: https://docs.nestjs.com/cli/overview

- Nest에서 사용하는 Fasify : https://docs.nestjs.com/techniques/performance

- Express : https://expressjs.com/

- SWC : https://docs.nestjs.com/recipes/swc

- Prettier : https://prettier.io/

- ESLint : https://eslint.org/

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com

 

Express - Node.js web application framework

Fast, unopinionated, minimalist web framework for Node.js $ npm install express --save

expressjs.com

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com

 

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com

 

Prettier · Opinionated Code Formatter

Opinionated Code Formatter

prettier.io

 

Find and fix problems in your JavaScript code - ESLint - Pluggable JavaScript Linter

A pluggable and configurable linter tool for identifying and reporting on patterns in JavaScript. Maintain your code quality with ease.

eslint.org

 

'NestJS > Basics' 카테고리의 다른 글

1장 NestJS 시작하기 -(2)  (0) 2023.07.22
1장 NestJS 시작하기 - 1.1. Introduction  (0) 2023.07.21

댓글