<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://www.gaonwiki.com/w/index.php?action=history&amp;feed=atom&amp;title=%EA%B0%80%EC%83%81_DOM</id>
	<title>가상 DOM - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://www.gaonwiki.com/w/index.php?action=history&amp;feed=atom&amp;title=%EA%B0%80%EC%83%81_DOM"/>
	<link rel="alternate" type="text/html" href="https://www.gaonwiki.com/w/index.php?title=%EA%B0%80%EC%83%81_DOM&amp;action=history"/>
	<updated>2026-07-20T20:23:57Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://www.gaonwiki.com/w/index.php?title=%EA%B0%80%EC%83%81_DOM&amp;diff=107678&amp;oldid=prev</id>
		<title>Gaon12: 시작</title>
		<link rel="alternate" type="text/html" href="https://www.gaonwiki.com/w/index.php?title=%EA%B0%80%EC%83%81_DOM&amp;diff=107678&amp;oldid=prev"/>
		<updated>2024-11-30T07:38:19Z</updated>

		<summary type="html">&lt;p&gt;시작&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 개요 ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;가상 DOM(Virtual DOM)&amp;#039;&amp;#039;&amp;#039;은 [[자바스크립트]] 라이브러리나 프레임워크([[리액트]], [[Vue]], [[Angular]] 등)에서 DOM(Document Object Model)을 효율적으로 관리하고 업데이트하기 위해 사용하는 기술이다. 가상 DOM은 실제 DOM의 가벼운 사본을 메모리에 생성하여 변경 사항을 빠르게 처리하고, 이를 실제 DOM에 반영한다.&lt;br /&gt;
