본문 바로가기
NestJS

[NestJS] process.env 사용 및 분기처리

by Programmer.Junny 2025. 4. 5.

.env 에 작성된 값들을 사용하는 것과 여러 .env를 만들어 동적으로 적용하도록 해야 각종 테스트 환경에서 편하게 작업을 진행할 수 있다.

1. cross-env 설치

npm i cross-env

다양한 OS 환경에서 경로에 대한 동적 호출을 하기 위해선 cross-env 패키지를 설치하여야 한다.

2. gitignore 설정

**/*.env

어느 경로에서든 .env 파일들은 무시되도록 설정한다.

3. .env 파일 작성

JWT_SECRET=jwtsecret
HASH_ROUNDS=10
PROTOCOL=http
HOST=localhost:3000

DB_HOST=localhost
DB_PORT=5432
DB_USERNAME=postgres
DB_PASSWORD=postgres
DB_DATABASE=postgres

SWAGGER_USER=junny
SWAGGER_PASSWORD=junny5432

여러 .env를 만들어 다양한 환경으로 테스트할 수 있도록 한다.

4. config.ts 파일 작성 (registerAs)

import { registerAs } from '@nestjs/config';

export default registerAs('app', () => ({
    jwt: {
        secretKey: process.env.JWT_SECRET,
    },
    encrypt: {
        hash_Rounds: process.env.HASH_ROUNDS,
    },
    http: {
        protocol: process.env.PROTOCOL,
        host: process.env.HOST,
    },
    swagger: {
        user: process.env.SWAGGER_USER,
        password: process.env.SWAGGER_PASSWORD,
    },
}));

@nestjs/config의 registerAs 를 통해 .env의 값을 동적으로 가져올 수 있다.

5. app.module.ts 수정

5.1. ConfigModule.forRoot 에 config.ts 등록

    ConfigModule.forRoot({
      isGlobal: true, // 전체적으로 사용하기 위해
      envFilePath: `src/configs/env/.${process.env.NODE_ENV}.env`,
      load: [appConfig, dbConfig],
    }),

app.module.tsConfigModule.forRoot 부분을 위와 같이 수정한다.

isGlobal은 어느 위치의 코드에서 사용할 수 있도록 하는 옵션이며,

envFilePath는 해당 위치의 .env 파일들의 위치를 등록하며,

load는 호출할 Config 파일들을 의미한다.

5.2. TypeOrmModule.forRoot를 TypeOrmModule.forRootAsync로 변경

// TypeOrmModule을 ConfigService를 통해 동적으로 설정합니다.
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: (configService: ConfigService) => {
        return {
          type: '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>('db.database'),
          entities: [
            PostsModel,
            UsersModel,
            ImageModel,
            ChatsModel,
            MessagesModel,
            CommentsModel,
            UserFollowersModel,
          ],
          synchronize: true,
        };
      },
    }),

기존 TypeOrmModule.forRoot로 호출하던 부분을 TypeOrmModule.forRootAsync로 변경하는 이유는 ConfigService를 호출하여 config.ts 내의 값들을 불러와(.env) DB에 값들을 설정하기 위함이다.

6. ConfigType 을 주입하여 사용하기

@Injectable()
export class AuthService {
    constructor(
        @Inject(appConfig.KEY)
        private readonly config: ConfigType<typeof appConfig>
    ) {}

서비스에서 해당 .env의 값을 사용하려면 위와 같이 생성자에서 ConfigType을 주입한다.

secret: this.config.jwt.secretKey,

사용은 위와 같이 호출하면 된다.

장점은 직접 타이핑할 필요없이 위와 같이 자동완성이 되어 타입 안정성을 높인다.

7. package.json을 수정하여 분기처리

"scripts": {
    "start:local": "cross-env NODE_ENV=local nest start --watch",
  	"start:dev": "cross-env NODE_ENV=dev nest start --watch",

우리는 앞서 .local.env.dev.env 등 다양한 테스트 환경을 위한 .env 파일을 생성하였는데, 이를 적용하기 위해선 package.json에서 실행별 분기처리를 하면 된다.

만약 npm run start:dev 로 실행한다면 NODE_ENVdev로 호출되고, envFilePath 의 경로가 .dev.env가 되어 처리한다.

'NestJS' 카테고리의 다른 글

[NestJS] Google Oauth2.0 Passport  (0) 2025.04.12
[NestJS] Swagger 사용법  (1) 2025.04.07
[NestJS] Authorization Guard  (0) 2025.03.14
[NestJS] RBAC (Role Base Access Controll)  (0) 2025.03.13
[NestJS] 모듈 네스팅  (0) 2025.03.12

최근댓글

최근글

skin by © 2024 ttuttak