[NestJS] 모듈 다시 내보내기

cabbage·2023년 6월 13일
0

NestJS

목록 보기
11/17
post-thumbnail

NestJS의 모듈에 대해 공부하다가 새롭게 알게된 내용이 있어 정리한다. 이 정리글은 NestJS로 배우는 백엔드 프로그래밍(한용재)를 참고하였다.

프로젝트를 진행하면서 프로바이더들을 이곳 저곳에 의존성 주입하면서 순환 의존성 문제가 많이 발생했었고 해결하기 어려웠던 기억이 있다. 확실하지는 않지만 이 내용을 통해 순환 의존성 문제를 만나면 해결할 수 있을 것 같다는 생각이 들었다.

가져온 모듈은 다시 내보낼 수 있다

@Module 데코레이터에서 import에 전달한 모듈은 다시 export할 수 있다. import에 전달한 모듈을 다시 export한다는 것은 가져온 모듈을 다시 내보낼 수 있다는 것을 말한다.

예시

아래 두 모듈이 있다고 해보자.

  • CommonModule: 서비스 전반에 쓰이는 공통 기능을 모아놓은 모듈
  • CoreModule: 앱을 구동하기 위해 필요한 기능을 모아놓은 모듈

루트 모듈 AppModule이 앱을 구동하기 위해 CoreModule이 필수적인 상황에서 CommonModule의 기능도 필요하다고 해보자. 이 경우 AppModule은 두 모듈을 모두 가져오지 않아도 된다.

  • AppModule은 CoreModule만 가져온다.
  • CoreModule은 CommonModule을 가져오고 다시 내보낸다. CommonModule을 import로 가져오고 export로 다시 내보내는 것이다.

위 과정을 거치면 AppModule은 CommonModule을 가져오지 않아도 CommonModule의 기능을 사용할 수 있게 된다.

// CommonModule.ts
@Module({
	providers: [CommonService],
	exports: [CommonService], // 다른 모듈에 CommonService 제공
})
export class CommonModule {}
  • CommonModule은 CommonService 프로바이더를 제공한다.
// CoreModule.ts
@Module({
	imports: [CommonModule], // CommonModule 가져오기
	exports: [CommonModule], // CommonModule 내보내기
})
export class CoreModule {}
  • CoreModule은 CommonModule을 가져온 후 다시 내보낸다.
// AppModule.ts
@Module({
	imports: [CoreModule], // CoreModule만 가져오기
	controllers: [AppController],
	providers: [AppService],
})
export class AppModule {}
  • AppModule은 CoreModule만 가져온다.
  • CoreModule만 가져오더라도 CoreModule이 CommonModule을 가져와 내보내기 때문에 CoreModule을 가져오는 AppModule도 CommonModule의 기능을 사용할 수 있다.
@Controller()
export class AppController {
	constructor(
		private readonly commonService: CommonService, // CommonModule의 프로바이더 CommonService 의존성 주입
	) {}

	@Get('/common-hello')
	getCommonHello(): string {
		return this.commonService.hello(); // CommonService 메서드 사용
	}
}
  • AppModule의 컨트롤러 AppController에 CommonModule의 프로바이더 CommonService를 의존성 주입하여 사용한다.

정리

  • @Module 데코레이터에서 import에 전달한 모듈은 다시 export할 수 있다.
  • 모듈 C를 모듈 B가 import해서 export하면 모듈 B를 import하는 모듈 A는 모듈 C를 import하지 않아도 모듈 C의 기능을 사용할 수 있다.(C -> B -> A)

참고

  • NestJS로 배우는 백엔드 프로그래밍 - 한용재
profile
캐비지 개발 블로그입니다. :)

0개의 댓글