NestJS

본 글은 네이버 부스트캠프를 위해 학습한 내용을 노션에서 이전한 게시글입니다.


1. NestJS란

  • Node.js에 기반을 둔 웹 API 프레임워크
  • Express 또는 Fastify 프레임워크를 래핑하여 동작

1.1. 특징

  • nodejs 서버 애플리케이션을 구축하기 위한 프레임워크
  • 서버 애플리케이션 개발시 필요한 많은 부분들을 기본적으로 제공
  • Express 기반으로 만들어짐
  • TypeScript를 사용함
    • 프로그래밍 언어는 타입스크립트를 기본으로 채택하고 있어서 타입스크립트가 가진 타입시스템의 장점을 누릴 수 있음
    • JavaScript로도 코딩이 가능함
  • 다음 요소를 포함함
    • OOP : 객체지향 프로그래밍
      • IoC(Inversion of Control, 제어 역전)
      • DI(Dependency Injection, 의존성 주입)
      • AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)
    • FP : Functional 프로그래밍
    • FRP : Functional React 프로그래밍
  • 외부 모듈을 자유롭게 이용할 수 있음
  • unit 테스트와 e2e 테스트를 할 수 있는 툴을 제공

1.2. 탄생 배경

  • 최근 Node.js로 인해 JavaScript를 이용한 풀스택(클라이언트+서버) 개발이 활발해짐
  • JavaScript라는 한가지 언어로 개발을 하기 때문에 생산성을 향상시키고 빠른 개발이 가능해짐
  • 그러나 Node.js의 높은 자유도로 인해 Architecture 구성이 어렵고 효과적이지 못함
  • 이를 해결하기 위해 Angular의 아키텍쳐 사상을 기반으로 Nest가 만들어짐
    • 모듈/컴포넌트 기반의 프로그램을 작성함으로써 재사용성을 높여줌

1.3. 장점

  • Java의 Spring과 같이 규칙을 제공함
    • 이로 인해 개발자들이 아키텍처의 구성에 대해 고민해야 할 부분이 많이 줄어듦
  • 기본적으로 제공하는 라우팅, 보안 등의 기능이 많이 탑재되어 있어 편리함
  • 외부모듈을 통한 확장이 얼마든지 가능
  • Java+Spring 사용자의 경우 아키텍처 구조가 비슷해서 쉽게 배울 수 있음
  • Angular 사용자의 경우 기본적인 사용법이 동일해서 쉽게 배울 수 있음

1.4. 추세

  • 국내에서도 점점 인기를 얻고 있음
    • 모두싸인과 당근마켓 등 여러 회사에서 적용되어 사용자가 늘고 있음

2. NestJS 구조

2.1. Module

image

  • NestJS는 여러 모듈들의 집합
  • 반드시 하나 이상의 모듈이 있어야 함
    • 기본 모듈은 AppModule
    • 기능별로 모듈을 생성하여 개발할 수 있음
  • 생성된 각 모듈을 Root Module에 inmports 시켜주어야 함
    • CLI로 모듈을 생성하면 자동으로 Root Module에 import됨
    • export를 통해 외부에서 module을 사용할 수 있음

2.2. Controller와 Provider

image

  • controller는 client의 요청에 대한 라우팅을 처리
    • provider인 AppService에게 비즈니스 처리 요청을 보냄
    • 서비스에서 받은 결과를 client에 응답으로 보냄
  • providers는 service들의 모음(?)
    • controller의 요청을 받은 서비스는 비즈니스 로직을 처리한 후 controoller에게 return

3. NestJS 사용

3.1. NestJS 설치 및 프로젝트 생성

3.1.1. NestJS 설치

npm i -g @nestjs/cli

3.1.2. NestJS 프로젝트 생성

nest new project-name

3.1.3. NestJS 프로젝트 구조

  • dist : typescript 코드를 컴파일해서 빌드한 .js 파일이 저장되는 폴더
  • node_modules : package.json에 정의된 패키지 모듈이 설치되는 폴더
  • src : typescript 코드가 저장되는 사용자 소스 폴더
  • test : test 소스가 저장되는 폴더

3.1.4. 프로젝트 소스(src) 폴더 구조

  • app.controller.spec.ts
    • test용 소스 - controller를 테스트함
  • app.controller.ts
    • controller 소스 - client의 request를 처리하고, response를 보냄
  • app.module.ts
    • module 소스 - 모듈을 정의(controller와 service 정의)
  • app.service.ts
    • service 소스 - controller가 요청한 비즈니스 로직을 처리
  • main.ts : 프로젝트 시작점(Entry Point)

4. 유용한 기능

4.1. 소스 자동 생성기

# 모듈 자동 생성
nest g module 모듈명

# 컨트롤러 자동 생성
nest g controller 컨트롤러명

# 서비스 자동 생성
nest g service 서비스명

4.2. .env 사용

[DocumentationNestJS - A progressive Node.js framework](https://docs.nestjs.com/techniques/configuration)

[NestJS] .env사용하기

dotenv 대신 @nestjs/config을 사용해야하는 이유 + 활용