728x90

- 설치 + 환경변수 검수용 joi

yarn add @nestjs/config joi

 

 

- import

ConfigModule.forRoot(),

 

- 환경변수 위치를 지정하거나, 다른 모듈에서도 사용할 수 있도록 글로벌 설정할 경우

// app.module.ts

ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: './env/.dev.env',
    }),

- DB 설정

- 일반

// app.module.ts

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
    }),
    TypeOrmModule.forRoot({
      type: process.env.DB_TYPE as 'postgres',
      host: process.env.DB_HOST,
      port: Number(process.env.DB_PORT),
      username: process.env.DB_USERNAME,
      password: process.env.DB_PASSWORD,
      database: process.env.DATABASE,
      entities: [],
      synchronize: true,
    }),
  ],
  controllers: [],
  providers: [],
})
autoLoadEntities: true, // TypeORM이 forFeature()나 forRoot() 등의 메서드로 등록된 모든 엔티티를 자동으로 로드
synchronize: true, // 스키마 동기화
logging: false, // 쿼리 실행 내역 터미널에 띄움

 

- async 처리해서 ConfigModule 사용

// app.module.ts

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
    }),
    TypeOrmModule.forRootAsync({
      useFactory: (configService: ConfigService) => ({
        type: configService.get<string>('DB_TYPE') as 'postgres',
        host: configService.get<string>('DB_HOST'),
        port: configService.get<number>('DB_PORT'),
        username: configService.get<string>('DB_USERNAME'),
        password: configService.get<string>('DB_PASSWORD'),
        database: configService.get<string>('DATABASE'),
        entities: [],
        synchronize: true,
      }),
      inject: [ConfigService],
    }),
  ],
  controllers: [],
  providers: [],
})

 

- 따로 뺴기

// database.config.ts

export const databaseConfig = {
  useFactory: (configService: ConfigService): TypeOrmModuleOptions => {
    return {
      type: configService.get<string>('DB_TYPE') as 'postgres',
      host: configService.get<string>('DB_HOST'),
      port: configService.get<number>('DB_PORT'),
      username: configService.get<string>('DB_USERNAME'),
      password: configService.get<string>('DB_PASSWORD'),
      database: configService.get<string>('DATABASE'),
      entities: [],
      synchronize: true,
    };
  },
  inject: [ConfigService],
};
// app.module.ts

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
    }),
    TypeOrmModule.forRootAsync(databaseConfig),
  ],
  controllers: [],
  providers: [],
})

- 환경변수 검증 joi 사용

(password는 형식이 노출될 수 있으니 required만 하는게 좋을듯)

// app.module.ts

// import 이렇게 해줘야함
import * as Joi from 'joi';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      validationSchema: Joi.object({
        ENV: Joi.valid('dev', 'prod').required(),
        DB_TYPE: Joi.string().valid('postgres').required(),
        DB_HOST: Joi.string().required(),
        DB_PORT: Joi.number().required(),
        DB_USERNAME: Joi.string().required(),
        DB_PASSWORD: Joi.string().required(),
        DATABASE: Joi.string().required(),
      }),
    }),
    TypeOrmModule.forRootAsync(databaseConfig),
  ],
  controllers: [],
  providers: [],
})

 

- 따로 뺴기 (코드도 조금 수정함)

// validation.schema.ts

import * as Joi from 'joi';

const requiredString = Joi.string().required();
const requiredNumber = Joi.number().required();

export const validationSchema = Joi.object({
  ENV: Joi.valid('dev', 'prod').required(),
  DB_TYPE: Joi.string().valid('postgres').required(),
  DB_HOST: requiredString,
  DB_PORT: requiredNumber,
  DB_USERNAME: requiredString,
  DB_PASSWORD: Joi.required(),
  DATABASE: requiredString,
});
// app.module.ts

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      validationSchema: validationSchema,
    }),
    TypeOrmModule.forRootAsync(databaseConfig),
  ],
  controllers: [],
  providers: [],
})

++ 환경변수 오타 줄이기 위해 enum 처리

// env.enum.ts

export enum envKeys {
  env = 'ENV',
  dbType = 'DB_TYPE',
  dbHost = 'DB_HOST',
  dbPort = 'DB_PORT',
  dbUsername = 'DB_USERNAME',
  dbPassword = 'DB_PASSWORD',
  dbDatabase = 'DATABASE',
  hasRounds = 'HASH_ROUNDS',
  accessTokenSecret = 'ACCESS_TOKEN_SECRET',
  refreshTokenSecret = 'REFRESH_TOKEN_SECRET',
}

따로 파일 만들던가, Joi 파일에 추가하면 될듯.

강의에서는 const로 일일이 만들고 객체화함.

 

// database.config.ts

export const databaseConfig = {
  useFactory: (configService: ConfigService): TypeOrmModuleOptions => {
    return {
      type: configService.get<string>(envKeys.dbType) as 'postgres',
      host: configService.get<string>(envKeys.dbHost),
      port: configService.get<number>(envKeys.dbPort),
      username: configService.get<string>(envKeys.dbUsername),
      password: configService.get<string>(envKeys.dbPassword),
      database: configService.get<string>(envKeys.dbDatabase),
      entities: [Movie, MovieDetail, Director, Genre, User],
      synchronize: true,
    };
  },
  inject: [ConfigService],
};

적용된 모습

 


https://docs.nestjs.com/techniques/configuration#custom-env-file-path

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com

 

 

Ch 2. TypeORM 기본기 - 02. DataSource 정의하고 환경변수 사용해보기

Ch 2. TypeORM 기본기 - 03. Joi로 환경변수 검증하고 비동기로 DataSource 생성하기

 

https://fastcampus.co.kr/classroom/239666

 

커리어 성장을 위한 최고의 실무교육 아카데미 | 패스트캠퍼스

성인 교육 서비스 기업, 패스트캠퍼스는 개인과 조직의 실질적인 '업(業)'의 성장을 돕고자 모든 종류의 교육 콘텐츠 서비스를 제공하는 대한민국 No. 1 교육 서비스 회사입니다.

fastcampus.co.kr

 

 

728x90

'코딩 > Nest.js' 카테고리의 다른 글

Mapped Type  (0) 2024.10.22
Pipe  (2) 2024.10.22
Class Transformer  (0) 2024.10.21
Class Validator & DTO(Data Transfer Object)  (0) 2024.10.20
커스텀 데코레이터  (1) 2024.10.20

+ Recent posts