NestJS의 모듈에 대해 공부하다가 새롭게 알게된 내용이 있어 정리한다. 이 정리글은 NestJS로 배우는 백엔드 프로그래밍(한용재)를 참고하였다.
프로젝트를 진행하면서 프로바이더들을 이곳 저곳에 의존성 주입하면서 순환 의존성 문제가 많이 발생했었고 해결하기 어려웠던 기억이 있다. 확실하지는 않지만 이 내용을 통해 순환 의존성 문제를 만나면 해결할 수 있을 것 같다는 생각이 들었다.
@Module 데코레이터에서 import에 전달한 모듈은 다시 export할 수 있다. import에 전달한 모듈을 다시 export한다는 것은 가져온 모듈을 다시 내보낼 수 있다는 것을 말한다.
아래 두 모듈이 있다고 해보자.
루트 모듈 AppModule이 앱을 구동하기 위해 CoreModule이 필수적인 상황에서 CommonModule의 기능도 필요하다고 해보자. 이 경우 AppModule은 두 모듈을 모두 가져오지 않아도 된다.
위 과정을 거치면 AppModule은 CommonModule을 가져오지 않아도 CommonModule의 기능을 사용할 수 있게 된다.
// CommonModule.ts
@Module({
providers: [CommonService],
exports: [CommonService], // 다른 모듈에 CommonService 제공
})
export class CommonModule {}
// CoreModule.ts
@Module({
imports: [CommonModule], // CommonModule 가져오기
exports: [CommonModule], // CommonModule 내보내기
})
export class CoreModule {}
// AppModule.ts
@Module({
imports: [CoreModule], // CoreModule만 가져오기
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
@Controller()
export class AppController {
constructor(
private readonly commonService: CommonService, // CommonModule의 프로바이더 CommonService 의존성 주입
) {}
@Get('/common-hello')
getCommonHello(): string {
return this.commonService.hello(); // CommonService 메서드 사용
}
}