NestJs 설정
포스트
취소

NestJs 설정

소스 코드 안에서 어떠한 코드들은 개발 환경이나 운영 환경 등 환경에 따라서 다르게 코드를 넣어줘야 할 때가 있으며, 남들에게 노출 되지 않아야 하는 코드들도 있습니다. 이러한 코드들을 위해서 설정 파일을 따로 만들어서 보관해줍니다.

설정 파일은 runtime 도중에 바뀌는 것이 아닌 애플리케이션이 시작할 때 로드가 되어서 그 값들을 정의하여 줍니다. 그리고 설정 파일은 여러가지 파일 형식을 사용할 수 있습니다. 예로는 XML, Json, Yaml, Environment Variables 같이 많은 형식을 이용할 수 있습니다.

Codebase vs Environment Variables

XML, Json, Yaml 같은 경우는 Codebase에 해당하며, 다른 방법으로는 Environment Variables 즉, 환경 변수가 있습니다. 비밀번호와 API Key 같은 외부에 노출 되면 안 되는 정보들을 주로 환경 변수를 이용해서 처리해줍니다.

  • Codebase: 일반적으로 Port 같이 노출되도 상관 없는 정보들
  • 환경 변수: 비밀번호나 API Key 같이 노출되면 안 되는 정보들

설정하기 위해서 필요한 모듈

윈도우에서는 기본적으로 Mac, Linux 같은 환경변수를 지원하지 않기 때문에 개발환경에서는 cross-env 모듈을 설치해줍니다.

1
yarn add --dev cross-env

그 다음, config 모듈을 설치해줍니다.

1
yarn add config

Config 모듈을 이용한 설정 파일 생성

루트 디렉토리에 config라는 폴더를 만든 후에 그 폴더 안에 Json이나 Yaml 파일을 생성합니다: config/default.yml, config/development.yml, config/production.yml

  • default.yml: 기본 설정으로, 개발 환경이나 운영 환경 설정에도 적용됩니다.
  • development.yml: default.yml + 개발 환경에서 필요한 정보
  • production.yml: default.yml + 운영 환경에서 필요한 정보

default.yml

1
2
3
4
5
6
7
8
9
10
server:
  port: 3000

db:
  type: "postgres"
  port: 5432
  database: "board-db"

jwt:
  expiresIn: 3600

development.yml

1
2
3
4
5
6
7
8
9
db:
  host: "localhost"
  username: "postgres"
  password: "P@ssw0rd"
  synchronize: true
  logging: true

jwt:
  secret: "secretkey1234dev"

production.yml

1
2
3
4
5
6
7
8
9
db:
  host: "localhost"
  username: "postgres"
  password: "P@ssw0rd"
  synchronize: false
  logging: false

jwt:
  secret: "secretkey1234prod"

설정 파일 코드에 적용하기

main.ts

1
2
3
4
5
6
7
8
9
10
11
12
13
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";
import * as config from "config";

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  const serverConfig = config.get("server");
  const port = serverConfig.port;

  await app.listen(port);
}
bootstrap();

typeorm.config.ts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import { TypeOrmModuleOptions } from "@nestjs/typeorm";
import * as config from "config";

const dbConfig = config.get("db");

export const typeORMConfig: TypeOrmModuleOptions = {
  type: dbConfig.type,
  host: process.env.RDS_HOSTNAME || dbConfig.host,
  port: process.env.RDS_PORT || dbConfig.port,
  username: process.env.RDS_USERNAME || dbConfig.username,
  password: process.env.RDS_PASSWORD || dbConfig.password,
  database: process.env.RDS_DB_NAME || dbConfig.database,
  entities: [__dirname + "/../**/*.entity.{js,ts}"],
  synchronize: dbConfig.synchronize,
  logging: dbConfig.logging
};

환경변수 설정이 있을 경우 환경변수를 사용하고, 없을 경우 config 파일을 참조합니다.

package.json 스크립트 수정

1
2
3
4
5
6
7
8
9
{
  "scripts": {
    "build": "cross-env NODE_ENV=production nest build",
    "start": "cross-env NODE_ENV=development nest start",
    "start:dev": "cross-env NODE_ENV=development nest start --watch",
    "start:debug": "cross-env NODE_ENV=development nest start --debug --watch",
    "start:prod": "cross-env NODE_ENV=production node dist/main"
  }
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.