[G1-Sync] Manual knowledge update
This commit is contained in:
@@ -1,21 +1,21 @@
|
||||
# [[가상 DOM과 재조정 (Virtual DOM and Reconciliation)]]
|
||||
# [[가상 DOM과 재조정 ([[Virtual DOM]] and [[Reconciliation]])]]
|
||||
|
||||
## 📌 Brief 시 Summary
|
||||
가상 DOM(Virtual DOM)은 실제 DOM과 동기화되는 사용자 인터페이스(UI)의 가벼운 인메모리(in-memory) 표현입니다 [1, 2]. React는 이 가상 DOM을 사용하여 이전 상태와 새로운 상태를 비교(Diffing)한 뒤, 가장 효율적인 방식으로 실제 DOM을 업데이트하는 '재조정(Reconciliation)' 과정을 수행합니다 [2, 3]. 이 메커니즘은 수동적인 DOM 조작의 비효율성을 추상화하고 선언적인 API를 가능하게 하여 애플리케이션의 렌더링 성능을 최적화합니다 [1, 2].
|
||||
## 📌[[ brief]] 시 Summary
|
||||
가상 DOM(Virtual DOM)은 실제 DOM과 동기화되는 사용자 인터페이스(UI)의 가벼운 인메모리(in-[[memory]]) 표현입니다 [1, 2]. React는 이 가상 DOM을 사용하여 이전 상태와 새로운 상태를 비교(Diffing)한 뒤, 가장 효율적인 방식으로 실제 DOM을 업데이트하는 '재조정(Reconciliation)' 과정을 수행합니다 [2, 3]. 이 메커니즘은 수동적인 DOM 조작의 비효율성을 추상화하고 선언적인 API를 가능하게 하여 애플리케이션의 렌더링 성능을 최적화합니다 [1, 2].
|
||||
|
||||
## 📖 Core Content
|
||||
* **가상 DOM의 도입 배경 및 개념**
|
||||
* 웹 브라우저에서 DOM을 직접 수정하는 것은 브라우저의 중요 렌더링 경로(Critical Rendering Path)에 있는 레이아웃(Layout) 및 페인트(Paint) 단계를 트리거하기 때문에 본질적으로 속도가 느립니다 [1].
|
||||
* React는 평범한 JavaScript 객체 형태인 가상 DOM을 도입하여 UI 엘리먼트를 표현함으로써 이 문제를 해결합니다 [3]. 이는 일시적인 프레젠테이션 상태를 지속적인 애플리케이션 상태에서 분리하여 불필요한 렌더링 작업을 줄입니다 [3].
|
||||
* 웹 브라우저에서 DOM을 직접 수정하는 것은 브라우저의 중요 렌더링 경로([[Critical Rendering Path]])에 있는 레이아웃(Layout) 및 페인트(Paint) 단계를 트리거하기 때문에 본질적으로 속도가 느립니다 [1].
|
||||
* React는 평범한 [[JavaScript]] 객체 형태인 가상 DOM을 도입하여 UI 엘리먼트를 표현함으로써 이 문제를 해결합니다 [3]. 이는 일시적인 프레젠테이션 상태를 지속적인 애플리케이션 상태에서 분리하여 불필요한 렌더링 작업을 줄입니다 [3].
|
||||
|
||||
* **휴리스틱 기반의 비교 알고리즘 (Heuristic Diffing Algorithm)**
|
||||
* **휴리스틱 기반의 비교 알고리즘 (Heuristic [[Diffing Algorithm]])**
|
||||
* 일반적으로 두 트리를 비교하는 알고리즘은 $O(n^3)$의 시간 복잡도를 가지며, 이는 실제 애플리케이션에 적용하기에는 너무 무겁습니다 [4, 5].
|
||||
* React는 두 가지 가정을 바탕으로 $O(n)$의 시간 복잡도를 갖는 휴리스틱 알고리즘을 사용합니다 [4, 6].
|
||||
1. 서로 다른 타입의 엘리먼트는 완전히 다른 트리를 생성합니다 [4, 6].
|
||||
2. 개발자는 `key` prop을 통해 여러 렌더링 사이에서 어떤 자식 엘리먼트가 안정적으로 유지되는지 React에 힌트를 제공할 수 있습니다 [4, 6].
|
||||
|
||||
* **엘리먼트 타입에 따른 업데이트 방식**
|
||||
* **다른 타입의 엘리먼트:** 루트 엘리먼트의 타입이 다르면(예: `<a>`에서 `<img>`로 변경), React는 이전 트리를 완전히 파괴하고 새로운 트리를 처음부터 다시 구축하며, 이때 이전 트리와 연관된 상태(State)는 모두 소실됩니다 [4, 7].
|
||||
* **다른 타입의 엘리먼트:** 루트 엘리먼트의 타입이 다르면(예: `<a>`에서 `<img>`로 변경), React는 이전 트리를 완전히 파괴하고 새로운 트리를 처음부터 다시 구축하며, 이때 이전 트리와 연관된 상태([[State]])는 모두 소실됩니다 [4, 7].
|
||||
* **동일한 타입의 DOM 엘리먼트:** 동일한 타입일 경우 기반이 되는 DOM 노드를 그대로 유지하고, 변경된 속성이나 스타일(예: `className`, `color`)만 업데이트합니다 [8, 9].
|
||||
* **동일한 타입의 컴포넌트 엘리먼트:** 컴포넌트 인스턴스가 동일하게 유지되어 렌더링 간에 상태가 보존됩니다 [9]. 새로운 엘리먼트에 맞춰 props를 업데이트한 후 `render()` 메서드를 호출하고, 그 결과에 대해 비교 알고리즘을 재귀적으로 수행합니다 [9, 10].
|
||||
|
||||
|
||||
Reference in New Issue
Block a user