이번에 진행하는 맛집 프로젝트는 기존 프로젝트와 다르게 yaml 파일을 사용하지않고 ConfigModule을 사용해 .env 파일에서 환경변수를 사용하게 되었다. app.module.ts에 미리 세팅해주신 덕분에 가져다 사용하기만하면 되고 isGlobal: true, 설정이 되어있어서 다른 모듈에서도 별도의 설정없이 환경변수 사용이 가능했다.
service나 controller에서 사용하려면 ConfigService를 임포트 해오고 생성자에 주입해주기만하면
import { ConfigService } from '@nestjs/config'
export class UserController {
constructor(private configService: ConfigService) {}
...
configService.get<string>('.env의 값...')
}
이런식으로 간단히 사용할 수 있는데 문제는 module.ts 파일에서 사용하는 방법을 감을 잡지 못했다.
구글링해봐도 useFactory
를 사용해 동적으로 모듈을 만들라고 하는데 이해를 하지 못했다.
찾아보니 모듈은 정적으로 만들어지고 configModule은 정적이다. controller나 service처럼, Module들로 인해 모든 application이 만들어진 다음에야 configModule을 사용할 수 있다는 것이다. module의 생성 시점에는 configModule을 사용할 수 없다… 라고 한다.
그래서 비동기적으로 모듈을 설정해야하고 또 useFactory를 통해 모듈을 동적으로 설정해야한다.
import { Module } from '@nestjs/common'
import { AuthService } from './auth.service'
import { AuthController } from './auth.controller'
import { JwtModule } from '@nestjs/jwt'
import { PassportModule } from '@nestjs/passport'
import { JwtStrategy } from './jwt.strategy'
import { UserRepository } from 'src/user/user.repository'
import { TypeOrmExModule } from 'src/common/decorator/typeoprm-ex.module'
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmExModule.forCustomRepository([UserRepository]),
JwtModule.register({
secret: process.env.JWT_SECRET
signOptions: {
expiresIn: process.env.EXPIRSEIN,
},
}),
],
controllers: [AuthController],
providers: [AuthService, JwtStrategy],
})
export class AuthModule {}
기존 코드는 .env 값을 읽어오지 못한다.
import { Module } from '@nestjs/common'
import { AuthService } from './auth.service'
import { AuthController } from './auth.controller'
import { JwtModule } from '@nestjs/jwt'
import { PassportModule } from '@nestjs/passport'
import { JwtStrategy } from './jwt.strategy'
import { UserRepository } from 'src/user/user.repository'
import { TypeOrmExModule } from 'src/common/decorator/typeoprm-ex.module'
import { ConfigService } from '@nestjs/config'
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
TypeOrmExModule.forCustomRepository([UserRepository]),
JwtModule.registerAsync({ // 비동기적으로 JWT 모듈을 설정
useFactory: (configService: ConfigService) => ({
secret: configService.get<string>('JWT_SECRET'),
expiresIn: Number(configService.get<string>('JWT_EXPORESIN')),
}),
inject: [ConfigService],
}),
],
controllers: [AuthController],
providers: [AuthService, JwtStrategy],
})
export class AuthModule {}
JwtModule.registerAsync
함수는 비동기적으로 JWT 모듈을 설정하는 데 사용. 이 함수를 사용하면 설정을 동적으로 로드하고 생성할 수 있으므로 설정이 변경될 때 애플리케이션을 다시 시작하지 않고도 적용할 수 있다고 한다. 이 함수는 useFactory
를 통해 설정을 동적으로 생성하는 방법을 제공하며, 필요한 외부 의존성을 주입하여 설정을 구성할 수 있고. 이렇게 하면 설정 파일, 환경 변수 또는 외부 서비스에서 설정을 가져와 사용할 수 있다.
참고
https://velog.io/@kakasoo/Nest%EC%97%90%EC%84%9C-ConfigModule-TypeORM-%EC%93%B0%EA%B8%B0