[NestJS] 설정

soyeon·2023년 4월 18일

Nest

목록 보기
10/10
post-thumbnail

설정(Configuration)이란?
소스 코드 안에서 어떤 코드들은 개발 환경이나 운영 환경에 따라 다르거나 남들에게 노출되지 않아야한다. 이런 코드들을 위해서 설정 파일을 따로 만들어서 보관한다.

설정 파일은 애플리케이션이 시작할때 로드되어서 그 값을 정의한다.
그리고 설정 파일은 여러가지 파일 형식을 사용할 수 있다.(xml, json, enviroment variables...)

파일 형식 중에 xml, json, yaml 같은 경우는 Codebase에 해당하며 다른 방법은 환경변수(enviroment variables)라 할 수 있다. 주로 이 둘을 나누는 이유는 비밀번호나 API Key 같은 노출이 되면 안되는 정보들을 주로 환경변수를 이용해서 처리한다.

필요한 모듈
윈도우라면 win-node-env를 설치해야한다.(윈도우에서는 기본적으로 환경변수를 지원하지 않는다.)
npm i -g win-node-env

공통적으로 npm i config 를 통해 config 모듈을 설치하자.

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

  1. 루트 디렉토리에 config 라는 폴더를 만든 후에 그 폴더 안에 json이나 yaml 형식의 파일을 생성

  2. config 폴더 안에 default.yaml(기본 환경), development.yaml(개발 환경), production.yaml(운영 환경) 파일을 생성

// default.yaml
// 기본 설정 (개발 환경 설정이나 운영 환경 설정에도 적용됨)
server:
  port: 3000

db:
  type: 'mysql'
  port: 3306
  database: 'board-app'

jwt:
  expiresIn: 3600
// development.yaml
// default.yaml + 개발 환경에서 필요한 정보
db:
  host: 'localhost'
  username: 'username'
  password: '1234'
  synchronize: true

jwt:
  secret: 'secret'
// production.yaml
// default.yaml + 운영 환경에서 필요한 정보
db:
  synchronize: false // DB 초기화 방지..
  1. config 폴더 안에 저장된 내용 사용하기
    어느 파일에서든지 config 모듈을 import 해서 사용이 가능
    import * as config from 'config';

다음과 같이 사용 가능

// main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { Logger } from '@nestjs/common';
import * as config from 'config'; // import

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const serverConfig = config.get('server'); // 파일에서 server 를 찾는다.
  const port = serverConfig.port; // 이와 같이 접근 가능
  await app.listen(port);
  Logger.log(`Application running in port ${port}`);
}
bootstrap();
// typeorm.config.ts
// 환경에 따라 변수가 다른 경우
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: true,
};

마지막으로 이렇게 열심히 설정해주고 노출되면 안되도록 숨겼는데 git에 올리면 말짱 도루묵이니 .gitignore 파일에 /config 를 추가해서 config 파일이 올라가지않도록 설정해주자!

profile
사부작 사부작

0개의 댓글