Virtual DOM은 Real DOM의 가벼운 사본과 같다.
- Real DOM은 Browser에서 생성되는 Document Object Model을 가리키는 용어, Virtual DOM과 구분하기 위해 사용
DOM은 브라우저가 HTML 문서를 조작할 수 있도록 트리 구조화한 객체 모델
<html>, <head>, <body>와 같은 태그들에 접근하고 조작할 수 있도록 문서를 트리 구조로 객체화한 것을 의미.

DOM이 변경되고 업데이트가 된다는 것은 결국 브라우저의 렌더링 엔진 또한 리플로우(Reflow)한다는 것을 의미.


⭐️ DOM 조작으로 인한 브라우저의 리플로우가 발생할 수 있다.
JS를 통한 DOM 조작이 많아질수록 이에 대한 리플로우가 발생하므로 DOM 업데이트 비용 커짐

위 이미지와 같이 6개의 콘텐츠가 있는 화면에서 단 1개의 콘텐츠만 변경되어야 한다고 가정

⭐️ 실제 DOM을 조작하는 경우, 변화가 필요하지 않은 요소도 변경될 수 있다.
프레임 드랍은 웹 애플리케이션에서 프레임 레이트(Frame Rate)가 떨어져 화면이 버벅대거나 부드럽게 표시되지 않는 것을 의미.
애플리케이션의 성능을 떨어뜨릴 수 있으며, 특히 DOM 조작이 빈번하게 일어날 때 더욱 발생할 가능성이 높다.
❗️ "바뀐 부분만 비교해서 그 부분만 렌더링할 수는 없을까?" 라는 아이디어를 기반으로 React의 Virtual DOM이 등장하게 되었다.

가상 DOM은 실제 DOM과 동기화되어, 상태가 변경될 때마다 가상 DOM을 새로 생성하여 이전 상태와 비교. 그리고 변경이 필요한 부분만 실제 DOM에 반영하여 업데이트하므로, 전체 UI를 다시 그리지 않아도 됩니다.
React에는 DOM 객체에 대응하는 가상의 DOM 객체가 있다.
상대적으로 무거운 DOM에 비해 React의 가상 DOM 객체는 JS 객체로 이루어져 있기 때문에 실제 DOM 객체와 동일한 속성을 가지고 있음에도 "훨씬 가벼운 사본"이라고 표현할 수 있다. 다만 가상 DOM 객체는 말 그대로 가상이기 때문에 비교를 위해 사용되며, 실제 DOM 객체처럼 화면에 표시되는 내용을 직접 변경하는 것은 아닙니다.

가상 DOM을 조작하는 것과 실제 DOM을 조작하는 것의 차이가 잘 이해가 안 간다면, 집을 이사할 때를 떠올려 볼 수 있습니다. 가상 DOM은 이삿날에 가구를 배치하기 전에 미리 가구 배치에 대해 생각해놓고, 실제로 배치하는 것과 같다.
가상 DOM은 추상화된 JS 객체의 형태를 가지고 있다. DOM 트리 하나를 예시로 살펴본다면

이 DOM 트리는 다음과 같이 JS 객체로도 표현이 가능하다.
const vDom = {
tagName: "html",
children: [
{ tagName: "head" },
{ tagName: "body",
children: [
tagName: "ul",
attributes: { "class": "list"},
children: [
{
tagName: "li",
attributes: { "class": "list_item" },
textContent: "List item"
}
]
]
}
]
}

동영상 사이트에서 특정 썸네일 클릭 시, 모달 플레이어가 생성되는 경우를 상상한다면
리액트에서는 다음과 같이 동작한다.

리액트는 상태를 변경하는 작업(ex. 이벤트)이 일어났을 때, 가상 DOM에 저장된 이전 상태와 변경된 현재 상태를 비교한다.

가상 DOM은 일반적으로 실제 DOM을 직접 조작하는 것보다 빠르다는 것이 맞지만, 모든 경우에 그렇지는 않다. 때로는 직접 DOM을 조작하는 것이 더 빠를 수 있다.
실제 DOM 조작이 느려지는 대부분의 경우는 DOM 조작이 발생할 때마다 브라우저에서 다시 레이아웃을 계산하고, 페이지를 다시 그리기 때문
-> 가상 DOM을 활용하여 실제 DOM 조작을 최소화하는 것이 성능 최적화의 핵심