환경 변수, 파일을 사용하는 이유
- 프로젝트에서 공통적으로 사용하는 변수들을 파일을 통해 쉽게 관리할 수 있다
- 코드에 secret key 값을 노출시키지 않기 때문에 보안 상 이점이 있다
- 운영(prod), 개발(dev), 로컬(local) 환경에 맞는 다른 변수를 사용할 수 있다
패키지 설치
$ npm i @nestjs/config
src/app.module.ts
import { ConfigModule } from '@nestjs/config';
...
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
cache: true
}),
....]
...
루트 모듈의 설정을 통해 환경 변수에 접근할 수 있도록 할 수 있다
isGlobal: true 속성을 통해 다른 모듈에서 사용할 수 있도록 설정하였고, cache: true 속성을 통해 한 번 읽은 환경 변수의 값을 캐싱하여 읽기 속도를 향상 시킬 수 있다
위 설정만으로 .env 파일에 선언된 속성을 바로 사용할 수 있다
프로젝트 루트 경로/.env
NODE_ENV=DEV
SERVER_PORT=3000
main.ts
...
const SERVER_PORT = process.env.SERVER_PORT
async function bootstrap() {
...
await app.listen(SERVER_PORT);
}
bootstrap();
개발 환경에 따른 환경 변수 사용 방법
.env
NODE_ENV=DEV
src/config/dev.yaml 또는 prod.yaml
SERVER:
PORT: 3000
DB:
MYSQL:
HOST: 127.0.0.1
USER: root
PASSWORD: root
PORT: 3306
src/config/config.ts
import { readFileSync } from 'fs'
import * as yaml from 'js-yaml'
import { join } from 'path'
const YAML_CONFIG_PROD = 'prod.yaml'
const YAML_CONFIG_DEV = 'dev.yaml'
export default () => {
return yaml.load(
process.env.NODE_ENV === 'DEV' ?
readFileSync(join(__dirname, YAML_CONFIG_DEV), 'utf8') :
readFileSync(join(__dirname, YAML_CONFIG_PROD), 'utf8')
) as Record<string, any>
}
src/app.module.ts
...
import config from './config/config';
@Module({
imports: [ConfigModule.forRoot({
isGlobal: true,
cache: true,
load: [config]
})],
...
})
src/main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ConfigService } from '@nestjs/config';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const configService = app.get(ConfigService);
const SERVER_PORT = configService.get<string>('SERVER.PORT');
await app.listen(SERVER_PORT);
}
bootstrap();
$ npm run start:dev
서버 실행
패키지 설치
$ npm i cpx
package.json
...
"scripts": {
"copy-files": "cpx \"src/config/*.yaml\" dist/config/",
...
"start": "npm run copy-files && nest start",
"start:dev": "npm run copy-files && nest start --watch",
"start:debug": "npm run copy-files && nest start --debug --watch",
"start:prod": "npm run copy-files && node dist/main",
...
},
...
컴파일 시에 dist/config 경로에 src/config/*.yaml 파일이 위치할 수 있도록 복사해준다
nest-cli.json
{
"$schema": "https://json.schemastore.org/nest-cli",
"collection": "@nestjs/schematics",
"sourceRoot": "src",
"compilerOptions": {
"deleteOutDir": false
}
}
package.json - scripts 수정 후 실행해도 똑같은 오류가 발생한다. 파일이 복사되지만 바로 파일이 삭제되기 때문이다
deleteOutDir 속성 값을 true → false 로 변경해 준다
참고 링크
https://codegear.tistory.com/82
'JavaScript > NestJS' 카테고리의 다른 글
[NestJS] Swagger 적용하기 (0) | 2023.08.21 |
---|---|
[NestJS] TypeORM CRUD 생성하기 (User) (0) | 2023.08.21 |
[NestJS] Logging 하기 (0) | 2023.08.19 |
[NestJS] Jest 테스트하기 (0) | 2023.08.17 |
[NestJS] 경로 alias 설정하기 (0) | 2023.08.17 |