[Nest.JS] Config 환경 설정 (PostgresSQL)

장현수·2023년 7월 20일
0

Nest.JS

목록 보기
9/9

1. .env 파일 생성 및 환경변수 작성

src/.env

DB_HOST= 'localhost'
DB_PORT= '5432'
DB_USER= 'USERNAME'
DB_PASSWORD= 'PASSWORD'
DB_NAME= 'DATABASE'

2. Config 생성

npm install --save @nestjs/config

@nestjs/config 패키지 설치 후

src/config/orm.config.ts

import { registerAs } from '@nestjs/config';
import { Event } from 'src/events/event.entity';
import { PostgresConnectionOptions } from 'typeorm/driver/postgres/PostgresConnectionOptions';

export default registerAs(
  'orm.config',
  (): PostgresConnectionOptions => ({
    type: 'postgres',
    host: process.env.DB_HOST,
    port: Number(process.env.DB_PORT),
    username: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
    entities: [Event],
    synchronize: true,
  }),
);

src/config/orm.config.prod.ts

import { registerAs } from '@nestjs/config';
import { Event } from 'src/events/event.entity';
import { PostgresConnectionOptions } from 'typeorm/driver/postgres/PostgresConnectionOptions';

export default registerAs(
  'orm.config',
  (): PostgresConnectionOptions => ({
    type: 'postgres',
    host: process.env.DB_HOST,
    port: Number(process.env.DB_PORT),
    username: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
    entities: [Event],
    synchronize: false,
  }),
);
  • 기존 config파일을 복사해 prod config 파일을 만든다.
  • production 버전에는 synchronize 옵션을 false로 한다. synchronize 옵션이 DB를 동기화하는 것이 위험하기 때문이다.

3. Module import

src/app/module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { EventsController } from './events/events.controller';
import { Event } from './events/event.entity';
import { EventsModule } from './events/events.module';
import { AppDummy } from './app.dummy';
import { AppJapanService } from './app.japan.service';
import ormConfig from './config/orm.config';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      load: [ormConfig],
      expandVariables: true,
    }),
    TypeOrmModule.forRootAsync({
      useFactory:
        process.env.NODE_ENV !== 'production' ? ormConfig : ormConfigProd,
    }),
  
  ...
  
})
export class AppModule {}
  • ConfigModule에 isGlobal옵션 값을 true로 주게 되면, 애플리케이션 전체에서 config 환경 변수에 접근할 수 있게 된다.

  • 주의할 점은, .env 환경변수는 isGlobal옵션과 상관 없이 globaly하게 접근 가능하다는 것

  • 위에서 config 폴더 안에 작성한 파일은 load 옵션의 배열 안에 작성해서 import해준다.

  • 그 아래 기존에 작성했던 TypeOrmModule.forRoot() 는 TypeOrmModule.forRootAsync()로 변경하면 이 옵션을 통해 모듈을 비동기식으로 구성할 수 있다.

  • useFactory프로퍼티에 삼항연산자를 통해 개발단계와 배포단계의 환경변수를 경우에 따라 적용하도록 한다.

profile
개같이 발전하자 개발

2개의 댓글

comment-user-thumbnail
2023년 7월 20일

잘 읽었습니다.

답글 달기
comment-user-thumbnail
2023년 7월 20일

잘 보고 갑니다~

답글 달기