오늘은 순환 종속성(Circular Dependency)에 대해 알아보자.
NestJS로 프로젝트를 구현하다가 VoteController에서 CommentService를 사용하고
CommentService에서 VoteRepository를 사용해야 되는 케이스가 생겼다.
저번에는 단방향인(?) 공유 모듈을 사용했었는데 이번에는 양쪽 모듈에서 다 필요로하는 쌍방향(?) 모듈이다.
https://ilikezzi.tistory.com/20
이전에 포스팅한 공유 모듈에 대해서 한번 읽고와야지 이해가 될 것이다.
우선 순환 의존성 관련해서 발생한 에러이다.
ERROR [ExceptionHandler] Nest cannot create the CommentModule instance. The module at index [0] of the CommentModule "imports" array is undefined.
Potential causes:
- A circular dependency between modules. Use forwardRef() to avoid it. Read more: https://docs.nestjs.com/fundamentals/circular-dependency
- The module at index [0] is of type "undefined". Check your import statements and the type of the module.
Scope [AppModule -> VotesModule]
순환 종속성에 대해 Nest 공식 문서를 보고 차근차근 해결해보자.
순환 종속성은 두 클래스가 서로 종속될 때 발생합니다. 예를 들어 클래스 A에는 클래스 B가 필요하고 클래스 B에도 클래스 A가 필요합니다. 모듈 간 및 공급자 간에 중첩에서 순환 종속성이 발생할 수 있습니다.
가능한 경우 순환 종속성을 피해야 하지만 항상 그렇게 할 수는 없습니다. 이러한 경우 Nest는 두 가지 방법으로 공급자 간의 순환 종속성을 해결할 수 있습니다. 이 장에서는 정방향 참조를 하나의 기술로 사용하고 ModuleRef 클래스를 사용하여 DI 컨테이너에서 제공자 인스턴스를 검색하는 다른 기술을 설명합니다.
또한 모듈 간의 순환 종속성을 해결하는 방법도 설명합니다.
결론은 Nest에서는 두 클래스가 서로 종속이 필요할 때 ModuleRef 를 통해서 해결할 수 있다고 한다..!
@nestjs/common 에서 패키지로 제공해주는 forwardRef()를 사용하면 되는데 사용하려면 패키지 설치부터 하자.
npm i @nestjs/common
이제 forwardRef()를 사용할 수 있다.
종속성을 imports 하는 CommentModule, VotesModule에 각각
fowardRef(()=> CommentModule) / fowardRef(()=> VotesModule)
를 넣어주도록 하자.
이제 정상적으로 순환 종속성이 이루어져 에러가 해결되었을 것이다.