- 설치 + 환경변수 검수용 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
'코딩 > 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 |