[Nest.js]01. 프로젝트 세팅

김지엽·2023년 10월 5일
0
post-custom-banner

1. Nest를 쓰는 이유

- 구조적이다.

이 전에 사용했던 프로젝트에서는 express를 사용했다.
하지만 처음부터 끝까지 모두 내가 원하는대로 자유롭게 구현했던 express와는 달리 nest는 형식을 요구하며 자유도는 낮지만 코드의 양이 많아질수록 express 보다 훨씬 구조적이다.

- 안정적이다.

nest는 typescript를 언어로 채택하고 있다. typescript는 개발 도중에 실수 및 버그를 잡아주기에 에러를 미연에 방지할 수 있다. 그렇기에 개발에 안정적이다.

2. Nest의 특징

- DI (Dependency Injection)

https://velog.io/@wlduq0150/01-5.-Nest.js-DI-Dependency-Injection

- Module

하나의 module이 controller, provider를 포함한다.
이는 서로 연관있는 속성과 기능들을 하나의 모듈로 묶어 놓으며 imports, exports로 모듈간의 상호작용을 한다. 이는 "캡슐화"를 만족한다.

3. Nest 초기 세팅

- 프로젝트 생성

$ npm i -g @nestjs/cli

nest cli로 초기 세팅

$ nest new "project-name"

프로젝트 폴더를 생성한다.

- Cors

[main.ts]
...

app.enableCors({
    origin: true,//여기에 url을 넣어도된다. 
    credentials: true,
});

...

Cors는 웹 페이지가 다른 도메인의 접근을 막는 보안 아키텍쳐이다. Cors를 활성화해야 클라이언트에서 서버의 요청을 받을 수 있다.

- validationPipe

[main.ts]
...

app.useGlobalPipes(new ValidationPipe({
    transform: true,
    transformOptions: { enableImplicitConversion: true },
    whitelist: true,
    forbidNonWhitelisted: true,
  }));
  
...

validationPipe 서버에 Request가 들어올때 유효성 검사를 해주는 nest의 내장 라이브러리이다.

transform: request의 payload가 nest의 dto에 맞게 type를 변환 시켜주는 옵션
enableImplicitConversion: string에서 number, boolean, array 등으로 암시적으로 변환시켜주는 기능
whitelist: payload에서 dto에 없는 속성을 제거시켜주는 옵션
forbidNonWhitelisted: dto에 없는 속성을 제거시켜주는 대신 error를 throw해주는 옵션

- 환경변수 설정

[config-project.module.ts]
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';

@Module({
    imports: [
        ConfigModule.forRoot({
            envFilePath: `.${process.env.NODE_ENV}.env`,
            isGlobal: true,
        }),
    ],
})
export class ConfigProjectModule {}

envFilePath: .env 파일 경로 설정
isGlobal: ConfigModule은 여러 모듈에서 사용해야 하기 때문에 전역으로 설정

[package.json]
...

"start:dev": "cross-env NODE_ENV=development nest start --watch",
"start:pro": "cross-env NODE_ENV=production nest start --watch"

...

node 환경에서 process.env.NODE_ENV로 불러올 수 있도록 pacakge.json을 수정한다.

[main.ts]
...

const configService = app.get(ConfigService);
const port: number = configService.get("PORT");

await app.listen(port);

...

isGlobal로 설정해두었기에 app.get()으로 불러와 사용할 수 있다.

환경변수는 다양한 개발 환경에서 변하는 설정들을 편하게 미리 저장해두고 사용하며, api-key, id, pw 등 민감한 정보를 저장하기 위해서도 사용된다.

참고

https://docs.nestjs.com - NestJS 공식 문서
https://nomadcoders.co/nestjs-fundamentals - 노마드코더 nest 무료 강의

profile
욕심 많은 개발자
post-custom-banner

0개의 댓글