@Module에서 ConfigServcie 사용하기

유지민·2023년 11월 1일
0

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