4.5 KiB
4.5 KiB
가상 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].
📖 Core Content
-
가상 DOM의 도입 배경 및 개념
- 웹 브라우저에서 DOM을 직접 수정하는 것은 브라우저의 중요 렌더링 경로(Critical Rendering Path)에 있는 레이아웃(Layout) 및 페인트(Paint) 단계를 트리거하기 때문에 본질적으로 속도가 느립니다 [1].
- React는 평범한 JavaScript 객체 형태인 가상 DOM을 도입하여 UI 엘리먼트를 표현함으로써 이 문제를 해결합니다 [3]. 이는 일시적인 프레젠테이션 상태를 지속적인 애플리케이션 상태에서 분리하여 불필요한 렌더링 작업을 줄입니다 [3].
-
휴리스틱 기반의 비교 알고리즘 (Heuristic Diffing Algorithm)
- 일반적으로 두 트리를 비교하는 알고리즘은 $O(n^3)$의 시간 복잡도를 가지며, 이는 실제 애플리케이션에 적용하기에는 너무 무겁습니다 [4, 5].
- React는 두 가지 가정을 바탕으로 $O(n)$의 시간 복잡도를 갖는 휴리스틱 알고리즘을 사용합니다 [4, 6].
- 서로 다른 타입의 엘리먼트는 완전히 다른 트리를 생성합니다 [4, 6].
- 개발자는
keyprop을 통해 여러 렌더링 사이에서 어떤 자식 엘리먼트가 안정적으로 유지되는지 React에 힌트를 제공할 수 있습니다 [4, 6].
-
엘리먼트 타입에 따른 업데이트 방식
- 다른 타입의 엘리먼트: 루트 엘리먼트의 타입이 다르면(예:
<a>에서<img>로 변경), React는 이전 트리를 완전히 파괴하고 새로운 트리를 처음부터 다시 구축하며, 이때 이전 트리와 연관된 상태(State)는 모두 소실됩니다 [4, 7]. - 동일한 타입의 DOM 엘리먼트: 동일한 타입일 경우 기반이 되는 DOM 노드를 그대로 유지하고, 변경된 속성이나 스타일(예:
className,color)만 업데이트합니다 [8, 9]. - 동일한 타입의 컴포넌트 엘리먼트: 컴포넌트 인스턴스가 동일하게 유지되어 렌더링 간에 상태가 보존됩니다 [9]. 새로운 엘리먼트에 맞춰 props를 업데이트한 후
render()메서드를 호출하고, 그 결과에 대해 비교 알고리즘을 재귀적으로 수행합니다 [9, 10].
- 다른 타입의 엘리먼트: 루트 엘리먼트의 타입이 다르면(예:
-
자식 노드 재귀 처리와
key의 역할- React가 자식 노드들을 순회할 때, 기본적으로 두 리스트를 동시에 순회하며 차이가 있을 때마다 변이(mutation)를 생성합니다 [10].
- 목록의 맨 앞에 새로운 엘리먼트가 추가되는 경우, 순서가 밀린 모든 자식 노드를 변경해야 하므로 성능이 크게 저하될 수 있습니다 [11].
- 이를 해결하기 위해
key속성을 부여하면, React는 원래 트리의 자식과 새로운 트리의 자식을 효율적으로 매치하여 기존 엘리먼트를 그대로 이동시킬 수 있습니다 [11, 12]. 단, 배열의 인덱스를 키로 사용하면 항목이 재정렬될 때 컴포넌트의 상태가 꼬이는 등의 문제가 발생할 수 있습니다 [12, 13].
🔗 Knowledge Connections
- Related Topics: Fiber Architecture, DOM (Document Object Model), Critical Rendering Path
- Projects/Contexts: React
- Contradictions/Notes: 초기 구현이나 단순화된 개념에서는 '새롭게 계산된 가상 DOM'과 '이전 가상 DOM'을 직접 비교한다고 설명하지만, React는 단일 자식 노드가 여러 곳에서 공유되는 문제를 해결하기 위해 현재 설치된 상태를 나타내는 변경 가능한(mutable) "증강된 DOM(augmented DOM)"인 Fiber 데이터 구조를 생성하여 활용합니다 [14, 15].
Last updated: 2026-04-25