Virtual DOM(가상 DOM, Document Object Model)은 화면이 어떻게 생겨야 하는지를 메모리에 적어 둔 가벼운 JavaScript 객체 트리다. React에서는 React 엘리먼트 트리가 그것이다. 상태가 바뀌면 새 트리를 만들어 이전 트리와 비교하고, 달라진 부분만 실제 DOM에 반영한다.
상태 변경 → 컴포넌트 다시 실행 → 새 가상 트리
→ 이전 트리와 비교(diff, reconciliation) → 바뀐 노드만 실제 DOM에 commit- 실제 DOM 노드는 레이아웃·스타일·렌더링 엔진과 얽힌 무거운 객체다. 자주 직접 건드리면 리플로우와 리페인트가 반복된다
- 예:
<span>{count}</span>만 바뀌면 React는 그 텍스트 노드 하나만 고친다 - "Virtual DOM은 무조건 빠르다"는 오해다. 잘 짠 직접 DOM 조작이 더 빠를 수 있다. 진짜 가치는 개발자가 선언적으로 UI를 쓰기만 하면, 실제 DOM을 최소한으로 고치는 계산을 라이브러리가 맡아 준다는 데 있다
- 엄밀히 말하면 엘리먼트 하나하나는 "현재 렌더 결과"이고, Virtual DOM은 이전·현재 트리와 비교 알고리즘까지 포함한 개념에 가깝다
- 비교 규칙은 재조정(Reconciliation), 비교를 쪼개서 수행하는 엔진은 Fiber 아키텍처. Svelte처럼 가상 DOM 없이 컴파일 타임에 갱신 코드를 만드는 접근도 있다(Svelte)