1. NestJS 시작

"나무위키" 에 짧게 정의된 글을 빌자면,

"Node.js 런타임 위에서 동작하는 TypeScript 오픈 소스 백엔드 웹 프레임워크."

 

"공식 문서 페이지"에서는 아래와 같이 소개하고 있다.

"Nest(NestJS)는 효율적이고 확장 가능한 Node.js 서버 측 애플리케이션을 구축하기 위한 프레임워크입니다 . TypeScript 를 완벽하게 지원하며(순수 JavaScript로 코딩할 수도 있음) OOP(객체 지향 프로그래밍), FP(함수형 프로그래밍) 및 FRP(함수형 리액티브 프로그래밍) 요소를 결합합니다.

내부적으로 Nest는 Express (기본값) 와 같은 강력한 HTTP 서버 프레임워크를 사용하며 선택적으로 Fastify 도 사용하도록 구성할 수 있습니다!

Nest는 이러한 일반적인 Node.js 프레임워크(Express/Fastify)보다 높은 수준의 추상화를 제공하지만 해당 API를 개발자에게 직접 공개합니다. 이를 통해 개발자는 기본 플랫폼에서 사용할 수 있는 수많은 타사 모듈을 자유롭게 사용할 수 있습니다."

 

철학

"공식 문서 페이지" 에서는 아래와 같이 소개하고 있다.

"최근 몇 년 동안 Node.js 덕분에 JavaScript는 프런트엔드 애플리케이션과 백엔드 애플리케이션 모두에서 웹의 "언어"가 되었습니다. 이로 인해 개발자 생산성을 향상하고 빠르고 테스트 가능하며 확장 가능한 프런트엔드 애플리케이션을 생성할 수 있는 Angular , React  Vue 와 같은 멋진 프로젝트가 탄생했습니다 . 그러나 Node(및 서버측 JavaScript)를 위한 뛰어난 라이브러리, 도우미 및 도구가 많이 존재하지만 그 중 어느 것도 아키텍처 의 주요 문제를 효과적으로 해결하지 못합니다 .

Nest는 개발자와 팀이 고도로 테스트 가능하고 확장 가능하며 느슨하게 결합되고 유지 관리가 쉬운 애플리케이션을 만들 수 있는 즉시 사용 가능한 애플리케이션 아키텍처를 제공합니다. 아키텍처는 Angular에서 많은 영감을 받았습니다."

장점

  • 확장성(Extensible)
    모듈식 아키텍처를 채용하여 다른 라이브러리를 사용할 수 있어 진정한 유연성을 제공.
  • 유연성(Versatile)
    모든 종류의 서버 측 애플리케이션을 위한 완전한 백본 역할을 하는 적응형 에코시스템.
  • 프로그레시브(Progressive)
    최신 JavaScript 기능을 활용하여 Node.js 세계에 디자인 패턴과 성숙한 솔루션을 제공.

설치

Nest CLI를 사용하여 스캐폴드하거나 시작 프로젝트를 복제할 수 있다.

npm i -g @nest.js/cli
nest new {프로젝트명}
npm install
npm run start

또는 Git을 사용하여 TypeScript 시작 프로젝트를 만들 수 있다. git 기록없이 복제하려면 degit을 사용한다.

git clone https://github.com/nestjs/typescript-starter.git {프로젝트명}
cd {프로젝트명}
npm install
npm run start

"helloworld" 라는 이름으로 프로젝트를 생성했다.

브라우저를 열고 http://localhost:3000/ 으로 이동합니다. 아래와 같은 화면을 볼 수 있을 것이다.

src/ 디렉토리 및 소스 구조는 아래와 같다.

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

 

개별 소스를 설명하면 이렇다.

