Reference: 브라우저 렌더링 원리에 대해 설명해주세요.
위 과정을 전부 렌더링 될 때 마다 다시해줘야함. (여기서 DOM 트리를 생성하는 것이 비효율 적인게 아니라 렌더링 하는 과정이 비효율적이다!)
예전에는 SSR(Server Side Rendering)을 사용하여 서버에서 데이터와 함께 완전한 페이지를 렌더링 해줬다. DOM은 이러한 정적인 페이지를 보여주는 용도였기 때문에 DOM의 동적인 변화가 그렇게 큰 문제는 아니었다.
SPA의 등장과 함께 CSR(Client Side Rendering) 방식이 많이 사용되면서 현재는 DOM 업데이트가 상당히 많이 발생하게 된다.
VirtualDOM은 DOM 노드 트리를 복제한 자바스크립트 객체이다. 쉽게 말하면 DOM의 가벼운 버전이다. → class, style등의 속성을 가지지만 DOM api 메서드(getElementById와 같은)를 가지지 않기 때문이다.
즉, 변화가 일어날 때마다 렌더링 하는 것이 아니라, 변화를 모두 모아서 한 번만 렌더링 하는 것이 핵심이다.
Reconciliation(재조정) → Previous VirtualDOM vs Current VirtualDOM 비교하여(Diffing 알고리즘 사용) Real DOM에 필요한 부분(PATCH) 체크
Diffing 알고리즘
Element들을 비교하게 되는데 Element는 (type, props) 두 가지 속성을 가진다.
const Element = {
type: "h1"
props: {
title: "foo"
},
}
Diffing 알고리즘은 두 가지 케이스로 분류된다.
Render Phase에서 체크했던 변경이 필요한 부분을 RealDOM에 반영해주는 부분이다. 만약, 변경이 필요한 부분이 없다면 Commit Phase는 스킵된다.