forwardRef circle reference

agnusdei·2023년 7월 20일
0

앵귤러의 forwardRef는 주로 순환 의존성 문제를 해결하기 위해 사용되는 특수한 함수입니다. 이 함수는 다른 컴포넌트 또는 프로바이더의 참조를 지연시키는 데 도움이 됩니다.

일반적으로 앵귤러 애플리케이션에서는 컴포넌트, 디렉티브 또는 서비스 등의 클래스를 정의하고, 이러한 클래스를 프로바이더로 등록하여 의존성 주입 시스템에 등록합니다. 때때로 컴포넌트 또는 서비스 간에 상호 의존성이 발생할 수 있습니다. 예를 들어, 서로를 참조하는 두 개의 컴포넌트가 있을 경우, 앵귤러가 이러한 의존성을 인식하고 처리하는 데 어려움이 발생할 수 있습니다.

이때 forwardRef를 사용하여 순환 참조 문제를 해결할 수 있습니다. forwardRef는 다음과 같은 시나리오에서 유용합니다:

  1. 컴포넌트 A가 컴포넌트 B를 참조하고, 컴포넌트 B가 다시 컴포넌트 A를 참조하는 경우.
  2. 서비스 A가 서비스 B를 참조하고, 서비스 B가 다시 서비스 A를 참조하는 경우.

이러한 상황에서 클래스 선언이 위에서 아래로 진행되기 때문에, 서로를 인식할 수 없는 순환 참조 문제가 발생합니다. 이때 forwardRef를 사용하면 해당 클래스를 참조하는 데 사용될 함수를 만들 수 있습니다.

forwardRef 함수의 사용법은 다음과 같습니다:

function forwardRef<T>(forwardFn: () => T): T;
  • forwardFn: 클래스의 생성자 함수를 반환하는 함수입니다. 이 함수는 컴포넌트나 프로바이더가 아직 정의되지 않은 상태에서 호출됩니다.
  • forwardFn: 이 함수는 해당 클래스가 인스턴스화될 때까지 실행되지 않습니다.

forwardRef 함수는 주로 순환 참조 문제를 해결하는 데 사용됩니다. 이는 앵귤러에서 서비스, 컴포넌트, 디렉티브 등이 상호 의존성을 갖는 경우 발생할 수 있는 문제를 해결하는 데 유용합니다.

이제 forwardRef 함수를 이해하기 위해 컴포넌트 간의 순환 참조 문제를 해결하는 예시를 살펴보겠습니다.

예를 들어, 다음과 같이 두 개의 컴포넌트가 서로를 참조하고 있습니다:

// component-a.ts
import { ComponentB } from './component-b';

@Component({
  selector: 'app-component-a',
  template: '<app-component-b></app-component-b>',
})
export class ComponentA {
  constructor(private componentB: ComponentB) { }
}

// component-b.ts
import { ComponentA } from './component-a';

@Component({
  selector: 'app-component-b',
  template: '<app-component-a></app-component-a>',
})
export class ComponentB {
  constructor(private componentA: ComponentA) { }
}

이러한 상태에서 앵귤러는 서로를 참조하고 있는 컴포넌트 A와 B를 인식하지 못하고 순환 참조 문제가 발생할 수 있습니다.

이때 forwardRef를 사용하여 순환 참조 문제를 해결할 수 있습니다. 먼저, forwardRef를 사용하여 컴포넌트 B의 클래스를 지연시킵니다:

// component-a.ts
import { forwardRef } from '@angular/core';

// 서로를 참조하는 상태에서 forwardRef를 사용하여 ComponentB의 클래스를 지연시킴
const ComponentB = forwardRef(() => ComponentB);

@Component({
  selector: 'app-component-a',
  template: '<app-component-b></app-component-b>',
})
export class ComponentA {
  constructor(private componentB: ComponentB) { }
}

그리고 이제 컴포넌트 B에서 forwardRef를 사용하여 컴포넌트 A의 클래스를 지연시킵니다:

// component-b.ts
import { forwardRef } from '@angular/core';

// 서로를 참조하는 상태에서 forwardRef를 사용하여 ComponentA의 클래스를 지연시킴
const ComponentA = forwardRef(() => ComponentA);

@Component({
  selector: 'app-component-b',
  template: '<app-component-a></app-component-a>',
})
export class ComponentB {
  constructor(private componentA: ComponentA) { }
}

이제 forwardRef를 사용하여 순환 참조 문제를 해결했습니다. Angular은 이제 각 컴포넌트 클래스가 인스턴스화될 때까지 기다리게 되므로 순환 참조 문제가 발생하지 않습니다.

위의 예시에서 forwardRef는 컴포넌트 A를 참조하는데 사용되며, 이를 통해 앵귤러는 컴포넌트 A가 정의될 때까지 기다릴 수 있습니다. 따라서 순환 참조 문제가 발생하지 않게 됩니다.

요약하면, forwardRef 함수는 앵귤러에서 순환 의존성을 해결하기 위해 사용되는 함수로, 컴포넌트 또는 서비스의 클래스를 참조하는데 사용됩니다. 이를 통해 상호 참조로 인한 문제를 방지하고 정상적인 의존성 주입을 가능하게 합니다.

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

덕분에 좋은 정보 얻어갑니다, 감사합니다.

답글 달기