기존에는 데이터베이스와 관련된 부분을 그냥 코드로 작성했었다.
이런 부분을 당연히 그대로 git에 올리면 안되기 때문에 환경변수로 만들어서 주입해야 한다.
우선 환경변수를 .env 파일로부터 가져오기 위해 다음 의존성들을 추가해준다.
그리고는 .env.{환경}으로 환경변수를 저장할 파일을 만들어준다.
당연히 올리면 안되기에 gitignore에 추가해준다.
그리고 데이터베이스는 같게 하더라도 스키마는 다르게 해주었다.
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=1204
DB_DATABASE=usedCars_dev
.env.development
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=1204
DB_DATABASE=usedCars_test
.env.test
테스트에서 다른 데이터베이스를 사용하기 위해 구별해주었다.
이제 app.module.ts로 가서 해당 환경변수들을 주입해줘야 한다.
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
envFilePath: `.env.${process.env.NODE_ENV}`
})
]
})
export class AppModule {}
우선 ConfigModule.forRoot()로 환경변수를 읽어올 파일을 지정해준다.
여기에서 .env의 뒷 부분을 모듈 런타임의 환경변수로 지정해서 development, test를 구별해주었다.
그 다음에는 기존에 사용하던 TypeOrmModule을 수정해줘야 한다.
forRoot가 아니라 forRootAsync로 가져와야 한다.
forRoot는 정적이거나 process.env로 접근할 때 사용하며
forRootAsync는 동적으로 config 파일을 가져올 때 사용한다고 한다.
TypeOrmModule.forRootAsync({
inject: [ConfigService],
useFactory: (config: ConfigService) => {
return {
type: "mysql",
host: config.get<string>('DB_HOST'),
port: config.get<number>('DB_PORT'),
username: config.get<string>('DB_USERNAME'),
password: config.get<string>('DB_PASSWORD'),
database: config.get<string>('DB_DATABASE'),
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true
}
}
}),
inject를 통해서 환경변수를 가져올 서비스를 지정해준다.
이제는 해당 환경에 대한 정보를 서버 시작 전에 넘겨줘야 한다.
이 쪽 부분에 해당하는 내용을 말이다.
현재 npm을 통해서 서버를 실행하고 있으니
package.json의 이쪽 부분을 수정해주면 된다.
우리는 런타임 환경을 부여하기 위해 cross-env 라이브러리를 설치했었다.
우리는 NODE_ENV를 줘야 하기에 NODE_ENV={원하는 값}을 주입해준다.
한 번 실행해서 원하는 데이터베이스에 값이 생기는지 확인해보자.
이렇게 설정하고 create-user.http를 실행하니 데이터베이스에 값이 원하는대로 들어가는 것을 볼 수 있었다.
'Node > Nest' 카테고리의 다른 글
Nest에서 Entity간 관계 설정해주기 (1) | 2025.07.14 |
---|---|
Nest에서 세션으로 사용자 정보 가져오기 (0) | 2025.07.12 |
Nest에서 세션 사용하기 (0) | 2025.07.10 |
Nest에서 사용자 로그인 검사하기 (0) | 2025.07.10 |
Nest에서 비밀번호 암호화해서 보관하기 (4) | 2025.07.10 |