패키지 설치
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 {}
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",
...
}
}
필수 환경 변수가 제공되지 않았거나 특정 유효성 검사 규칙을 충족하지 않는 경우 애플리케이션 시작 중에 예외를 던지는(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 {}