[NestJS] 순환 종속성

도도·2021년 8월 1일
1

기술Velog

목록 보기
12/28

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) {
  }
}

ref

https://docs.nestjs.com/fundamentals/circular-dependency

https://velog.io/@peter0618/NestJs-circular-dependency-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0#2-%ED%95%B4%EA%B2%B0

순환 종속성 NestJS circular dependency 문제 해결 - 1 모듈간 종속성

  • StrategyModule 은 TradingModule을 임포트
  • TradingModule 은 StrategyModule을 임포트
  • 이를 해결하기 위해 forwardRef 을 사용
// StrategyModule
@Module({
  imports: [
    forwardRef(() => TradingModule)
  ],
  controllers: [StrategyMutationController, StrategyQueryController],
  providers: [StrategyService, StrategyHashService, StrategyResolver],
  exports: [StrategyService],
})
export class StrategyModule {}

// TradingModule
@Module({
  imports: [
    forwardRef(() => StrategyModule)
  ],
  controllers: [TradingQueryController, TradingMutationController],
  providers: [TradingService, TradingResolver],
  exports: [TradingService],
})
export class TradingModule {}

순환 종속성 NestJS circular dependency 문제 해결 - 2 서비스간 종속성

  • StrategyService 은 TradingService 필요로 함
  • TradingService 은 StrategyService을 필요로 함
  • 이를 해결하기 위해 @Inject(forwardRef(() => Service)) 을 사용
//StrategyService
@Injectable()
export class StrategyService {
  constructor(
    @Inject(forwardRef(() => TradingService))
    private readonly tradingService: TradingService,
  ) {}
}
// TradingService
@Injectable()
export class TradingService {
  constructor(
    @Inject(forwardRef(() => StrategyService))
    private readonly strategyService: StrategyService,
  ) {}
}

profile
프론트 주력의 JS 개발자 입니다.! Node.js, React, NestJS 에 관심이 많습니다.

0개의 댓글