NestJS circular dependency 문제 해결

Peter·2020년 10월 12일
8

nestjs

목록 보기
3/11
post-thumbnail

1. 문제요약

예를 들어, Module-A에 있는 Service-A와 Module-B에 있는 Service-B가 서로 의존주입을 하려 하면 문제가 발생하여 실행되지 않습니다.
이를 해결하기 위한 간단한 방법은 "forwardRef" 입니다.

2. 해결

@Module({
  imports: [ModuleBModule],
  providers: [ModuleAService],
  exports: [ModuleAService],
})
export class ModuleAModule {}
@Module({
  imports: [ModuleAModule],
  providers: [ModuleBService],
  exports: [ModuleBService],
})
export class ModuleBModule {}

위와 같이 두 모듈이 서로를 import 하게 하면, "Nest cannot create the module instance" 에러 메시지를 남기며 어플리케이션이 실행되지 않습니다.

@Module({
  imports: [forwardRef(() => ModuleBModule)],
  providers: [ModuleAService],
  exports: [ModuleAService],
})
export class ModuleAModule {}
@Module({
  imports: [forwardRef(() => ModuleAModule)],
  providers: [ModuleBService],
  exports: [ModuleBService],
})
export class ModuleBModule {}

위와같이 변경하면 순환 참조 문제가 해결됩니다..

하지만, ModuleAService와 ModuleBService가 서로를 참조하면 여전히 문제가 발생합니다.
이를 해결하기 위해서는 ModuleAService와, ModuleBService에서도 forwardRef로 서로를 명시해야 합니다.

@Injectable()
export class ModuleAService {
  constructor(
    @Inject(forwardRef(() => ModuleBService))
    private readonly moduleBService: ModuleBService) {
  }
}
@Injectable()
export class ModuleBService {
  constructor(
    @Inject(forwardRef(() => ModuleAService))
    private readonly moduleAService: ModuleAService) {
  }
}

1개의 댓글

comment-user-thumbnail
2021년 3월 15일

ㅎㅎ 감사합니다.

답글 달기