@Module에서 ConfigServcie 사용하기

유지민·2023년 11월 1일

이번에 진행하는 맛집 프로젝트는 기존 프로젝트와 다르게 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

profile
개발 취준생

0개의 댓글