먼저 구성 패키지는 다음과 같다.
@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,
}),