Nest.js Module

Module 이란

Nest.js에서는 Module은 하나의 애플리케이션을 담당을 하고 있다고 볼 수 있습니다. MSA(Micro Service Architeture)가 인기있는 요즘 이러한 Module을 기준으로 구분하여 분리 할 수 있도록 의존성을 구분하면 좀 더 관리가 용이한 서비스가 나올 것입니다. 그렇다면 이러한 Module의 구성은 어떻게 되는지 알아보도록 하겠습니다. 

 

구성

Module은 데코레이터를 통해 정의 할 수 있습니다. 그리고 설정 되는 값은 크게 아래 4개로 나뉘어 집니다.

  • Controllers: 요청을 처리하고 응답을 반환하는 로직을 담당합니다.
  • Providers: 다양한 형태의 서비스, 리포지토리, 팩토리 등을 포함하며, 이들은 주입을 통해 컨트롤러나 다른 프로바이더에 사용됩니다.
  • Imports: 다른 모듈에서 제공하는 프로바이더나 컴포넌트를 현재 모듈에서 사용하기 위해 임포트합니다.
  • Exports: 모듈이 제공하는 프로바이더를 외부에 공개하여 다른 모듈에서 사용할 수 있도록 합니다.
@Module({
  imports: [TypeOrmModule.forFeature([User])],
  exports: [UserService],
  controllers: [UserController],
  providers: [UserService],
})
export class UserModule {}

 

환경 변수 동적 할당

이러한 Module에 의존성을 주입할 때는 리터럴(literal)을 하드 코딩하는 것이 아닌 환경변수로 값들을 제공하고 사용해야 합니다. 환경변수 중에서는 인증관련된 내용, DB 관련된 내용, 서버에 관련된 내용 등 다양한 카테고리들이 존재하게 됩니다. 여러가지 종류의 변수를 하나의 환경변수 파일로 제공하게 되면 관리에 어려움이 존재 할 수 있습니다. 그렇기에 이러한 값들을 분리하고 동적으로 할당하는 방식을 nest.js에서 제공하고 있습니다. 

 

패키지 설치

npm i --save @nestjs/config

 

설정값 입력

app.module.ts 에 설정을 추가를 해주도록 하겠습니다. 

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      load: [postgresConfig, jwtConfig],
    }),
	...
  ],
})
export class AppModule {}

 

여기서 눈여겨 볼 것은 load 배열입니다. load 배열에 입력을 해둔 config 값들은 서버가 구동시 우선 가져오는 값들이 될 것 입니다. 

 

다음은 /src/config/postres.config.ts 파일 입력 값입니다.

export default registerAs('postgres', () => ({
  host: process.env.POSTGRES_HOST || 'localhost',
  port: Number(process.env.POSTGRES_PORT) || 5434,
  username: process.env.POSTGRES_USERNAME || 'postgres',
  password: process.env.POSTGRES_PASSWORD || 'postgres',
  database: process.env.POSTGRES_DATABASE || 'postgres',
}));

 

이렇게 입력된 값을 다시 app.module.ts에서 사용을 해주면 동적 할당 작업은 마무리 되었습니다. 

TypeOrmModule.forRootAsync({
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) => {
        let obj: TypeOrmModuleOptions = {
          type: 'postgres',
          host: configService.get('postgres.host'),
          port: configService.get('postgres.port'),
          username: configService.get('postgres.username'),
          password: configService.get('postgres.password'),
          database: configService.get('postgres.database'),
          autoLoadEntities: true,
        };
        if (configService.get('STAGE') === 'local') {
          console.info('Sync postgres');
          obj = Object.assign(obj, {
            synchronize: true,
            logging: true,
          });
        }
        return obj;
      },
    }),

 

코드 설명
inject: [] 설정에 필요한 의존성을 주입 받는 옵션
useFactory 동적으로 Module을 지정하기 위한 옵션
async (configService) => {} 입력 받은 configService의 값을 사용하여 Module 설정
if (configService.get('STAGE')) 현재 어플리케이션이 DEV인지 PRODUCTION인지에 따라 투차적인 옵션 지정.

 

'Backend > Nest.js' 카테고리의 다른 글

Nest.js Swagger 보안 설정  (0) 2023.09.30
Nest.js bcrypt (hashing)  (0) 2023.09.27
Nest.js Provider  (0) 2023.09.26
Nest.js Swagger Bearer 인증 적용  (1) 2023.09.26
Nest.js Security Jwt strategy 적용  (0) 2023.09.26