

웹 기술에 대한 정보를 제공하는 MDN에서는 DOM에 대해 다음과 같이 설명하고 있습니다.
"구조화된 표현"이라는 용어는 다소 추상적일 수 있으나, 자바스크립트가 웹 문서에 접근하고 조작할 수 있도록 돕는 매개체라는 점은 분명합니다. 또한, 객체 모델이라고 언급된 바, DOM은 객체 형태로 존재합니다.
웹 페이지의 구성 요소를 "객체"로 표현해야 하는 이유는 무엇일까요? 그 이유는 자바스크립트를 통해 동적으로 조작할 수 있기 때문입니다. 현대의 웹 페이지는 사용자와의 상호작용을 위한 다양한 요소들(버튼, 입력 필드, 모달 등)로 가득 차 있으며, 이러한 요소들은 자바스크립트를 통해 즉각적으로 조작되어야만 인터랙션에 따라 변화하는 UI를 효과적으로 제공할 수 있습니다.
Virtual DOM이 등장한 배경을 이해하기 위해서는 브라우저가 HTML을 처리하여 화면에 그리는 과정을 살펴볼 필요가 있습니다.
브라우저의 렌더링 vs 리액트 렌더링
브라우저에서의 "렌더링"과 리액트에서의 "렌더링"은 서로 다른 개념입니다. 브라우저의 렌더링은 DOM과 CSSOM을 파싱하여 렌더 트리를 생성하고 화면에 그리는 과정을 의미하는 반면, 리액트에서의 "렌더링"은 브라우저에 전달할 DOM을 생성하는 과정을 의미합니다.
브라우저의 렌더링 과정은 다음과 같은 순서를 거칩니다.
사용자가 페이지의 특정 부분만 최신 데이터로 업데이트하고자 버튼을 클릭하였을 때, 페이지 전체가 새로 고침된다면 얼마나 불편할까요? 이처럼 Render Tree가 자주 업데이트되면 레이아웃과 페인팅 과정이 빈번히 발생하여 성능 저하의 원인이 될 수 있습니다.
가상 DOM을 활용하면 실제 DOM의 변경을 최소화하고, 필요한 경우에만 Render Tree를 업데이트하여 효율성을 극대화할 수 있습니다. 이러한 점이 리액트가 가상 DOM을 채택한 핵심 이유입니다.
먼저 가상DOM은 실제 DOM의 복사본입니다. 브라우저에 DOM을 조작하는것이 아닌 복사본을 만들어 메모리에 저장하고 리렌더링이 발생햇을 때에는 새로운 가상DOM을 만들어 기존에 메모리에 저장해 둔 가상 DOM과 비교하여 바뀐 부분만 실제 DOM에 적용하는 메커니즘입니다.
기존의 전통적인 DOM 조작 방식에서는 변경된 부분뿐만 아니라 전체 렌더 트리를 수정해야 했고, 이로 인해 성능 문제가 발생했습니다. 반면, 리액트의 Virtual DOM은 내부 메커니즘(리액트 파이버, diffing 알고리즘) 변경된 부분만 효율적으로 처리하여 리플로우와 리페인트를 최소화함으로써 성능을 향상시키고 사용자 경험을 개선했습니다.