기존에는 ormconfig.json 파일에 DB의 정보를 기입해 뒀습니다. 하지만 이번에는 이것을 Nestjs의 Config를 이용하여 환경변수를 설정해 보도록 하겠습니다. 이렇게 외부로 환경변수를 빼두면 깃과 같은 저장소에 커밋하지 않기가 쉽습니다.
$ npm i @nestjs/config
.env에는 DB의 접속정보를 넣어두고 관리합니다.
/.env
DATABASE_USER=root
DATABASE_PASSWORD=qwer1234@
DATABASE_PORT=3306
DATABASE_HOST=localhost
DATABASE_NAME=test
DB의 유저 이름
DB의 비밀번호
DB의 포트
DB의 ip주소
DB의 스키마 이름
Database Module 생성하여 app과 DB간의 연결을 정의합니다.
기능적으로 완전히 다른 부분이기 때문에 분리하여 만들었습니다.
$ nest g mo database
/src/database/database.module.ts
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { join } from 'path';
@Module({
imports: [
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (configService: ConfigService) => ({
type: 'mysql',
host: configService.get('DATABASE_HOST'),
port: configService.get('DATABASE_PORT'),
username: configService.get('DATABASE_USER'),
password: configService.get('DATABASE_PASSWORD'),
database: configService.get('DATABASE_NAME'),
entities: [join(__dirname, '/../**/*.entity.js')],
synchronize: true,
}),
}),
],
})
export class DatabaseModule {}
작성한 database module을 app module에서 사용해 줘서 연동 처리를 완료해 줍니다. 과정에서 Joi 패키지를 이용하여 환경변수 데이터에 대한 검증을 합니다.
$ npm i @hapi/joi @types/hapi__joi
/src/app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UsersModule } from './users/users.module';
import { AuthModule } from './auth/auth.module';
import { APP_GUARD } from '@nestjs/core';
import { JwtAuthGuard } from './auth/guards/jwt-auth.guard';
import { ConfigModule } from '@nestjs/config';
import { DatabaseModule } from './database/database.module';
import * as Joi from '@hapi/joi';
@Module({
imports: [
ConfigModule.forRoot({
validationSchema: Joi.object({
DATABASE_HOST: Joi.string().required(),
DATABASE_PORT: Joi.number().required(),
DATABASE_USER: Joi.string().required(),
DATABASE_PASSWORD: Joi.string().required(),
DATABASE_NAME: Joi.string().required(),
}),
}),
UsersModule,
AuthModule,
DatabaseModule,
],
controllers: [AppController],
providers: [AppService, { provide: APP_GUARD, useClass: JwtAuthGuard }],
})
export class AppModule {}
이제 DB 테이블을 삭제후 다시 앱을 실행시켜 정상작동 되는지 확인합니다.
다음 포스트에서 수정될 사항