Virtual DOM => 리액트의 주요 특성!!!
JavaScript를 사용하여 HTML 로 구성한 UI를 제어하면서 브라우저의 DOM Selector API를 사용하여 특정 DOM 을 선택한뒤, 특정 이벤트가 발생하면 변화를 주도록!
const number = document.getElementById('number');
사용자와의 인터랙션이 별로 없는 웹페이지라면 상관없겠지만, 만약에 인터랙션이 자주 발생하고, 이에 따라 동적으로 UI 를 표현해야된다면, 이러한 규칙이 정말 다양해질것이고, 그러면 관리하기도 힘들어질것이다.
대부분의 경우 웹 애플리케이션의 규모가 커지면, DOM 을 직접 건드리면서 작업을 하면 코드가 난잡해지기 쉽다.
처리해야 할 이벤트도 다양해지고, 관리해야 할 상태값도 다양해지고, DOM 도 다양해지게 된다면, 이에 따라 업데이트를 하는 규칙도 많이 복잡해지기 때문에, 조금 과장을 많이 하자면 코드가 다음과 같은 형태가 된다.

이를 가능하게 한 것 → Virtual DOM
Reconcilation), 다른 경우에만 해당하는 DOM 노드에 CRUD 작업을 수행한다.
위에서 설명했던 것처럼 기본적으로 virtual dom은 실제 DOM과 동일한 상태를 가지고 있으며, 표현하는 형식만 다르다.
1-1) 특정 컴포넌트에서 setState 호출 등의 이유로 컴포넌트 상태가 변하면 해당 컴포넌트의 shouldComponentUpdate 함수를 실행한다. 그리고 이 함수가 true를 반환하면 render 함수를 실행한다.
Note: shouleComponentUpdate 함수가 false 를 반환하면 이 컴포넌트의 render 함수를 실행하지 않고, 자식 컴포넌트의 shouldComponentUpdate, render 함수도 실행하지 않는다.
1-2) 상태가 변한 컴포넌트를 루트 노드로 해서 깊이 우선 탐색 방식(DFS)으로 각 자식 컴포넌트의 shouldComponentUpdate 함수와 render 함수를 실행한다.
2) 이렇게 render 함수를 실행하여 얻은 새로운 virtual dom을 실제 dom과 동일한 구조를 가진 이전 virtual dom과 비교하여 변경된 부분을 찾는다.(reconcilation: 재조정)
3) 실제 변경된 부분만 실제 DOM에 DOM API를 호출하여 반영한다. 브라우저가 변경 사항이 반영된 DOM과 CSSOM으로 새로운 Render Tree를 생성해서 화면을 다시 그린다.
업데이트 처리 간결성이다. 무조건적으로 리액트를 사용하는 것이 아닌 항상 기술적 타당성을 검토하며 개발하는 자세가 필요하다.