렌더 엔진
이 이를 파싱하고 DOM node
로 이루어진 트리를 만든다. attachment
라고 부른다. DOM 트리의 모든 노드들은 attach
라는 메서드가 있다. 이 메서드는 스타일 정보를 계산해서 객체
형태로 반환한다.메모리상의 가상 DOM, 이 DOM 트리는 렌더링이 되지 않기 때문에 연산 비용이 적다.
"virtual" DOM을 제어하는 API를 직접 호출하지않고 Virtual DOM을 제어하는 것을 React나 Vue같은 프레임워크가 알아서 하도록 추상화했다는 얘기가 사실 더 정확하다.
(실질적인 DOM관리를 Virtual DOM이 한다.)
브라우저 작동방식은 DOM에 변화가 생기면 렌더트리를 재생성(그러면 모든 요소들의 스타일이 다시 계산 됨)하고 레이아웃을 만들고 페인팅하는 과정이 다시 반복되는 것이다.
그러면 복잡한 SPA에서는 DOM 조작이 많이 발생한다. 그 뜻은 그 DOM의 변화를 적용하기위해 브라우저가 많이 연산을 해야한단 소리고, 그것은 전체적인 프로세스를 비효율적으로 만든다.
여기서 Virtual DOM이 빛을 바란다. 만약 View에 변화가 있다면, 그 변화는 실제 DOM에 적용되기 전에 가장의 DOM에 먼저 적용을 시키고 그 최종적인 결과를 실제 DOM으로 전달해준다.
이로써, 브라우저 내에서 발생하는 연산의 양을 줄이면서 성능이 개선되는 것이다.
0.1초마다 화면에 데이터가 변경된다면? Virtual DOM으로 0.5초씩 모아가지고 렌더링을 적게할 수 있을까? → 안된다. 동시에 변경되는 것에 한해서만 렌더링된다.
React나 Vue등을 이용해서 Virtual DOM을 쓰면 무조건 빠른가? → 아니다. 똑같이 최적화를 해야한다. (슬라이드를 옮기거나 무한 스크롤등의 움직임이 있을 때는 Virtual DOM을 이용해서 반복 렌더링을 하지 않도록 해줘야한다.)