Angular Signal은 Angular 16에서 도입된 새로운 반응형 프로그래밍 패러다임입니다. 기존의 Zone.js 기반 변경 감지 시스템을 보완하고, 더 효율적이고 예측 가능한 상태 관리를 제공합니다.
Signal의 핵심 개념
Signal은 값을 보유하고, 그 값이 변경될 때 의존하는 컴포넌트나 다른 Signal에 자동으로 알림을 보내는 반응형 데이터 구조입니다. 이는 세밀한 변경 감지를 가능하게 하여 성능을 크게 향상시킵니다.
기본 사용법
Signal 생성:
import { signal } from '@angular/core';
export class MyComponent {
count = signal(0); // 초기값 0
name = signal('Angular');
}
Signal 값 읽기:
// 템플릿에서
{{ count() }} // Signal은 함수처럼 호출
// 컴포넌트에서
console.log(this.count()); // 현재 값 출력
Signal 값 업데이트:
// 새 값으로 설정
this.count.set(5);
// 현재 값을 기반으로 업데이트
this.count.update(value => value + 1);
Computed Signal
다른 Signal들로부터 파생된 값을 자동으로 계산합니다:(ReadOnly signal)
import { computed } from '@angular/core';
export class MyComponent {
firstName = signal('John');
lastName = signal('Doe');
// firstName이나 lastName이 변경되면 자동으로 재계산
fullName = computed(() =>
`${this.firstName()} ${this.lastName()}`
);
}
Effect
Signal 변경에 반응하여 부수 효과를 실행합니다:
import { effect } from '@angular/core';
export class MyComponent {
count = signal(0);
constructor() {
// count가 변경될 때마다 실행
effect(() => {
console.log('Count changed to:', this.count());
});
}
}
주요 장점
성능 개선: Zone.js 없이도 정확한 변경 감지가 가능하여 불필요한 렌더링을 줄입니다.
예측 가능성: 명시적인 의존성 추적으로 데이터 흐름을 쉽게 파악할 수 있습니다.
타입 안정성: TypeScript와 완벽하게 통합되어 컴파일 타임에 오류를 잡을 수 있습니다.
간단한 API: 직관적이고 학습하기 쉬운 API를 제공합니다.
실제 사용 예시
@Component({
selector: 'app-todo',
template: `
<h2>할 일 목록 ({{ completedCount() }}/{{ todos().length }})</h2>
<ul>
@for (todo of todos(); track todo.id) {
<li [class.completed]="todo.completed">
{{ todo.title }}
</li>
}
</ul>
`
})
export class TodoComponent {
todos = signal([
{ id: 1, title: '학습하기', completed: false },
{ id: 2, title: '코딩하기', completed: true }
]);
completedCount = computed(() =>
this.todos().filter(todo => todo.completed).length
);
addTodo(title: string) {
this.todos.update(todos => [
...todos,
{ id: Date.now(), title, completed: false }
]);
}
}
Angular Signal은 현재 개발자 프리뷰 단계이지만, 향후 Angular의 핵심 반응형 시스템이 될 예정입니다. Zone.js에서 벗어나 더 현대적이고 효율적인 상태 관리를 가능하게 하는 중요한 발전입니다.
반응형
'IT관련 > Angular' 카테고리의 다른 글
| Preflight와 XHR: 웹 개발에서 꼭 알아야 할 개념 (2) | 2025.09.01 |
|---|---|
| IndexedDB란? 웹에서의 강력한 데이터 저장소 (2) | 2025.08.25 |
| VSCode에서 intelligence 및 assistant 기능 안될때 처리방법 (0) | 2025.07.15 |
| 탐색 확인 팝업창이 두번째 클릭부터 뜨는 이유 (1) | 2025.06.25 |
| 자식요소에서 부모요소의 height셋팅값 알아내는 방법 (0) | 2025.06.10 |