저장을 습관화
Nest.js 입문 기록 2 - 프로젝트 생성과 코드 분석 본문
작업 환경: 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가 없다면 해당되지 않는다.
'공부 > node.js' 카테고리의 다른 글
Nest.js 연습 - 게시판 만들기 (0) | 2023.08.04 |
---|---|
Nest.js 입문 기록 3 - IoC와 DI (0) | 2023.08.04 |
Nest.js 입문 기록 (0) | 2023.08.04 |
S3 버킷 사용하여 이미지 저장하기 + access key 받아오기(IAM) (0) | 2023.07.26 |
에러 기록 - SequelizeForeignKeyConstraintError (0) | 2023.07.14 |