본문으로 건너뛰기

버그 제보

이상한 점을 알려 주시면 고칠게요. 지금 보고 있는 페이지와 브라우저 정보가 함께 담겨요.

페이지:

Backend

NestJS 설정과 환경 변수

작성 2026. 10. 13.추가
목차2개 항목

DB 접속 주소, JWT 비밀키, 포트처럼 환경마다 다르거나 노출되면 안 되는 값은 코드에 직접 쓰지 않고 환경 변수로 분리한다. 실수로 비밀번호가 포함된 접속 문자열을 커밋하는 사고를 막는 가장 기본적인 방법이다.

.env와 ConfigModule

npm i @nestjs/config
# .env (반드시 .gitignore에 추가)
MODE=dev
PORT=8000
MONGODB_URI=mongodb+srv://<user>:<password>@<cluster-host>/<db>?retryWrites=true&w=majority
JWT_SECRET=<임의의 긴 문자열>
SWAGGER_USER=<id>
SWAGGER_PASSWORD=<password>
// app.module.ts
import { ConfigModule } from '@nestjs/config';
import { MongooseModule } from '@nestjs/mongoose';
 
@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true }), // .env를 읽어 process.env에 로드
    MongooseModule.forRoot(process.env.MONGODB_URI),
    CatsModule,
  ],
})
export class AppModule {}
// main.ts
const PORT = process.env.PORT || 8000;
await app.listen(PORT);
  • isGlobal: true를 주면 모든 모듈에서 따로 import하지 않고 ConfigService를 주입받을 수 있다.
  • 로드 순서 주의: 데코레이터 안의 process.env.X는 모듈 파일이 import되는 시점에 평가된다. ConfigModule.forRoot()가 아직 실행되지 않았다면 undefined가 된다. 모듈마다 ConfigModule.forRoot()를 다시 부르는 임시방편도 있지만, 권장 방식은 forRootAsync/registerAsync로 ConfigService를 주입받는 것이다.
// 권장: 설정이 로드된 뒤에 값을 읽도록 비동기 등록
MongooseModule.forRootAsync({
  inject: [ConfigService],
  useFactory: (config: ConfigService) => ({
    uri: config.get<string>('MONGODB_URI'),
  }),
}),

MongoDB 연결 준비(패키지 설치, Atlas 접속 문자열, 디버그 로그)는 Mongoose 스키마 노트에 있다.

핵심 정리

  • 비밀 값은 .env에 두고 .gitignore로 커밋을 막는다.
  • ConfigModule.forRoot({ isGlobal: true })로 한 번만 로드하고, 다른 모듈 설정은 *Async + ConfigService로 읽는 것이 안전하다.

댓글

GitHub 계정으로 댓글을 남길 수 있어요.