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