nestjs mysql 연결 정보 숨기기(.env)

설탕유령·2022년 11월 15일
0

먼저 구성 패키지는 다음과 같다.
@nestjs/config: nest에서 환경 설정을 효율적으로 하기 위해 제공하는 패키지
cross-env: 동적으로 환경변수를 등록하기 위한 패키지
joi: 변수의 타입, 스키마 등의 유효성 검증을 위한 패키지
typeorm: 객체 관계형 매퍼 라이브러리로 객체와 데이터베이스를 연결해줌

다음 명령어로 필요한 패키지를 다운받도록 하자
npm install --save @nestjs/config @nestjs/typeorm typeorm mysql2 joi cross-env

먼저 package.json에서 구동을 위한 scripts 부분을 수정한다.

// package.json
   "start:dev": "cross-env NODE_ENV=dev nest start --watch",
   "start:debug": "cross-env NODE_ENV=dev nest start --debug --watch",
   "start:prod": "cross-env NODE_ENV=prod node dist/main",

cross-env를 사용해 NODE_ENV 정보를 설정한다.

NODE_ENV에 설정한 dev, prod(이름은 자유롭게 줘도 됨)에 맞춰서
.env파일을 각각 생성한다.
설정한 이름에 맞춰서 네이밍을 줘야하며 예시로 .dev.env와 .prod.env를 생성하고 내용은 다음과 같이 설정하자

// 아래 내역은 본인 mysql 환경에 맞춰서 변경
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USERNAME=user
DB_PASSWD=password
DB_DATABASE=db

생성된 .env는 gitignore에 등록해 잘못 공유되지 않도록 설정한다.

# 아래 내용 추가하기
*.env

이제 등록한 .env 파일을 불러와야 하며, app.module.ts을 설정해보자

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigModule } from '@nestjs/config';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import * as Joi from 'joi';

@Module({
 imports: [
   ConfigModule.forRoot({
     envFilePath: process.env.NODE_ENV == 'dev' ? '.dev.env' : '.prod.env',
     isGlobal: true,
     validationSchema: Joi.object({
       NODE_ENV: Joi.string().valid('dev', 'prod').required(),
       DB_HOST: Joi.string().required(),
       DB_PORT: Joi.string().required(),
       DB_USERNAME: Joi.string().required(),
       DB_PASSWD: Joi.string().required(),
       DB_DATABASE: Joi.string().required(),
     }),
   }),
   TypeOrmModule.forRoot({
     type: 'mysql',
     host: process.env.DB_HOST,
     port: +process.env.DB_PORT,
     username: process.env.DB_USERNAME,
     password: process.env.DB_PASSWD,
     database: process.env.DB_DATABASE,
     entities: [__dirname + '/../**/*.entity.{js.ts}'],
     synchronize: true,
   }),
 ],
 controllers: [AppController],
 providers: [AppService],
})
export class AppModule {}

조금씩 나누어 알아보자

// 설정을 하는데 중요한 모듈은 아래와 같다.
import { TypeOrmModule } from '@nestjs/typeorm'; // DB 연결을 위한 모듈
import { ConfigModule } from '@nestjs/config'; // config 설정을 위한 모듈

ConfigModule은 환경변수 설정을 위해 사용한다.

	ConfigModule.forRoot({
      // 환경 설정을 가져올 경로를 뜻하며, package script에서 설정한 NODE_ENV 내용에 따라 .dev.env를 가져올지, .prod.env를 가져올지 결정
      envFilePath: process.env.NODE_ENV == 'dev' ? '.dev.env' : '.prod.env',
      isGlobal: true,
      // 가져올 환경설정에 대한 유효성 검사 과정
      validationSchema: Joi.object({
        NODE_ENV: Joi.string().valid('dev', 'prod').required(),
        DB_HOST: Joi.string().required(),
        DB_PORT: Joi.string().required(),
        DB_USERNAME: Joi.string().required(),
        DB_PASSWD: Joi.string().required(),
        DB_DATABASE: Joi.string().required(),
      }),
    }),

TypeOrmModule은 실질적으로 mysql과 연결하는데 사용되는 모듈로, 환경변수로 등록된 연결 정보를 참조해서 넣어준다.

    TypeOrmModule.forRoot({
      type: 'mysql',
      // .env 파일에서 명시한 네이밍을 이용해 연결 정보를 가져온다.
      host: process.env.DB_HOST,
      port: +process.env.DB_PORT,
      username: process.env.DB_USERNAME,
      password: process.env.DB_PASSWD,
      database: process.env.DB_DATABASE,
      entities: [__dirname + '/../**/*.entity.{js.ts}'],
      synchronize: true,
    }),
profile
달콤살벌

0개의 댓글