저장을 습관화

Nest.js 입문 기록 2 - 프로젝트 생성과 코드 분석 본문

공부/node.js

Nest.js 입문 기록 2 - 프로젝트 생성과 코드 분석

ctrs 2023. 8. 4. 21:42

작업 환경: Windows 10

Node.js가 이미 설치되어 있다는 전제 하에,

 

0. Nest.js 설치

$ npm install -g @nestjs/cli

 

이후 커맨트 창에 nest를 입력했을때

아래와 같이 사용법이 나온다면 정상적으로 설치된 것

$ nest
Usage: nest <command> [options]

Options:
  -v, --version                                   Output the current version.
  -h, --help                                      Output usage information.

Commands:
  new|n [options] [name]                          Generate Nest application.
  build [options] [app]                           Build Nest application.
  start [options] [app]                           Run Nest application.
  info|i                                          Display Nest project details.
  add [options] <library>                         Adds support for an external library to your      
                                                  project.
  generate|g [options] <schematic> [name] [path]  Generate a Nest element.
    Schematics available on @nestjs/schematics collection:
      ┌───────────────┬─────────────┬──────────────────────────────────────────────┐
      │ name          │ alias       │ description                                  │
      │ application   │ application │ Generate a new application workspace         │
      │ class         │ cl          │ Generate a new class                         │
      │ configuration │ config      │ Generate a CLI configuration file            │
      │ controller    │ co          │ Generate a controller declaration            │
      │ decorator     │ d           │ Generate a custom decorator                  │
      │ filter        │ f           │ Generate a filter declaration                │
      │ gateway       │ ga          │ Generate a gateway declaration               │
      │ guard         │ gu          │ Generate a guard declaration                 │
      │ interceptor   │ itc         │ Generate an interceptor declaration          │
      │ interface     │ itf         │ Generate an interface                        │
      │ library       │ lib         │ Generate a new library within a monorepo     │
      │ middleware    │ mi          │ Generate a middleware declaration            │
      │ module        │ mo          │ Generate a module declaration                │
      │ pipe          │ pi          │ Generate a pipe declaration                  │
      │ provider      │ pr          │ Generate a provider declaration              │
      │ resolver      │ r           │ Generate a GraphQL resolver declaration      │
      │ resource      │ res         │ Generate a new CRUD resource                 │
      │ service       │ s           │ Generate a service declaration               │
      │ sub-app       │ app         │ Generate a new application within a monorepo │
      └───────────────┴─────────────┴──────────────────────────────────────────────┘

 

1. 새로운 프로젝트 시작

$ nest new ctrs-nest

위와 같이 명령어를 입력하면 

'패키지 설치할때 어떤 매니저 쓸래? npm? yarn? pnpm?' 이라고 물어본다.

 

Nest.js는 npm과 가장 잘 호환되므로 다른건 굳이 사용할 필요가 없다.

엔터를 누른다.

 

그럼 알아서 열심히 설치한다.

Succesfully created project

 

 

2. 생성된 프로젝트의 폴더로 들어가서 설치된 파일들을 확인하자

.gitignore까지 전부 다 준비되어 있다.

 

이중 /src/main.ts 파일을 확인하면 웹 서버를 시작하는 내용을 찾을 수 있다.

여기서 const app = await Nestfactory.create(AppModule)은 

AppModule이라는 모듈을 루트 모듈로 사용하는 Nest.js 어플리케이션 인스턴스를 생성해줘 라는 의미이다.

 

VSC에서는 저 AppModule 글자를 Ctr+클릭하면 해당하는 파일로 들어갈 수 있다.

 

 

위 내용에서 @Module과 같이 @가 붙는 키워드를 데코레이터라고 한다.

데코레이터는 해당 클래스나 함수가 어떤 역할을 수행하는지에 대해 Nest.js에 알려주는 역할을 한다.

여기서는 AppModule 클래스가 Nest.js 웹 어플리케이션에서 모듈 역할을 할 것이다. 라고 선언하였다.

 

@Module의 속성

- imports

해당 모듈에서 필요한 모듈의 집합을 정의하고 프로바이더(서비스)를 노출한다.

 

- controllers

해당 모듈에서 사용하는 컨트롤러를 정의한다.

 

- providers

해당 모듈에서 사용하는 서비스를 정의힌다.

 

- exports

해당 모듈에서 노출시킬 서비스를 정의힌다.

이 속성이 없으면 다른 모듈에서 이 모듈의 서비스를 사용할 수 없다.

 

 

3. 컨트롤러, AppController

모듈에서 사용하는 컨트롤러를 정의하는 곳이다.

여기서 constructor(private readonly appservice: AppService) {} 를 보면

인자로 AppSerive 객체를 넘기면 this.appService라는 멤버 변수에 AppService 객체가 주입되는 것을 확인할 수 있다.

 

컨트롤러는 서비스를 반드시 의존해야 하고, 이는 생성자(constructor)를 통해야 한다.

그리고 위 방법이 Nest.js에서 지원하는 DI(의존성 주입)이다.

 

@get 데코레이터는 HTTP GET으로 요청이 들어올 시

그 아래의 함수(예시에서는 getHello())를 실행하라는 의미이다.

 

Express 때와 마찬가지로 get 외의 메소드도 @Post, @Put, @Delete 데코레이터를 사용하여 작성할 수 있다.

 

 

4. 서비스, AppService

@Injectable 데코레이터

AppService가 서비스가 필요하면 DI(의존성 주입)을 통해 아래 클래스를 사용하라는 의미이다.

 

AppController가 AppService를 의존하는 것은 이 데코레이터가 있어서이다.

 

AppService와 같은 서비스 객체는 리포지터리를 의존하며 비즈니스 로직 실행을 담당한다.

웹 어플리케이션의 핵심 부분이며, Nest.js 어플리케이션이 DB를 사용한다면

서비스가 리포지터리를 반드시 의존해야하며 이는 생성자(constructor)를 통한 DI로 해결하여야 한다.

단, DB가 없다면 해당되지 않는다.