.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.ts의 ConfigModule.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_ENV가 dev로 호출되고, 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 |