DOM ๊ณผ Virtual Dom

๐Ÿค” ์˜๋ฌธ

์ด์ „ Kotlin์œผ๋กœ ๊ฐ„๋‹จํ•œ ๋กœ์ŠคํŠธ์•„ํฌ ์œ ์ €๊ฒ€์ƒ‰ ์•ฑ์„ ๋งŒ๋“  ๋’ค, ์ทจ๋ฏธ? ๊ฐœ๋…์œผ๋กœ React๋ฅผ ์จ์„œ ์กฐ๊ธˆ ๋” ๊ทœ๋ชจ์žˆ๊ฒŒ ์›น ์•ฑ์„ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค. ๋ฌผ๋ก .. ๊ณต์‹์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” API๊ฐ€ ์•„๋‹ˆ๋ผ ์™„์„ฑ๋œ DOM์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋œฏ์–ด์„œ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์€ ์ข€ ๊ฑธ๋ฆฌ๋”๋ผ ใ…Žใ…Ž; ๊ทธ๋ž˜๋„ ์žฌ๋ฏธ๋Š” ์žˆ์œผ๋‹ˆ ๋‹คํ–‰

๊ตฌ๊ธ€๋ง ์ค‘ React์™€ ๊ด€๋ จ์ด ๊นŠ๋‹ค๋Š” Virtual DOM์ด๋ผ๋Š” ์šฉ์–ด๋ฅผ ๋ณด์•˜๋Š”๋ฐ, React๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ๋„ ํ•ด๋‹น ์šฉ์–ด๊ฐ€ ๋‚ฏ์„ค์–ด์„œ ์•Œ์•„๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

DOM

๊ธฐ๋ณธ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” View ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•  ๋•Œ, HTML Elements๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๊ตฌ์กฐ๋ฅผ ์งœ๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ทธ๊ฒƒ์„ ์ฝ๊ณ  ๋ Œ๋”๋ง์„ ํ•˜๊ฒŒ๋œ๋‹ค.



์ดํ›„ ์šฐ๋ฆฌ๋Š”
document.getElementById('Hello').innerHTML = '์•ˆ๋…•' // ์ฒซ๋ฒˆ์งธ ๋ Œ๋”๋ง
document.body.style.background = 'tomato' // ๋‘๋ฒˆ์งธ ๋ Œ๋”๋ง

์ด๋Ÿฐ์‹์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋– ํ•œ ์š”์ฒญ์„ ํ•˜์˜€์„ ๋•Œ, DOM์— ์ง์ ‘์ ์œผ๋กœ ๋ณ€ํ™”๋ฅผ ์ค˜ ์™”๋‹ค.



๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ์—..
document.getElementById('Hello').innerHTML = '์•ˆ๋…•';
document.body.style.background = 'tomato';
document.getElementById('Hello').innerHTML = '์•ˆ๋…•ํ•˜';
document.body.style.background = 'blue';
document.getElementById('Hello').innerHTML = '์•ˆ๋…•ํ•˜์„ธ';
document.body.style.background = 'yellow';
...

์ด๋ ‡๊ฒŒ 100๊ฐœ์˜ ๋ณ€๊ฒฝ์ด ์žˆ๋‹ค๊ณ ํ•˜๋ฉด DOM์€ ๋ช‡๋ฒˆ ๋ Œ๋”๋ง์ด ๋˜๋Š”๊ฑธ๊นŒ..?

Virtual DOM

Virtual DOM์ด๋ž€ DOM์„ ์ถ”์ƒํ™”ํ•œ ๊ฐ€์ƒ์˜ ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋งŒ๋“ค์–ด๋†“๋Š”๊ฒƒ์ด๋‹ค.

์œ„์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด DOM์— ์ง์ ‘์ˆ˜์ •ํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ค‘๊ฐ„๋‹จ๊ณ„๋กœ Virtual DOM์„ ์ˆ˜์ •ํ•˜๊ณ , Virtual DOM์—์„œ ๊ธฐ์กด์˜ ๊ฐ’๊ณผ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ๊ฐ์ง€ํ•˜์—ฌ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝ์„ ์‹œํ‚จ๋‹ค.

์ด ๋•Œ, React๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ํ•  ๋•Œ, ๋…ธ๋“œ๊ฐ„์˜ ์†์„ฑ ๋น„๊ต ๋“ฑ์œผ๋กœ ๊ตฌ๋ถ„์„ ํ•˜๋Š”๋ฐ, map๊ณผ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋กœ ๋น„์Šทํ•œ ๊ตฌ์กฐ์˜ ๋…ธ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์ƒ์„ฑ๋  ๊ฒฝ์šฐ ๊ณ ์œ ํ•œ ๊ฐ’์„ key๋กœ ํ•˜์—ฌ ๊ตฌ๋ถ„์ง“๋Š”๋‹ค.

์ƒ์„ฑ๋˜๋Š” DOM๋…ธ๋“œ๋“ค์˜ ๋ณ€ํ™”๊ฐ€ ์—†์ด ์ •์ ์ด๋ผ๋ฉด map์—์„œ ์ œ๊ณตํ•˜๋Š” index๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜์ง€๋งŒ, ๋ณ€ํ™”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” id๊ฐ™์€ ๊ณ ์œ ํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๋‹ˆ, input text์™€ ๊ฐ™์€ ๋…ธ๋“œ๋“ค์˜ index๊ฐ€ ๋ฐ”๋€Œ๋‹ˆ ์ž…๋ ฅํ•œ ๊ฐ’๋“ค์€ ์ด๋™๋˜์ง€ ์•Š๊ณ  ์•„๋ž˜๋กœ ๋ˆ„๋ฝ๋˜๋Š”? ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Œ

์–ด์ฉ„๋“ , Virtual DOM์€ SPA ํŠน์„ฑ์ƒ DOM์— ๋ Œ๋”๋ง์ด ์ง€์†์ ์œผ๋กœ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š”์ ์— ๋Œ€ํ•ด reflow๊ฐ€ ์—ฌ๋Ÿฌ๋ฒˆ, ๋งŽ์ด, ๋ชจ๋“  ๋…ธ๋“œ์— ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ์ƒ์˜ ๋ฌธ์ œ๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด, ํ•„์š”ํ•œ๋ถ€๋ถ„๋งŒ, ๋ณ€ํ™”๋ฅผ ๋ชจ์•„์„œ ์ผ๊ด„์ฒ˜๋ฆฌํ•ด์ฃผ์–ด ์„ฑ๋Šฅ๊ฐœ์„ ์— ๋„์›€์„ ์ค€๋‹ค๊ณ  ํ•œ๋‹ค.

์˜์ƒ


@SangMin
๐Ÿ‘† H'e'story

๐Ÿš€GitHub