virtual DOM๊ณผ shadow DOM
virtual DOM๊ณผ shadow DOM์ ๋ธ๋ผ์ฐ์ ๋์์ ๋นํจ์จ์ฑ๊ณผ ๋ถํธํจ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋์จ ๊ตฌ์กฐ๋ค.
DOM (Document Object Model)
๊ทธ๋ผ ๋์ด ๋ญ๊ฐ?
html์ ์ํด ์ ์ธ๋๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ ์ด๋๋ ๋ธ๋ผ์ฐ์ ์น ํ์ด์ง์ ์์๋ค์ ๋งํ๋ค.
๊ทธ๋ฅ html์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์นํ์ค ์ด๊ธฐ์คํ์ผ๋ก ๋์จ ๊ฒ๋ค์ด ๋๋ถ๋ถ ๊ทธ๋ ๋ฏ์ด, ์ด๊ฒ๋ ๋์ฌ๋น ์ง์ฑ๋ก ๋ง๋ ๊ฑฐ๋ผ ๋ฌธ์ ๊ฐ ๋งค์ฐ ๋ง์๋ค.
๊ฐ์ฅ ํฐ ๋จ์ ์ ๋งค์ฐ ๋๋ฆฌ๋ค๋ ๊ฒ์ด์๋ค. ํนํ ์ฆ์ ๋ณ๊ฒฝ์ ์ผ์ด๋๋ ์ํ ์ฒ๋ฆฌ์ ๋ํ ๋ถ๋ถ์ด ๋งค์ฐ ๊ตฌ๋ ธ๋ค.
์ด์ ๋ํ ๋์์ผ๋ก ๋์จ๊ฒ์ด VDOM์ด๋ผ๋ ๊ฐ๋ ์ด๋ค.
๊ฒ๋ค๊ฐ ๋ญ๊ฐ ์ปดํฌ๋ํธ ๋จ์๋ก ๋ชจ๋ํ๋ฅผ ํ๋ ๊ฒ๋ ํ๊ณ๊ฐ ๋ง์๋ค.
์๋ฅผ ๋ค๋ฉด, CSS๋ฅผ ๋ณด๋ผ. ์ ์ญ์ ์ผ๋ก ์ ์๋๊ณ ๋ชจ๋ DOM ์์์ ์ฌ์ด๋์ดํํธ๋ฅผ ํฐ๋จ๋ฆฐ๋ค.
์ด๋ฐ๊ฑธ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ๊ฒ shadow DOM์ด๋ค.
V-DOM (Virtual DOM)
๊ฐ์๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค์ ์๋ฃจ์ ์ด๋ค.
React๋ฅผ ์์๋ก ํ ๋๋ถ๋ถ์ ํ๋์ ์ธ ํ๋ก ํธ์๋ ํ๋ ์์ํฌ๋ค์ด ๊ฐ์๋์ ๊ธฐ๋ฐํด์ ์์๋ฅผ ๊ด๋ฆฌํ๋ค. (Svelte๋ฅผ ์ ์ธํ๊ณ )
DOM์ด ๋๋ฌด ๊ตฌ๋ฆฌ๋๊น DOM์ ๋ฏฟ์ง ์๊ณ , ์์ฒด์ ์ธ v-DOM์ ๊ตฌํํด์ ๊ทธ๊ฑธ๋ก ์ํ๋ฅผ ์ ์ดํ๋ค๊ฐ ์ง์ง ๋ณ๊ฒฝ์ด ํ์ํ ์ํฉ์๋ง real-DOM์ ์ ๊ทผํ๋๋ก ํ๋ ๊ฒ์ด๋ค.
https://dev.to/iamusj/what-is-the-virtual-dom-2e0a
๋์ฒด๋ก ์ ๋์ํ๊ณ , ํฐ ๋ฌธ์ ๋ ์๋ค.
Shadow DOM
๋ฐ๋ฉด Shadow DOM์ ์นํ์ค ์์ค์์ ์ ๊ณตํ๋ ์๋ฃจ์
์ด๋ค.
V-DOM๊ณผ๋ ๋ชฉ์ ์ด๋ ์ฌ์ฉํํ๊ฐ ์ข ๋ค๋ฅด๋ค. ์ด๊ฑด ๋ ๋๋ง ์ฑ๋ฅ๊ณผ๋ ๊ด๊ณ๊ฐ ์๋ค. ์บก์ํ๋ฅผ ์ํ ๊ฒ์ด๋ค.
iframe์ ๋์ฒด์ฌ๋ก์ ์ ๊ณต๋๋ฉฐ, DOM ๊ตฌ์กฐ๋ฅผ ์บก์ํ๋ ์ฑ๋ก ์ ์ํ๊ณ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค.
๋ฃ์ํ๋ ์น ํ๋ ์์ํฌ์ธ Svelte์์ ์ด๊ฑธ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ๋ค๊ณ ํ๋ค.
์ฌ์ฉํํ๋ ์๋์ ๊ฐ๋ค.
์ง์ง DOM ๋ณ๊ฐ๋ก Shadow DOM Tree๋ฅผ ์ ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ํ ๋ Shadow DOM์ ์ง์ง DOM์ ํฉ์ณ์ ํํํ๋ ๊ฒ์ด๋ค.
shadow DOM ๋ด๋ถ์ ๋ชจ๋ ์ฝ๋๋ ๊ฒฉ๋ฆฌ๋์ด์, ์ธ๋ถ DOM์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
์ด๋ฐ ๊ฒฉ๋ฆฌ์ฑ์ด ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ด๋ค.
css๋ง์ ๋ style๋ฅผ ๋์ ์ผ๋ก ์์ฑํ๋ฉด shadow DOM ๋ด์ ๊ฒฉ๋ฆฌ๋๊ฒ ํ ์ ์๋ค.
์๋๋ ๊ทธ์ ๋ํ ๊ฐ๋จํ ์ฌ์ฉ๋ก๋ค.
<HTML>
<body>
<h1>HELLO!</h1>
<div id="elementRef"></div>
<script>
const elementRef = document.getElementById('elementRef');
const shadowRoot = elementRef.attachShadow({ mode: 'open' });
const para = document.createElement('p');
para.textContent = 'Hello from shadow DOM!';
shadowRoot.appendChild(para);
</script>
</body>
</HTML>
๋จผ์ shadow root๋ฅผ ๋ฐฐ์นํ Element๋ฅผ ํ๋ ๋ฌ์ผ ํ๋ค. ๊ทธ๊ฒ ์ ๊ธฐ์ elementRef๋ผ๋ div๋ค.
attachShadow๋ก shadow DOM์ ์์ฑํ๊ณ , ๊ฑฐ๊ธฐ๋ค๊ฐ ๋์ ํ๋ฏ์ด DOM ์ถ๊ฐ๋ค์ ํด์ฃผ๋ฉด ๊ทธ๋ง์ด๋ค.
๊ทธ๋ผ ์๋์ ๊ฐ์ด ์๋ํ ๊ฒ์ด๋ค.

๋ ์์ธํ ๊ฒ์ ๊ณต์๋ฌธ์๋ฅผ ์ฐธ์กฐํ๋ฉด ์ข๊ฒ ๋ค.
https://developer.mozilla.org/ko/docs/Web/API/Web_components/Using_shadow_DOM
์ฐธ์กฐ
https://developer.mozilla.org/ko/docs/Web/API/Web_components/Using_shadow_DOM