&lt;br /&gt;
이 접근 방식은 [[리액트]]가 대중화한 개념으로, UI 렌더링의 성능을 개선하고 개발자의 생산성을 높이기 위해 설계되었다.&lt;br /&gt;
&lt;br /&gt;
== 작동 원리 ==&lt;br /&gt;
가상 DOM은 다음과 같은 단계를 통해 동작한다:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;가상 DOM 생성&amp;#039;&amp;#039;&amp;#039;: 애플리케이션의 상태에 따라 가상 DOM을 메모리에 생성한다. 이는 실제 DOM과 동일한 구조를 가지지만, 메모리에서만 존재하는 객체이다.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;변경 사항 탐지&amp;#039;&amp;#039;&amp;#039;: 애플리케이션의 상태가 변경되면 새로운 가상 DOM을 생성한다. 이전 가상 DOM과 새로운 가상 DOM을 비교(diffing)하여 변경된 부분을 탐지한다.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;실제 DOM 업데이트&amp;#039;&amp;#039;&amp;#039;: 변경된 부분만 실제 DOM에 적용(patching)한다. 이 과정을 통해 전체 DOM을 다시 그리는 과정을 줄이고 성능을 최적화한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const element = React.createElement(&amp;#039;h1&amp;#039;, null, &amp;#039;Hello, world!&amp;#039;);&lt;br /&gt;
// 가상 DOM을 생성&lt;br /&gt;
console.log(element);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 특징 ==&lt;br /&gt;
가상 DOM은 다음과 같은 특징을 가진다:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;효율성&amp;#039;&amp;#039;&amp;#039;: 실제 DOM 업데이트는 비용이 많이 드는 작업이다. 가상 DOM을 통해 변경 사항을 메모리에서 먼저 처리함으로써 실제 DOM의 업데이트 횟수를 줄인다.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;추상화&amp;#039;&amp;#039;&amp;#039;: 개발자는 DOM 조작을 직접 처리하지 않고, 선언적으로 UI를 작성할 수 있다.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;디버깅 용이&amp;#039;&amp;#039;&amp;#039;: 가상 DOM을 사용하면 UI 상태를 예측 가능하게 만들고, 상태 변경 시의 동작을 추적하기 쉽다.&lt;br /&gt;
&lt;br /&gt;
== 장단점 ==&lt;br /&gt;
=== 장점 ===&lt;br /&gt;
* 변경 사항을 효율적으로 처리하여 성능을 개선한다.&lt;br /&gt;
* 선언적 프로그래밍 방식으로 코드의 가독성과 유지보수성을 높인다.&lt;br /&gt;
* 크로스 브라우저 호환성을 보장한다.&lt;br /&gt;
&lt;br /&gt;
=== 단점 ===&lt;br /&gt;
* 작은 프로젝트에서는 가상 DOM의 도입이 오히려 복잡성을 증가시킬 수 있다.&lt;br /&gt;
* 대규모 애플리케이션에서는 diffing 알고리즘의 비용이 무시할 수 없을 만큼 커질 수 있다.&lt;br /&gt;
* 가상 DOM은 만능이 아니며, 특정 상황에서는 수동으로 DOM을 조작하는 것이 더 효율적일 수 있다.&lt;br /&gt;
&lt;br /&gt;
== 가상 DOM을 사용하는 프레임워크 ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[React]]&amp;#039;&amp;#039;&amp;#039;: 가상 DOM 개념을 대중화시킨 대표적인 프레임워크. UI 업데이트를 효율적으로 처리하기 위해 Virtual DOM을 활용한다.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[Vue]]&amp;#039;&amp;#039;&amp;#039;: Vue는 가상 DOM을 사용하면서도 직접 DOM 조작을 허용하는 옵션을 제공하여 유연성을 보장한다.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[Preact]]&amp;#039;&amp;#039;&amp;#039;: 리액트와 유사한 API를 가진 경량 라이브러리로, 가상 DOM을 활용한다.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[Angular]]&amp;#039;&amp;#039;&amp;#039;: Angular도 가상 DOM을 사용하지만, [[Zone.js]]와 변경 감지를 통해 가상 DOM 사용 여부를 내부적으로 최적화한다.&lt;br /&gt;
&lt;br /&gt;
== 대안 ==&lt;br /&gt;
최근에는 가상 DOM 대신 다른 방식으로 성능을 개선하는 시도가 있다:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[Svelte]]&amp;#039;&amp;#039;&amp;#039;: 컴파일 타임에 DOM을 직접 조작하는 코드를 생성하므로, 가상 DOM을 사용하지 않는다.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Incremental DOM&amp;#039;&amp;#039;&amp;#039;: [[Google]]에서 개발한 방식으로, DOM 업데이트를 직접 제어한다.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Fine-Grained Reactivity&amp;#039;&amp;#039;&amp;#039;: [[Solid.js]]와 같은 라이브러리는 상태 변경에 따른 영향을 세밀하게 추적하여 필요한 부분만 업데이트한다.&lt;br /&gt;
&lt;br /&gt;
== 기타 ==&lt;br /&gt;
가상 DOM이 항상 실제 DOM보다 빠른 것은 아니다. 성능은 애플리케이션의 구조와 규모, 상태 변경 패턴에 따라 달라진다. 예를 들어, 작은 규모의 애플리케이션에서 간단한 요소를 업데이트할 때는 실제 DOM을 직접 조작하는 것이 더 효율적일 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- 실제 DOM을 직접 조작하는 예시 --&amp;gt;&lt;br /&gt;
&amp;lt;button onclick=&amp;quot;document.getElementById(&amp;#039;message&amp;#039;).textContent = &amp;#039;안녕하세요!&amp;#039;;&amp;quot;&amp;gt;&lt;br /&gt;
  클릭하세요&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;p id=&amp;quot;message&amp;quot;&amp;gt;여기를 클릭해보세요.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
반면에, 가상 DOM을 사용하면 오히려 불필요한 연산이 추가될 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// React를 사용한 가상 DOM 예시&lt;br /&gt;
function App() {&lt;br /&gt;
  const [message, setMessage] = useState(&amp;#039;여기를 클릭해보세요.&amp;#039;);&lt;br /&gt;
  return (&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
      &amp;lt;button onClick={() =&amp;gt; setMessage(&amp;#039;안녕하세요!&amp;#039;)}&amp;gt;클릭하세요&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;{message}&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
또한 가상 DOM의 도입으로 웹 애플리케이션 개발의 생산성과 유지보수성이 크게 향상되었으나, 불필요하게 남용되는 경우도 많다. 예를 들어, 단순한 정적 페이지에까지 가상 DOM 기반의 프레임워크를 적용하면 오히려 로딩 속도가 느려지고 복잡성이 증가할 수 있다. 따라서 애플리케이션의 특성과 요구사항에 맞게 적절한 도구를 선택하는 것이 중요하다.&lt;br /&gt;
&lt;br /&gt;
== 참고 자료 ==&lt;br /&gt;
* [https://react.dev React 공식 문서]&lt;br /&gt;
* [https://vuejs.org Vue 공식 문서]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- 분류 --&amp;gt;&lt;br /&gt;
[[분류:웹 개발]] [[분류:프론트엔드]]&lt;/div&gt;</summary>
		<author><name>Gaon12</name></author>
	</entry>
</feed>