Virtual DOM
- 실제 브라우저의 DOM 이 아닌 리액트가 관리하는 가상 DOM
- 브라우저가 해석하는 대상이 아니기 때문에 reflow와 repaint를 수행하지 않음
- 일단 메모리에 저장하고 리액트가 실제 변경에 대한 준비가 완료됐을 때, 실제 브라우저 DOM에 반영
- 메모리에서 계산하는 과정을 거치면 렌더링 과정을 최소화 할 수 있고 브라우저와 개발자의 부담을 덜 수 있다.
- 자바스크립트 객체로 관리
render
- 함수(컴포넌트)를 호출하여 Virtual DOM(객체)으로 만드는 것
- 뷰가 어떻게 생겼고, 어떻게 작동하는지에 대한 정보를 지닌 객체를 반환
- 내부에 있는 컴포넌트들을 재귀호출을 통해 렝더링을 진행
리-렌더링
- UI를 갱신하거나 새로고침 하는 과정
- 컴포넌트의 상태(State)나 속성(Props)이 변경되어 화면을 갱신하는 과정을 의미
- 변경된 부분만을 감지하여 최소한의 업데이트만 수행 -> 가상돔 사용
리액트 렌더링 방식
- 리액트에서의 렌더링이란, 트리 안에 있는 모든 컴포넌트들이 현재 자신들이 가지고 있는 props, state 의 값을 기반으로 어떻게 UI를 구성하고 이를 바탕으로 어떤 DOM의 결과를 브라우저에게 제공할 것인지 계산하는 일련의 가정
React 렌더링 프로세스
- 리액트는 2단계에 거쳐 화면에 UI 를 렌더링 함
- Render : 컴포넌트를 계산하고 업데이트 사항을 파악하는 단계
- Commit : 변경사항을 실제 DOM에 반영하는 단계
1. Render 과정
- 포넌트를 호출해 결과값을 계산
- React Element 들을 모아 Virtual DOM(객체) 생성
- Virtual DOM : 리액트 엘리먼트라고 부르는 객체 값의 모임
가상돔 → 메모리에만 존재하며, 실제 돔에 바로 적용되지 않음
- 사용자에게 노출되지 않는 모든 비동기 작업을 수행
결론 : React 컴포넌트를 호출하여 Virtual DOM 이라는 객체 값으로 변환하는 과정

2. Commit 과정
1. Virtual DOM 을 실제 DOM 에 반영 (더블 버퍼링 기법)
2. 동기적으로 일어남

복잡하게 이러는 이유
- 개발자가 직접 DOM을 수동으로 하나하나 변경해야 한다면, 어떤 값이 변경되었는지 파악하기 어려울 것. 이러한 어려움을 리액트 내부에서 알아서 관리해 줌으로써, 효율적으로 유지보수하고 관리할 수 있게 된 것이다.
업데이트 발생
- Render 과정을 처음부터 다시 실행 → 새로운 Virtual DOM 생성
- Next Virtual DOM ↔ Prev Virtual DOM 의 차이점 비교 ⇒ diffing 알고리즘이 사용됨
- 계산된 차이점을 실제 DOM 에 한꺼번에 업데이트

재조정
재조정
- 동시에 발생한 업데이트를 모아 한번만 DOM 을 수정
- 이전 렌더링 결과와 현재 렌더링(업데이트) 결과를 비교하여 변경된 부분을 갱신하는 작업
- 리렌더링 후 엘리먼트 자체가 달라졌을 때
- 리렌더링 후 동일한 엘리먼트 순서가 달라졌을 때