Virtual DOM
virtual DOM์ ๋ฆฌ์กํธ๊ฐ ์ฌ์ฉํ๊ฒ ๋๋ฉด์ ์ ๋ช ํด์ก๋ค. ์ด ๊ธ์์ virtual DOM์ด ๋ฌด์์ธ์ง, DOM๊ณผ๋ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง, ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์์๋ณผ ๊ฒ์ด๋ค.
์ virtual DOM์ด ํ์ํ ๊น?
DOM์ ๋ ํํธ๋ก ๋๋์ด์ง๋ค.
๊ฐ์ฒด ๊ธฐ๋ฐ์ HTML document ํํ
๊ทธ ๊ฐ์ฒด๋ฅผ ์กฐ์ํ๋ API
๋ง์ฝ ์๋์ HTML์์ ์ฒซ ๋ฒ์จฐ ์์ดํ ์ ์ด๋ฆ์ "List item one"์ผ๋ก ๋ณ๊ฒฝํ๊ณ , ๋ ๋ฒ์งธ ์์ดํ ์ ์ถ๊ฐํ๋ค๊ณ ํด๋ณด์.
<!doctype html>
<html lang="en">
<head></head>
<body>
<ul class="list">
<li class="list__item">List item</li>
</ul>
</body>
</html>const list = document.querySelector(".list")
const firstItem = list.children[0]
firstItem.textContent = 'List item one';
const secondItem = document.createElement('li');
secondItem.classList.add('list__item');
secondItem.textContent = 'List item two';
list.appendChild(secondItem)DOM์ด 1998๋ ์ ์ฒ์ ๋์์ ๋๋ ํ์ด์ง์ ๋ด์ฉ์ ์์ฑํ๊ณ ์ ๋ฐ์ดํธํ๋๋ฐ DOM API๋ฅผ ํจ์ฌ ์ ๊ฒ ์์กดํ์๋ค.
์์ ๋ฒ์์์ ๊ฐ๋จํ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ด์ฐฎ์ง๋ง, ๋งค ์ด๋ง๋ค ํ์ด์ง์ ์ฌ๋ฌ ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐ๊พผ๋ค๋ฉด, ์ง์์ ์ธ query์ DOM์ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ๋งค์ฐ ๋น์ฉ์ด ๋ง์ด ๋ค๊ฒ ๋๋ค.
๊ฒ๋ค๊ฐ, ๋์ ๋ฒ์๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋น์ฉ์ด ํฐ operation์ ์ฌ์ฉํ๋ ๊ฒ์ด, ํน์ ๋ถ๋ถ์ ์ฐพ์์ updateํ๋ ๊ฒ๋ณด๋ค ๋ ๊ฐ๋จํ๋ค. ์๋์ ์์์ฒ๋ผ innerHTML๋ก ์ ์ฒด list๋ฅผ ๊ต์ฒดํ๋ ๊ฒ์ด ํจ์ฌ ๋ ๊ฐ๋จํ๋ค.
์ด ์์ ์์๋ ๋ ๋ฐฉ๋ฒ์์์ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ํฌ๊ฒ ๋๋๋ฌ์ง์ง๋ ์๋๋ค. ๊ทธ๋ฌ๋, ์น ํ์ด์ง๊ฐ ์ปค์ง์ ๋ฐ๋ผ, ํ์ํ ๋ถ๋ถ์ ์ฐพ์๋ด์ ์ ๋ฐ์ดํธํ๋๊ฒ ๋ ์ค์ํด์ง๋ค.
VDOM์ ๊ทธ๊ฑธ ํด๋
๋๋ค...
VDOM์ DOM์ ์์ฃผ ์ ๋ฐ์ดํธํด์ผํ๋ ๋ฌธ์ ๋ฅผ ์ข ๋ ์ฑ๋ฅ์ด ์ข์ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ํด ๋ง๋ค์ด์ก๋ค. DOM์ด๋ shadow DOM๊ณผ๋ ๋ค๋ฅด๊ฒ, VDOM์ ๊ณต์์ ์ธ ๋ช ์ธ๊ฐ ์กด์ฌํ์ง ์๋๋ค.
VDOM์ original DOM์ ๋ณต์ฌ๋ณธ์ผ๋ก ์๊ฐํ๋ฉด ๋๋ค. ์ด ๋ณต์ฌ๋ณธ์ด DOM API ์์ด ์์ฃผ ์กฐ์๋๊ณ ์ ๋ฐ์ดํธ๋๋ค. VDOM์ ๋ชจ๋ ์ ๋ฐ์ดํธ๊ฐ ์๋ฃ๋๋ฉด, original DOM์์ ์ด๋ ํ ๋ณํ๊ฐ ์ผ์ด๋์ผํ๋์ง๋ฅผ ๋ณผ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ , ๊ทธ ์์ญ์ ํน์ ํ์ฌ ์ต์ ํ๋ ๋ฐฉ์์ผ๋ก ๋ณํ๋ฅผ ๋ง๋ค์ด๋ผ ์ ์๋ค.
VDOM์ ์ด๋ป๊ฒ ์๊ฒผ๋
VDOM์ ์ผ๋ฐ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ด๋ค. ์๋์ DOM ํธ๋ฆฌ๋ JS ๊ฐ์ฒด๋ก ๋ํ๋ด์ง ์ ์๋ค. 
์ด๋ฌํ ๊ฐ์ฒด๋ฅผ VDOM์ด๋ผ๊ณ ์๊ฐํ ์ ์๋ค. DOM์ฒ๋ผ HTML document๋ฅผ ๊ฐ์ฒด ๊ธฐ๋ฐ์ผ๋ก ํํํ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋, ์ด๋ ์์ JS ๊ฐ์ฒด์ด๋ฏ๋ก, ์์ ๋กญ๊ณ ์์ฃผ ์กฐ์ํ ์ ์๋ค. ์ค์ DOM์ ๊ฑด๋ค์ด์ง ์์ผ๋ฉด์ ์กฐ์ํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ ์ฒด ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค, VDOM์ ์์ ๋ถ๋ถ์ ์์ ์ ํ๋ ๊ฒ์ด ๋ ์ผ๋ฐ์ ์ด๋ค. ์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ list ์ปดํฌ๋ํธ๋ก ์์ ์ ํ๊ฒ ๋๋ค.
VDOM์ ์๋์์๋
VDOM์ DOM์ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ฑ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ ๊น?
VDOM์ DOM์์ ํ์ํ ๋ณํ๋ฅผ ์ฐพ์๋ด๊ณ , ํน์ ํ ๋ถ๋ถ์ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ์์ผ๋ก VDOM์ ์ฌ์ฉํ๋ค.
1. VDOM์ copy๋ฅผ ๋ง๋ค๊ธฐ
๋จผ์ ํ ์ผ์ VDOM์ ๋ณต์ฌ๋ณธ์ ๋ง๋๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์๋ ๋ณํ๋ฅผ ์ฃผ์ด์ผํ๋ ๋ถ๋ถ๋ค์ด ์ ์ฉ๋์ด์๋ค(list item two๊ฐ ์ถ๊ฐ๋จ!). ์ค์ DOM API๋ ํ์์๊ธฐ ๋๋ฌธ์, ๊ทธ๋ฅ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค.
์ด copy๋ ์๋์ VDOM(์ฌ๊ธฐ์๋ list)์ ๋น๊ตํ์ฌ diff๋ผ๋ ๊ฒ์ ์์ฑํ๋ค. diff๋ ์ด๋ฐ์์ผ๋ก ์๊ฒผ๋ค.
diff๋ ์ค์ DOM์ ์ด๋ป๊ฒ ๋ณ๊ฒฝ์ํฌ์ง๋ฅผ ์๋ ค์ค๋ค. ๋ชจ๋ diff๊ฐ ๋ชจ์ฌ์ง๊ฒ ๋๋ฉด, DOM์ ํ์ํ ๋ถ๋ถ๋ง์ ์ ๋ฐ์ดํธ์ํจ๋ค.
์๋ฅผ๋ค์ด, ๊ฐ diff๋ฅผ ํ์ธํ์ฌ, ์๋ก์ด child๋ฅผ ์ถ๊ฐํ๊ฑฐ๋, ๊ธฐ์กด ๊ฒ์ ๋ณ๊ฒฝํ๋ ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
์ถ์ฒ
Last updated