
가상 돔에 대해 변경된 부분만 실제 돔에 적용하여 성능을 향상시킨다 정도의 내용만 알고 있었는데 이번 기회로 가상 돔에 대해서 정리해서 실제 리액트 개발을 할 때 이해도를 좀 높이고자 합니다.
브라우저 동작 방식
브라우저는 HTML과 CSS를 파싱하여 각각 DOM, CSSOM을 생성한다.
이후 두 트리를 결합해 렌더 트리(Render Tree) 를 만들고,
레이아웃(Layout) → 페인트(Paint) → 합성(Composite) 단계를 거쳐 최종 화면에 그려낸다.
이 과정 중에서 DOM을 자주 조작하거나 스타일 속성이 자주 변경되면 리플로우(Reflow) 또는 리페인트(Repaint) 가 발생한다.
이는 브라우저 렌더링 성능에 부담을 주는 작업으로, 과도하게 일어나면 사용자 경험을 해칠 수 있다.
이 문제를 좀 해결하고자 virtual dom을 사용해 볼 수 있을 것이다.
Virtual DOM 이란?
Virtual DOM은 실제 DOM의 구조를 흉내 낸 메모리상의 JavaScript 객체 트리이다.
React는 컴포넌트를 렌더링할 때, 이 Virtual DOM을 생성하여 UI의 현재 상태를 메모리상에 저장하고,
변경이 발생하면 이전 Virtual DOM과 비교하여 실제 DOM에 필요한 부분만 최소한으로 반영한다.
예를 들어 아래와 같은 jsx문법이 있습니다.
function App() {
return (
<div id="app">
<h1>Hello, React!</h1>
<p>가상 DOM 예시입니다.</p>
</div>
);
}
위의 코드가 가상 dom 객체 구조로 나타내면 아래와 같은 모습이다
const virtualDOM = {
type: 'div',
props: {
id: 'app',
children: [
{
type: 'h1',
props: {
children: 'Hello, React!',
},
},
{
type: 'p',
props: {
children: '가상 DOM 예시입니다.',
},
},
],
},
};
Virtual DOM의 동작 방식
- 상태(state)나 props가 변경되면 새로운 Virtual DOM이 생성된다.
- 이전 Virtual DOM과 비교(diffing 알고리즘)하여 변경된 부분을 찾는다
- 실제 DOM에는 변경된 부분만 최소한으로 업데이트한다.
이렇게 함으로써 불필요한 리플로우와 리페인트를 줄이고 성능을 향상시킬 수 있다.
리액트 렌더링 과정은 아래 페이지에서 정리하였습니다.
https://express.tistory.com/22
[react] 리액트의 렌더링 정리
리액트를 사용하면서도 리액트의 렌더링 과정을 자세하게 알아본 적은 없었다.리액트로 사용된 코드는 브라우저에서 직접 실행할 수 없어서 javaScript코드로 변환하는 과정을 거쳐서 사용가능하
express.tistory.com
왜 사용하지?
1. 성능이 향상된다.
- 직접 DOM을 조작하면 리페인트, 리플로우 현상으로 인해 많은 리소스를 소모한다.
- 하지만 virtual dom을 사용하면 변경된 부분만 배치처리하여 성능이 향상된다.
2. 개발이 편해진다.
- 개발자가 ui의 현재 상태를 선언적으로 정의할 수 있다.
- 리액트가 이 선언된 상태를 기반으로 ui를 자동으로 업데이트해준다.
- 복잡한 dom조작을 하지 않아도 간결하게 코드를 작성할 수 있다.
const ul = document.createElement('ul');
items.forEach(item => {
const li = document.createElement('li');
li.textContent = item;
ul.appendChild(li);
});
document.body.appendChild(ul);
위와 같이 바닐라 자바스크립트로 작성하면 엘리먼트를 만들어주고 그 안에 텍스트와 태그를 이동하는 등의 복잡한 코드를 작성해야 한다.
<ul>
{items.map(item => <li>{item}</li>)}
</ul>
위 리액트 환경에서는 선언적으로 코드를 작성 시 리액트에서 알아서 처리해 준다.
결론
가상 dom에 대해 알아보았습니다. virtual dom이 사실 객체 트리라는 것과 이전의 가상 dom과 새 가상 dom을 비교하여 변경된 부분을 한 번에 실제 dom에 반영한다는 디테일한 사실을 새롭게 알게 되었다.
실제로 React를 사용할 때 상태 업데이트가 비동기적으로 처리되는 것처럼 동작해서
내가 예상했던 값과 실제 값이 달라 혼란스러웠던 경험이 있었다.
하지만 이번에 virtual dom의 배치 처리 개념을 정리하면서 React의 동작 방식을 더 깊이 이해할 수 있었고,
그동안 헷갈렸던 부분들이 명확하게 정리되어 많은 도움이 되었다.
참고문서
[번역] 리액트에 대해서 그 누구도 제대로 설명하기 어려운 것 – 왜 Virtual DOM 인가? | VELOPERT.LOG
리액트를 지난 2년간 사용하면서도 막상 말끔하게 설명하라고 하면 어려웠던 주제, 원래 번역글은 잘 안쓰지만 글 자체가 구성이 잘 되어있어서 글을 번역해보았습니다. 원본: https://hashnode.com/p
velopert.com
https://yong-nyong.tistory.com/80
[React] 가상 돔(Virtual DOM)이 무엇이고 왜 중요할까요?
📖 들어가며리액트가 뛰어난 성능을 보여줄 수 있는 비결 중 하나는 바로 가상 돔(Virtual DOM)입니다.이는 리액트의 핵심 개념 중 하나로 가상 돔에 대해 알아보겠습니다.DOM(Document Object Model)웹
yong-nyong.tistory.com
https://d2.naver.com/helloworld/2690975
3. Virtual DOM의 이해
### **Virtual DOM (가상 DOM)이란?** Virtual DOM(가상 DOM)은 UI 업데이트의 효율성을 극대화하기 위해 실제 DOM(Document Object…
wikidocs.net
'학습 > react' 카테고리의 다른 글
| [react] 배열 렌더링 했는데 key는 뭐야? (1) | 2025.08.10 |
|---|---|
| [react] 함수형 컴포넌트와 클래스형 컴포넌트 (3) | 2025.08.04 |
| [react] 리액트의 렌더링 정리 (1) | 2025.07.23 |
| 클론 프로젝트 회고2 (0) | 2024.05.18 |
| 클론 프로젝트 회고 (1) | 2024.02.12 |