Nest.js에서 동적모듈 만들기

With·2022년 8월 7일
0

nest.js

목록 보기
1/5

노마드코더 우버 잇츠 5.3 ~ 5.5 에 대한 정리내용입니다.

동적모듈로 만들기

(1) JwtModule에 static forRoot()를 추가해줌으로써 동적모듈로 만들 수 있다. forRoot() 함수는 Dynamic Modeule을 반환한다. static 메서드는new 키워드 없이 바로 클래스를 사용할 수 있게 해준다.

@Module({})
export class JwtModule {
  static forRoot(): DynamicModule {
    return {
      // 동적모듈은 또 다른 모듈을 반환하는 모듈이다. JwtModule를 반환하는 것이다.
      module: JwtModule,  
      // 이 모듈의 Provider들을 다른 모듈에서 사용할 수 있게 하려면, exports 해야 한다.
      exports: [JwtService],
      // 현재 이 모듈에서 가지고 있는 Provider는 JwtService 가 있다는 뜻이다.
      // 이렇게 모듈에서 Provider가 추가될 때 마다 등록을 해준다.
      providers: [JwtService],
    };
  }
}

global module 로 설정하기

(1) global module 이란?

  • global module은 다른 Service 레이어에서 사용하고자 할 때 imports를 하지 않아도 사용할 수 있다. 그래서 여러 곳에서 사용하는 모듈을 global로 설정하면 매번 imports 하지 않고 사용할 수 있다.
  • global module이 아닌 모듈을 Service 레이어에서는 어떤 모듈을 사용하고자 한다면, 해당 서비스의 모듈에서 imports 해줘야만 사용이 가능하다는 뜻이다. 예를 들어, usesService에서 JwtModule을 사용하고자 한다면, useModule에서 JwtModule을 imports 해줘야 한다.

(2) global module로 만드는 방법은?

  • @Global() 데코레이터를 붙여 준다.

app.module ➡️ jwt.module ➡️ jwt.service 로 options 값 전달하기

(1) options으로 들어갈 forRoot()의 인자 타입 구현하기
jwt.interface.ts 파일을 생성하고 options의 타입을 구현한다. 그리고 forRoot(options: 생성한 타입)을 넣어 설정한다.

(2) appModule에서 jwtModule로 그리고 다시 jwtService 레이어로 보내기
jwt.module.tsapp.module.ts 에서 받은 options 값을 JwtService 레이어로 보내기 위해 exports에 값을 추가한다. 이때 provideuseValue를 사용한다.

export class JwtModule {
  static forRoot(options: JwtModuleOptions): DynamicModule {
    return {
      module: JwtModule,
      exports: [
        {
          provide: CONFIG_OPTIONS, // jwt.contants.ts 에서 상수로 관리
          useValue: options, // app.module.ts에서 forRoot()로 받은 값
        },
        JwtService,
      ],
      providers: [
        // Provider가 등록해줘야 exports 할 수 있다.
          {
            provide: CONFIG_OPTIONS,
            useValue: options,
          },
          JwtService,
        ],
    };
  }
}

(3) jwt.module.ts에서 보냈다. 이제 DI를 통해서 서비스 레이어에서 받는다. 서비스 레이어에서는 constructor를 이용해서 provider를 DI 한다. 그러면 이제 options 값을 사용할 수 있다. @Inject() 인자에 있는 상수는 jwt.module.ts 에서 exports로 설정해준 값과 동일해야 한다.

import { Inject, Injectable } from '@nestjs/common';
import { CONFIG_OPTIONS } from './jwt.contants';
import { JwtModuleOptions } from './jwt.interfaces';

@Injectable()
export class JwtService {
  constructor(
    @Inject(CONFIG_OPTIONS) private readonly options: JwtModuleOptions,
  ) {}
}
profile
주니어 프론트엔드 개발자 입니다.

0개의 댓글