순환 종속성은 두 클래스가 서로 종속될 때 발생합니다. 예를 들어 클래스 A에는 클래스 B가 필요하고 클래스 B에도 클래스 A가 필요한 경우다. Nest에서는 모듈 간 및 공급자 간에 순환 종속성이 발생할 수 있다.
가능하면 순환 종속성을 피해야 하지만 항상 그렇게 할 수는 없다. 이러한 경우 Nest는 두 가지 방법으로 공급자 간의 순환 종속성을 해결할 수 있다. 이 장에서는 전방 참조를 하나의 기술로 사용하고 ModuleRef 클래스를 사용하여 DI 컨테이너에서 공급자 인스턴스를 검색하는 방법을 설명한다.
또한 모듈 간의 순환 종속성을 해결하는 방법도 설명합니다.
주의) "배럴 파일"/index.ts 파일을 사용하여 가져오기를 그룹화하는 경우에도 순환 종속성이 발생할 수 있습니다. 모듈/공급자 클래스의 경우 배럴 파일을 생략해야 한다. 예를 들어, 배럴 파일과 동일한 디렉터리 내에서 파일을 가져올 때 배럴 파일을 사용해서는 안된다. 즉, catscats/cats.service 파일을 가져오기 위해 cats/cats.controller는 cats 를 임포트하면 안된다 . 자세한 내용은 이 github 문제를 참조.
전방 참조
전방 참조를 사용 하면 Nest가 forwardRef() 유틸리티 함수를 사용하여 아직 정의되지 않은 클래스를 참조할 수 있다. 예를 들어, CatsService와 가 CommonService서로 의존하는 경우 관계의 양쪽에서 순환 종속성을 해결하기 위해 @Inject() 와 유틸리티 forwardRef() 를 사용할 수 있다. 그렇지 않으면 모든 필수 메타데이터를 사용할 수 없기 때문에 Nest는 이를 인스턴스화하지 않습니다. 예는 다음과 같다.
// cats.service.ts
@Injectable()
export class CatsService {
constructor(
@Inject(forwardRef(() => CommonService))
private commonService: CommonService,
) {}
}
힌트) forwardRef() 함수는 @nestjs/common 패키지에서 가져옴.
이제 다음과 같이 CommonService 에서 동일한 작업을 수행해 보겠다 .
// common.service.ts
@Injectable()
export class CommonService {
constructor(
@Inject(forwardRef(() => CatsService))
private catsService: CatsService,
) {}
}
주의) 인스턴스화 순서는 불확실합니다. 당신의 코드가 먼저 호출되는 생성자에 의존하는지 확인해야 한다. 순환 종속성이 Scope.REQUEST 선언된 공급자에 종속되면 정의되지 않은 종속성이 발생할 수 있습니다. 자세한 내용은 여기에서 확인할 수 다.
ModuleRef 클래스 대안
사용의 대안은 forwardRef()코드를 리팩터링하고 ModuleRef클래스를 사용하여 (그렇지 않은 경우) 순환 관계의 한쪽에서 공급자를 검색하는 것이다. 여기에서 ModuleRef 유틸리티 클래스에 대해 자세히 알아보면 된다.
모듈 전방 참조
모듈 간의 순환 종속성을 해결하려면 forwardRef()모듈 연결의 양쪽에서 동일한 유틸리티 기능을 사용하십시오. 예를 들어:
// common.module.ts
@Module({
imports: [forwardRef(() => CatsModule)],
})
export class CommonModule {}
Cats 모듈에서 동일한 작업을 수행한다.
// cats.module.ts
@Module({
imports: [forwardRef(() => CommonModule)],
})
export class CatsModule {}
'Backend(Framework) > NestJS 개요(공식문서 번역)' 카테고리의 다른 글
17. Lazy-loading modules (1) | 2023.12.02 |
---|---|
16. Module reference (1) | 2023.12.02 |
14. Injection scopes (1) | 2023.12.02 |
13. Dynamic modules (1) | 2023.12.02 |
12. Asynchronous providers (0) | 2023.11.19 |