app.controller.ts Route Path 가  하나 있는 기본 컨트롤러입니다.
app.controller.spec.ts 컨트롤러에 대한 단위 테스트입니다.
app.module.ts 애플리케이션의 루트 모듈입니다.
app.service.ts 샘플 메소드 하나 들어있는 기본 서비스 입니다.
main.ts  NestFactory 핵심 기능을 사용하여 Nest 애플리케이션 인스턴스를 생성하는 파일입니다. 

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 클래스는 애플리케이션 인스턴스를 생성할 수 있는 몇 가지 정적 메서드를 노출한다.  create() 메서드는 인터페이스를 충족하는 애플리케이션 INestApplication  개체를 반환하는데,  이 객체는 다음 장에서 설명할 메서드 세트를 제공합니다. 위의 예 에서는 main.ts애플리케이션이 인바운드 HTTP 요청을 기다릴 수 있도록 HTTP 수신기를 시작하기만 하면 된다.

 

Nest CLI로 스캐폴드된 프로젝트는 개발자가 각 모듈을 자체 권장되는 디렉토리 구조를 따르도록 프로젝트를 생성해 준다.

 

Platform

Nest는 플랫폼에 구애받지 않는 프레임워크를 목표로 한다. 플랫폼 독립성을 통해 개발자가 다양한 유형의 애플리케이션에서 활용할 수 있는 재사용 가능한 컴포넌트를 생성할 수 있으며, 기술적으로 Nest는 어댑터가 생성되면 모든 Node HTTP 프레임워크와 작동할 수 있다. 기본적으로 지원되는 두 가지 HTTP 플랫폼은 express  fastify 다. 기본은 express 이며, fastify 로 쉽게 바꿀 수 있다.

platform-express Express 는 노드용으로 잘 알려진 미니멀리스트 웹 프레임워다. 커뮤니티에서 구현한 많은 리소스가 포함된 실전 테스트를 거쳐 프러덕션 가능한 라이브러리이다. @nestjs/platform-express 패키지는 기본적으로 사용된다. 워낙에나 유명해서 별다르게 기능, 호환성에서 고민할 게 없다.
platform-fastify Fastify 는 효율성과 속도에 중점을 둔 고성능 프레임워크입니다. 관심이 있다면 여기 를 참고하자. 

 

어떤 플랫폼을 사용하든 자체 애플리케이션 인터페이스를 노출한다. 이들은 각각 NestExpressApplication NestFastifyApplication 로 로드된다.

NestFactory.create()아래 예제와 같이 메소드 에 유형을 전달하면 app객체는 해당 특정 플랫폼에서만 사용할 수 있는 메소드를 갖게 되지만, 실제로 기본 플랫폼 API에 액세스하려는 경우가 아니면 아래처럼 유형을 지정할 필요가 없다.

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

 

어플리케이션 실행

npm run start

빌드 속도를 높이기(20배) 위해서 SWC 빌더를 사용할 수 있다.

npm run start -- -b swc .

이 명령은 파일에 정의된 포트에서 수신 대기하는 HTTP 서버로 앱을 시작합니다 src/main.ts. 애플리케이션이 실행되면 브라우저를 열고 http://localhost:3000/ 로 이동하고, Hello World!. 메시지가 브라우저에 출력된다.

 

소스 수정 시 서브를 다시 컴파일하고 기동하려면 아래와 같이 시작한다.

npm run start:dev

 

린팅 및 포매팅 지정

Nest CLI 는 대규모로 안정적인 개발 워크플로우를 지원하기 위해 Linter(elslint) 및 포매터(prettier) 가 모두 사전 설치되어 제공된다.

 

IDE가 관련되지 않은 헤드리스 환경(지속적 통합, Git 후크 등)의 경우 Nest 프로젝트에는 즉시 사용 가능한 npm스크립트가 제공된다.

# Lint and autofix with eslint
npm run lint

# Format with prettier
npm run format

 

이상, NestJS에 대한 소개와 기본적인 환경설정 및 구동 방법에 대해서 알아보았다.

다음 시간에는 컨틀롤러에 대해서 알아보자.

'Backend(Framework) > NestJS 개요(공식문서 번역)' 카테고리의 다른 글

6. Exception filters  (0) 2023.11.17
5. Middleware  (1) 2023.11.16
4. Modules  (1) 2023.11.16
3. Provider  (1) 2023.11.16
2. Controller  (0) 2023.11.05
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유