💡 리액트는 가상돔(Virtual DOM)을 사용해 보다 효율적으로 우리가 원하는 페이지를 브라우저에 빠르게 그려준다
-
실제 DOM과 같은 내용을 담고 있는
복사본
(JS 객체 형태
로메모리
안에저장
) -
실제 DOM과 다르게 브라우저 화면의 UI를 직접 조작할 수 없음
-
변화 한 부분
만 브라우저에게 알려실제 DOM에 적용
// 전
<div>
<h1>제목</h1>
</div>
// 후
<div>
<h1>제목</h1>
<p>내용</p>
</div>
⇒ p태그가 추가되었다면 브라우저에게 <div>
, <h1>
, <p>
를 모두 전달하는 것이 아니라 <p>
의 변화를 알려 <p>
만 DOM에 추가
사실 DOM은 트리구조이기 때문에 알고리즘을 사용하면 DOM안의 정보를 조작하는 건 그다지 무거운 작업이 아님
그러나 매번 DOM을 조작할때마다 브라우저 화면의 UI를 새롭게 그려주는 작업
(리플로우, 리페인트)은 오래 걸리고 이는 성능에 악영향
을 줌
이에 가상돔을 사용하여 변화된 부분만 DOM에 업데이트 시켜 그려줌
⇒ 사용자가 느끼기에 빠르고 사용 경험이 좋음
리엑트는 항상
두개의 가상돔
객체를 가지고 있음
렌더링 이전
화면 구조를 나타내는 가상돔렌더링 이후
에 보이게 될 화면 구조를 나타내는 가상돔
- 정확히 어떤 Element가 변했는지를 비교
- 이 과정을
Diffing
라고 함
⇒ 해당 과정을 통틀어 Reconciliation(재조정)이라고 함
-
루트
나부모
요소에서 변경이 발생하면 React는 모든 자식 요소를 변경된 것으로 간주하여 재조정 프로세스를 시작 -
자식들을 재귀적으로 처리할 때(
li
) 각 요소에 대한 수정, 추가 또는 삭제를 신중하게 분석함 이때 key를 사용하기 때문에 성능향상을 위해 key 사용을 권장
컴포넌트가 여러 번 업데이트 되더라도 실제 DOM 요소에 접근하는 것을 최소화하여 성능을 최적화 하는 기능
변경된
모든 Element
들을 집단화
시켜 이를 한번에
DOM에 적용
Ex) 리스트안에 10개의 항목이 바뀌었다면 실제 DOM을 10번 반복해 수정하는 것이 아닌, 한 번에 집단화시켜 이를 적용