Angular change detection markForCheck

agnusdei·2023년 9월 3일
0

"markForCheck" 메소드는 Angular의 Change Detection(변경 감지) 메커니즘과 관련된 중요한 개념 중 하나입니다. Angular 애플리케이션에서 변경 감지는 컴포넌트의 상태 변화를 감지하고 화면을 업데이트하는 프로세스를 말합니다. "markForCheck" 메소드는 Angular Change Detection의 동작을 조절하고 최적화하기 위해 사용됩니다.

Change Detection은 Angular에서 어떤 데이터가 변화했는지를 감지하고 그에 따라 화면을 업데이트합니다. 기본적으로 Angular는 컴포넌트의 상태나 데이터가 변경될 때마다 Change Detection을 실행합니다. 그러나 큰 애플리케이션에서는 많은 데이터나 컴포넌트가 있을 수 있으며, 이를 모두 검사하고 업데이트하려면 성능 문제가 발생할 수 있습니다. 이런 경우, "markForCheck" 메소드를 사용하여 특정 컴포넌트의 변경 감지를 수동으로 트리거할 수 있습니다.

아래는 "markForCheck" 메소드를 사용하는 예제 코드와 그에 대한 설명입니다. 이 예제에서는 "onPush" 변경 감지 전략과 함께 사용되어 최적화된 컴포넌트의 변경 감지를 구현합니다.

import { Component, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';

@Component({
  selector: 'app-example',
  template: `
    <div>
      <p>{{ data }}</p>
      <button (click)="updateData()">Update Data</button>
      <button (click)="triggerChangeDetection()">Trigger Change Detection</button>
    </div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush // OnPush 변경 감지 전략 사용
})
export class ExampleComponent {
  data: string = 'Initial Data';

  constructor(private cdRef: ChangeDetectorRef) {}

  updateData() {
    this.data = 'Updated Data';
  }

  triggerChangeDetection() {
    this.cdRef.markForCheck(); // 변경 감지 표시(markForCheck)를 호출하여 변경 감지 트리거
  }
}

위의 코드에서 "ExampleComponent"는 "OnPush" 변경 감지 전략을 사용하고 있습니다. 이것은 컴포넌트가 자동으로 변경 감지를 실행하지 않고, 특정 이벤트나 메소드 호출에 의해 수동으로 변경 감지를 트리거하도록 만듭니다.

  1. updateData 메소드는 버튼을 클릭할 때 데이터를 업데이트합니다. 이때 컴포넌트의 상태가 변경됩니다.

  2. triggerChangeDetection 메소드는 "markForCheck" 메소드를 호출하여 변경 감지를 수동으로 트리거합니다. 이것은 컴포넌트의 변경 감지를 다시 실행시킵니다.

이렇게 하면 "OnPush" 전략을 사용하더라도 "markForCheck"를 호출하여 변경 감지를 수동으로 트리거할 수 있으며, 필요한 경우에만 변경 감지를 실행할 수 있습니다. 이것은 성능 최적화와 관련이 있으며, 애플리케이션의 특정 부분만 변경 감지를 수행할 수 있도록 도와줍니다.

"markForCheck" 메소드는 Angular에서 변경 감지를 미세 조정하고 컴포넌트의 업데이트를 효율적으로 관리하는 데 도움이 되는 강력한 도구입니다. 이를 통해 애플리케이션의 성능을 향상시키고 사용자 경험을 개선할 수 있습니다.

Angular에서 markForCheck 메서드는 Change Detection 메커니즘과 관련된 중요한 개념 중 하나입니다. 이를 이해하려면 먼저 Angular의 변경 감지(Change Detection) 시스템에 대한 이해가 필요합니다.

Angular의 변경 감지는 컴포넌트의 상태나 데이터 모델의 변화를 감지하고, 이로 인해 뷰를 업데이트하는 프로세스를 관리합니다. Angular는 기본적으로 양방향 데이터 바인딩을 지원하며 컴포넌트의 속성이나 모델 데이터가 변경되면 자동으로 해당 변경을 감지하고 뷰를 업데이트합니다. 이러한 변경 감지는 주로 자동으로 처리되지만 때로는 개발자가 직접 감지 프로세스를 제어하거나 최적화해야 할 때가 있습니다.

여기서 markForCheck 메서드가 등장합니다. 이 메서드는 Angular의 변경 감지 메커니즘을 실행 중인 컴포넌트에게 알려줍니다. "이 컴포넌트와 그 하위 컴포넌트를 다시 검사해야 합니다."라고 표시하는 역할을 합니다. 이것은 Angular가 변경 감지를 수동으로 트리거하는 방법 중 하나입니다. 이것이 필요한 경우는 다음과 같습니다.

  1. OnPush Change Detection 전략: Angular에서는 컴포넌트의 Change Detection 전략을 설정할 수 있습니다. OnPush 전략을 사용하면 부모 컴포넌트나 서비스의 데이터가 변경되었을 때 해당 컴포넌트만 변경 감지를 실행합니다. 이 때, markForCheck를 사용하여 컴포넌트가 변경 감지를 수동으로 트리거할 수 있습니다.
import { Component, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';

@Component({
  selector: 'app-example',
  template: '<div>{{ data }}</div>',
  changeDetection: ChangeDetectionStrategy.OnPush // OnPush 전략 사용
})
export class ExampleComponent {
  data: string;

  constructor(private cdRef: ChangeDetectorRef) {}

  updateData(newData: string) {
    this.data = newData;
    this.cdRef.markForCheck(); // 변경 감지를 트리거함
  }
}

위의 코드에서 updateData 메서드에서 markForCheck를 호출하면 컴포넌트는 변경 감지를 다시 실행하고 데이터를 업데이트한 후 뷰를 업데이트합니다.

  1. 비동기 작업 후 감지 강제: 비동기 작업 후 데이터가 변경되었을 때, Angular는 이를 자동으로 감지하지 못할 수 있습니다. 이때 markForCheck를 사용하여 Angular에게 변경을 알릴 수 있습니다.
import { Component, ChangeDetectorRef } from '@angular/core';

@Component({
  selector: 'app-example',
  template: '<div>{{ data }}</div>'
})
export class ExampleComponent {
  data: string;

  constructor(private cdRef: ChangeDetectorRef) {}

  fetchData() {
    // 비동기 작업을 수행한 후 데이터를 가져옴
    setTimeout(() => {
      this.data = '새로운 데이터';
      this.cdRef.markForCheck(); // 변경 감지를 트리거함
    }, 1000);
  }
}

위의 코드에서 fetchData 메서드에서 비동기 작업 후 markForCheck를 호출하여 변경을 알리고 뷰를 업데이트합니다.

markForCheck를 사용할 때 주의할 점은 이 메서드를 남용하지 않아야 하며, 실제로 필요한 상황에서만 사용해야 합니다. 과도한 사용은 변경 감지 성능에 영향을 미칠 수 있습니다. 이 메서드는 주로 OnPush 전략을 사용하거나 비동기 작업 후에 변경을 알리는 경우에 유용하게 사용됩니다.

0개의 댓글