Nest.js
[에러] Nest.js 순환 종속성 양쪽 service 사용
B_Tae
2023. 8. 17. 22:01
순환 참조 이슈 해결
발달
nest.js로 개발 중 A Service를 B Service에 inject, B Service를 A Serivce에 inject하는 상황에서 서로 의존하다보니 에러가 발생했다.
(서버 개발자 부재로 서버 코드를 작성하다 발생한 이슈....)\
에러 로그
Nest can't resolve dependencies of the AService (?, .....).
Please make sure that the argument dependency at index [0] is available in the A Moduel context.
해결
앞서 말했든 위 에러는 양쪽에서 의존하여 발생한 이슈이다.
Moduel 문제코드
// A-Module
@Module({
imports: [
TypeOrmModule.forFeature([
...,
]),
bModule,
...,
],
controllers: [aController],
providers: [aService],
exports: [aService]
})
export class aMouduel {}
//B-Mouduel
@Module({
imports: [
TypeOrmModule.forFeature([
...,
]),
aModule,
...,
],
controllers: [bController],
providers: [bService],
exports: [bService]
})
export class bMouduel {}
수정된 코드
@Module({
imports: [
TypeOrmModule.forFeature([
...,
]),
forwardRef(() => bModule), // 변경된 부분
...,
],
controllers: [aController],
providers: [aService],
exports: [aService]
})
export class aMouduel {}
//B-Mouduel
@Module({
imports: [
TypeOrmModule.forFeature([
...,
]),
forwardRef(() => aModule) // 변경된 부분
...,
],
controllers: [bController],
providers: [bService],
exports: [bService]
})
export class bMouduel {}
먼저 모듈에서 순환 참조를 해결하기 위해서는, forwardRef(() => TargetModule)
를 사용하여 중간 초기화를 수행한다.
모듈을 해결했으니 Service도 해결해야한다.
Service 문제 코드
//AService
@Injectable()
export class AService {
constructor(
private aRepository: ARepository,
private readonly bService: BService,
...
) {}
//BService
@Injectable()
export class AService {
constructor(
private readonly aService: AService,
...
) {}
수정된 코드
@Injectable()
export class AService {
constructor(
private aRepository: ARepository,
@Inject(forwardRef(() => BService)) // 추가
private readonly bService: BService,
...
) {}
//BService
@Injectable()
export class AService {
constructor(
@Inject(forwardRef(() => AService)) // 추가
private readonly aService: AService,
...
) {}
Service에서 서로 의존하는 경우에도 마찬가지로 forwardRef()
를 사용하여 해결할 수 있다.
ps.
Nest.js에 대한 지식 없이 급하게 코드를 작성하고 있다. 간단하게 파악한 바로는 Nest.js에서는 Dependency Injection (의존성 주입)을 이용하여 각각의 서비스가 필요한 의존성을 가지고 동작하게 된다고 한다. 서로 의존하는 서비스가 있는 경우 (내가 해당), 순환 참조 문제가 발생할 수 있는데, 이때 프로그램이 올바르게 초기화되지 않아 발생하는 현상이라고 한다.
Nest.js에서는 순환 참조를 해결하기 위해 forwardRef()함수를 제공하고 이를 사용할 경우 Lazy Initalization (게으른 초기화)로 처리하여 나중에 필요할 때 초기화 하여 올바른 의존성 주입이 가능하도록 한다고 한다.