최근에 면접을 다니면서 받은 질문 중에 대답하지 못하거나 기본적인데 알지 못했던 것들에 대해 많이 공부 중이다. 그 중에 Virtual DOM
개념에 대해 react를 처음 공부했을 때 들어보기만하고 공부하지 않았는데 이에 대해 정리하고자 한다.
Virtual DOM
은 실제 DOM을 추상화한 복사본이다. 공식적인 정의가 아닌 개인적으로 내린 정의이다. 이를 이해하기 위해서는 DOM에 대해 알아야한다.
DOM(Document Object Model)
은 문서 객체 모델이라고 하고 순수 Text로 구성되어 있는 HTML파일을 파싱하여 문서의 구성요소들을 객체로 구조화한 것이다. 그렇다면 Virtual DOM이 왜 등장하였고 어떤 문제를 해결하기 위한 것인지 알아보자.
DOM을 직접적으로 조작하게 되면 계속해서 렌더링을 하게 되고, 그 만큼 PC의 메모리를 많이 사용하게 될 것이다. Virtual DOM이 이 문제를 해결하기 위해 등장한 기술이다.
브라우저가 렌더링을 하는 과정은 아래와 같다. 자세한 정리는 여기로
- HTML, CSS를 파싱하여 DOM, CSSOM객체를 생성한다.
- DOM, CSSOM을 합쳐 Render Tree를 만든다.
- Render Tree를 기준으로 Layout, Paint 작업을 한다.
이 과정에서 변경해야 할 요소가 10개가 있다면 10번을 렌더링을 해야하는 문제가 있다. 정확하게 10개의 변화가 있다고 10번을 렌더링 하는 것은 아니지만 비효율적이라는 뜻이다.
DOM을 직접적으로 조작하면서 변화가 생기면 계속해서 리렌더링되어 PC의 메모리 성능을 저하할 수 있는 문제를 해결하기 위해 Virtual DOM이 등장했다고 했다.
그렇다면 어떻게 해서 효율적으로 렌더링을 하게 해주는지 동작 원리를 알아보자.
Virtual DOM은 DOM을 추상화한 가상의 객체인데 이를 메모리에 만든다. Virtual DOM이 중간에서 변경 사항을 한 번에 모아서 이를 DOM과 비교하고(비교 알고리즘), 차이를 판단한 후에 변경된 부분만 변경을 한 후 1번의 렌더링이 일어난다.
예를 들어, 사용자의 이벤트에 의해 기존의<li>
태그가 10개가 페이지네이션된다고 생각하자. 그러면 10번의 렌더링이 일어나는 것이 아니라 Virtual DOM에서 10개의 <li>
가 변경이 되고, 이를 DOM과 비교한 후에 1번만 렌더링이 된다.