노마드코더 우버 잇츠 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],
};
}
}
(1) global module 이란?
(2) global module로 만드는 방법은?
@Global()
데코레이터를 붙여 준다.(1) options으로 들어갈 forRoot()의 인자 타입 구현하기
jwt.interface.ts 파일을 생성하고 options의 타입을 구현한다. 그리고 forRoot(options: 생성한 타입)
을 넣어 설정한다.
(2) appModule에서 jwtModule로 그리고 다시 jwtService 레이어로 보내기
jwt.module.ts
가 app.module.ts
에서 받은 options 값을 JwtService
레이어로 보내기 위해 exports
에 값을 추가한다. 이때 provide
와 useValue
를 사용한다.
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,
) {}
}