NestJS에서 DATABASE CONFIGURATION

LeeJaeHoon·2021년 12월 4일
0
post-thumbnail

데이터베이스 연결하기

패키지 설치

postgres를 연결하기위해 pg설치

mysql사용시에는 mysql설치

npm install --save @nestjs/typeorm typeorm pg

app.module.ts

설치 프로세스가 완료되면 TypeOrmModule을 루트 AppModule로 가져올 수 있습니다

import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { TypeOrmModule } from '@nestjs/typeorm';
import { RestaurantsModule } from './restaurants/restaurants.module';

@Module({
  imports: [
    RestaurantsModule,
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: 'localhost',
      port: 5432, //postgres기본 포트가 5432이다.
      username: 'your username', //postgres유저명을 적어준다.
      password: 'your password', //만든 데이터베이스의 비번을 적어준다
      database: 'databaseName', //만든 데이터베이스 이름을 적어준다.
      synchronize: true, //데이터베이스를 너의 모듈의 현재 상태로 마이크래이션한다는 뜻
      logging: true, 
    }),
    GraphQLModule.forRoot({
      autoSchemaFile: true, //메모리에 저장
    }),
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}

데이터베이스 설정 부분 .env를 이용해 숨기기

Installation

npm i --save @nestjs/config

app.module.ts

설치 프로세스가 완료되면 ConfigModule을 가져올 수 있습니다. 일반적으로 루트 AppModule로 가져오고 .forRoot() 정적 메서드를 사용하여 동작을 제어합니다

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { GraphQLModule } from '@nestjs/graphql';
import { TypeOrmModule } from '@nestjs/typeorm';
import { RestaurantsModule } from './restaurants/restaurants.module';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,//우리 어플리케이션의 어디서나 config 모듈에 접근할 수 있다는 것
			//process.env.NODE_ENV === 'dev'일때 .env.dev파일을 사용하겠다는 뜻 
      envFilePath: process.env.NODE_ENV === 'dev' ? '.env.dev' : '.env.test',
      ignoreEnvFile: process.env.NODE_ENV === 'prod',
			//서버에 deply 할 때 환경변수 파일을 사용하지 않는다는 것
    }),
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: process.env.DB_HOST,
      port: +process.env.DB_PROT, //.env는 기본적으로 string이므로 number로 바꿔줘야한다.
      username: process.env.DB_USERNAME,
      password: process.env.DB_PASSWORD,
      database: process.env.DB_NAME,
      synchronize: true, //데이터베이스를 너의 모듈의 현재 상태로 마이크래이션한다는 뜻
      logging: true,
    }),
    GraphQLModule.forRoot({
      autoSchemaFile: true, //메모리에 저장
    }),
    RestaurantsModule,
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}

cross-env

cross-env는 운영체제나 플랫폼에 종속되지 않고 동일한 방법으로 env 변수를 주입하는 방법입니다.

process.env.NODE_ENV를 사용하기위해 cross-env를 설치 해야 합니다

npm i cross-env

사용

cross-env NODE_ENV=dev로 해주면 start:dev를 했을때 process.env.NODE_ENV은 dev가 됩니다.

{
  "scripts": {
    ...
		"start": "cross-env NODE_ENV=prod nest start",
    "start:dev": "cross-env NODE_ENV=dev nest start --watch",
    ...
  }
}

Schema validation

필수 환경 변수가 제공되지 않았거나 특정 유효성 검사 규칙을 충족하지 않는 경우 애플리케이션 시작 중에 예외를 던지는(throw) 것이 표준 관행입니다.

Joi

Joi내장 검사기. Joi를 사용하여 객체 스키마를 정의하고 이에 대해 JavaScript 객체의 유효성을 검사합니다.

npm i joi

이제 Joi 유효성 검사 스키마를 정의하고 아래와 같이 forRoot() 메서드의 옵션 객체의 validationSchema 속성을 통해 전달할 수 있습니다.

import { Module } from '@nestjs/common';
import * as Joi from 'joi';
import { ConfigModule } from '@nestjs/config';
import { GraphQLModule } from '@nestjs/graphql';
import { TypeOrmModule } from '@nestjs/typeorm';
import { RestaurantsModule } from './restaurants/restaurants.module';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true, //우리 어플리케이션의 어디서나 config 모듈에 접근할 수 있다는 것
      envFilePath: process.env.NODE_ENV === 'dev' ? '.env.dev' : '.env.test',
      ignoreEnvFile: process.env.NODE_ENV === 'prod', //서버에 deply 할 때 환경변수 파일을 사용하지 않는다는 것
      validationSchema: Joi.object({
        NODE_ENV: Joi.string().valid('dev', 'prod').required(),
        DB_HOST: Joi.string().required(),
        DB_PROT: Joi.string().required(),
        DB_USERNAME: Joi.string().required(),
        DB_PASSWORD: Joi.string().required(),
        DB_NAME: Joi.string().required(),
      }),
    }),
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: process.env.DB_HOST,
      port: +process.env.DB_PROT,
      username: process.env.DB_USERNAME,
      password: process.env.DB_PASSWORD,
      database: process.env.DB_NAME,
      synchronize: true, //데이터베이스를 너의 모듈의 현재 상태로 마이크래이션한다는 뜻
      logging: true,
    }),
    GraphQLModule.forRoot({
      autoSchemaFile: true, //메모리에 저장
    }),
    RestaurantsModule,
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}

0개의 댓글