[React์‹ฌํ™”] Virtual DOM

ํ˜„์ฑ„์€ยท2023๋…„ 5์›” 22์ผ
0
post-thumbnail

๐Ÿ”– Virtual DOM


  • React๋Š” UI์˜ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ณ , ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚œ ์š”์†Œ๋“ค์„ ๋น ๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก Virtual DOM์ด๋ผ๋Š” ๊ฐ€์ƒ์˜ DOM ๊ฐ์ฒด๋ฅผ ํ™œ์šฉ

Virtual DOM์€ ์™œ ๋“ฑ์žฅํ–ˆ๋‚˜ ?

  • Virtual DOM์€ Real DOM์˜ ๊ฐ€๋ฒผ์šด ์‚ฌ๋ณธ๊ณผ๋„ ๊ฐ™์Œ
  • Real DOM์€ Browser์—์„œ ์ƒ์„ฑ๋˜๋Š” Document Object Model์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์šฉ์–ด
    (Virtual DOM๊ณผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์ด ์šฉ์–ด๋ฅผ ์‚ฌ์šฉ)

Real DOM (DOM)

  • DOM์ด๋ž€ Document Object Model์˜ ์•ฝ์ž
  • ๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ์„ ์˜๋ฏธ โžก๏ธ Javascript์™€ ๊ฐ™์€ ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด๊ฐ€ <html>, <head>, <body> ์™€ ๊ฐ™์€ ํƒœ๊ทธ๋“ค์— ์ ‘๊ทผํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฌธ์„œ๋ฅผ ํŠธ๋ฆฌ๊ตฌ์กฐ๋กœ ๊ฐ์ฒดํ™” ํ•œ ๊ฒƒ
    โžก๏ธ DOM์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML ๋ฌธ์„œ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํŠธ๋ฆฌ ๊ตฌ์กฐํ™”ํ•œ ๊ฐ์ฒด๋ชจ๋ธ

DOM์˜ ์กฐ์ž‘ ์†๋„๊ฐ€ ๋А๋ ค์ง€๋Š” ์ด์œ 

  • DOM์€ ๊ณ„์ธต์  ํ˜•ํƒœ์˜ ํŠธ๋ฆฌ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑ
  • ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘์—์„œ๋„ ํŠนํžˆ "๋ฐ์ดํ„ฐ ์ €์žฅ"์˜ ์˜๋ฏธ๋ณด๋‹ค๋Š” "์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋” ํšจ๊ณผ์ ์œผ๋กœ ํƒ์ƒ‰" ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ๋จ โžก๏ธ ๋น ๋ฅธ ์ž๋ฃŒ ํƒ์ƒ‰ ์„ฑ๋Šฅ์ด ์žฅ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ
  • ํŠธ๋ฆฌ๊ตฌ์กฐ๋กœ ๋œ DOM์€ Javascript์™€ ๊ฐ™์€ ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด๊ฐ€ ์ ‘๊ทผ, ํƒ์ƒ‰ํ•˜๋Š” ์†๋„๊ฐ€ ๋น ๋ฅด๊ธฐ ๋–„๋ฌธ์— ์—…๋ฐ์ดํŠธ ์†๋„ ๋˜ํ•œ ๋น ๋ฆ„

  • DOM์ด ๋ณ€๊ฒฝ๋˜๊ณ  ์—…๋ฐ์ดํŠธ๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ์€ ๊ฒฐ๊ตญ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ์—”์ง„ ๋˜ํ•œ ๋ฆฌํ”Œ๋กœ์šฐ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ
    • ๋ฆฌํ”Œ๋กœ์šฐ(reflow) : DOM ์š”์†Œ์˜ ๊ธฐํ•˜ํ•™์  ์†์„ฑ์ด ๋ณ€๊ฒฝ๋ ๋•Œ, ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์ด์ฆˆ๊ฐ€ ๋ณ€ํ• ๋•Œ, ์Šคํƒ€์ผ์‹œํŠธ๊ฐ€ ๋กœ๋”ฉ๋˜์—ˆ์„๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ณ€ํ™”๋“ค์„ ๋‹ค์‹œ ๊ณ„์‚ฐ ํ•ด์ฃผ๋Š” ์ž‘์—…์„ ๋œปํ•จ
      โžก๏ธ ๋ ˆ์ด์•„์›ƒ(Layout) ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.

  • ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ DOM ํŠธ๋ฆฌ์™€ CSSOM ํŠธ๋ฆฌ๋ฅผ ํ† ๋Œ€๋กœ Render ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ ,
    ๊ฐ ์š”์†Œ๊ฐ€ ๋ฐฐ์น˜๋  ๊ณต๊ฐ„์„ ๊ณ„์‚ฐํ•œ ๋’ค ์ด๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ ค๋ƒ„

  • ๋งŒ์•ฝ DOM์ด ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ์—…๋ฐ์ดํŠธ๋œ ์š”์†Œ์™€ ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ์ž์‹์š”์†Œ๋“ค์— ์˜ํ•ด DOMํŠธ๋ฆฌ๋ฅผ ์žฌ๊ตฌ์ถ•ํ•˜๊ฒŒ ๋จ

  • ๊ทธ ๊ณผ์ •์—์„œ ์ด์—๋Œ€ํ•œ ๋ ˆ์ด์•„์›ƒ ์žฌ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฆฌํ”Œ๋กœ์šฐ, ์ด๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ ค๋‚ด๋Š” Repaint๊ณผ์ •์„ ๊ฑฐ์น˜๊ฒŒ ๋จ
    โžก๏ธ ๋ณ€ํ™”๊ฐ€ ํ•„์š”์—†๋Š” ๋ถ€๋ถ„๋„ ๋ณ€๊ฒฝ๋˜๋ฉด์„œ ์žฆ์€ ๋ฆฌํ”Œ๋กœ์šฐ ๋ฐœ์ƒ์œผ๋กœ ์ธํ•ด ์„ฑ๋Šฅ์„ ๋–จ์–ด๋œจ๋ฆฌ๋Š” ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐ

  • Javascript๋ฅผ ํ†ตํ•œ DOM ์กฐ์ž‘์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ์ด์— ๋Œ€ํ•œ ๋ฆฌํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ DOM ์—…๋ฐ์ดํŠธ ๋น„์šฉ์ด ์ปค์งˆ ์ˆ˜ ์žˆ์Œ
    โžก๏ธ "๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ ๋น„๊ตํ•ด์„œ ๊ทธ ๋ถ€๋ถ„๋งŒ ๋ Œ๋”๋ง ํ•  ์ˆ˜๋Š” ์—†์„๊นŒ ?"

Virtual DOM ์ด๋ž€?


  • ๊ฐ€์ƒ DOM์€ ์‹ค์ œ DOM๊ณผ ๋™๊ธฐํ™” ๋˜์–ด , ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋งˆ๋‹ค ๊ฐ€์„ฑ DOM์„ ์ƒ์„ฑํ•˜์—ฌ ์ด์ „ ์ƒํƒœ์™€ ๋น„๊ต
  • " ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•˜์—ฌ ์—…๋ฐ์ดํŠธ ํ•จ " โžก๏ธ ์ „์ฒด UI๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆด ํ•„์š”๊ฐ€ ์—†์Œ
  • React์—๋Š” DOM ๊ฐ์ฒด์— ๋Œ€์‘ํ•˜๋Š” ๊ฐ€์ƒ์˜ DOM๊ฐ์ฒด๊ฐ€ ์žˆ์Œ
  • ์ƒ๋Œ€์ ์œผ๋กœ ๋ฌด๊ฑฐ์šด DOM์— ๋น„ํ•˜์—ฌ ํ›จ์”ฌ ๊ฐ€๋ฒผ์šด ์‚ฌ๋ณธ์ž„
    โžก๏ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ !
  • ๊ฐ€์ƒ DOM๊ฐ์ฒด๋Š” ๋ง ๊ทธ๋Œ€๋กœ ๊ฐ€์ƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋น„๊ต๋ฅผ ์œ„ํ•ด์„œ๋งŒ ์‚ฌ์šฉ
    โžก๏ธ ์‹ค์ œ DOM ๊ฐ์ฒด์ฒ˜๋Ÿผ ํ‘œ์‹œ๋˜๋Š” ๋‚ด์šฉ์„ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹˜

์˜ˆ์‹œ๋กœ ์‚ดํŽด๋ณด๋Š” Virtual DOM

  • ๊ฐ€์ƒ DOM์„ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ๊ณผ ์‹ค์ œ DOM์„ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์˜ ์ฐจ์ด๋ฅผ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณธ๋‹ค๋ฉด
    ์ง‘์„ ์ด์‚ฌ๊ฐˆ๋•Œ๋ฅผ ๋– ์˜ฌ๋ ค ๋ณผ ์ˆ˜ ์žˆ์Œ
  • ๊ฐ€์ƒ DOM์€ ์ด์‚ฟ๋‚  ๊ฐ€๊ตฌ ๋ฐฐ์น˜ ์ „ ๋ฏธ๋ฆฌ ๊ฐ€๊ตฌ๋ฐฐ์น˜์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด๋†“๊ณ  ์‹ค์ œ๋กœ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Œ โžก๏ธ ๋ฏธ๋ฆฌ ๋ฐฐ์น˜๋ฅผ ๋จธ๋ฆฌ์†์œผ๋กœ ๊ตฌ์ƒํ•ด ๋†“๋Š” ๊ฒƒ ?

Virtual DOM์˜ ํ˜•ํƒœ

  • ๊ฐ€์ƒ DOM์€ ์ถ”์ƒํ™”๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

์œ„ DOMํŠธ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด Javascript ๊ฐ์ฒด๋กœ๋„ ํ‘œํ˜„ ๊ฐ€๋Šฅ

const vDom = {
	tagName: "html",
	children: [
		{ tagName: "head" },
		{ tagName: "body",
			children: [
				tagName: "ul",
				attributes: { "class": "list"},
				children: [
					{
						tagName: "li",
						attributes: { "class": "list_item" },
						textContent: "List item"
					}
				]
			]
		}
	]
}
  • ์œ„ DOM์„ ๊ฐ€์ƒ DOM์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณด๋ฉด, ์‹ค์ œ DOM๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ€์ƒ DOM ๋˜ํ•œ HTML๋ฌธ์„œ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•จ
  • ํ‰๋ฒ”ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด โžก๏ธ ์‹ค์ œ DOM์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ ๋„ ํ•„์š”ํ•œ ๋งŒํผ ์ž์œ  ์กฐ์ž‘ ๊ฐ€๋Šฅ
  • ๊ฐ€์ƒ DOM์€ ๋ฆฌ์•กํŠธ์—์„œ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋‚˜ ์†์„ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ ์ƒ์„ฑ
    • ๋ฆฌ์•กํŠธ๋Š” ์ด์ „ ๊ฐ€์ƒ DOM๊ณผ ์ƒˆ๋กœ์šด ๊ฐ€์ƒ DOM์„ ๋น„๊ตํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์‹ค์ œ DOM์— ๋ฐ˜์˜

Virtual DOM์˜ ๋™์ž‘๊ณผ์ •

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋™์˜์ƒ ์‚ฌ์ดํŠธ์—์„œ ํŠน์ • ์ธ๋„ค์ผ ํด๋ฆญ ์‹œ, ๋ชจ๋‹ฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์žฌ์ƒ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ์ƒํ•ด๋ณด์ž !
โžก๏ธ ๐Ÿค” ๋ฆฌ์—‘ํŠธ์—์„  ์ด์™€ ๊ฐ™์€ ์ƒํƒœ ๋ณ€ํ™”์— ์–ด๋–ป๊ฒŒ ๋Œ€์‘ํ• ๊นŒ ?

  • ๋ฆฌ์•กํŠธ๋ฅผ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์ด ์ผ์–ด๋‚ฌ์„ ๋•Œ, ๊ฐ€์ƒ DOM์— ์ €์žฅ๋œ ์ด์ „์ƒํƒœ์™€ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋น„๊ต
  • ์œ„ ๊ณผ์ •์—์„œ React๋Š” Diffing ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์„ ๊ฐ์ง€
  • React์—์„œ ์ƒํƒœ๋ณ€๊ฒฝ์„ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” Diffing ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์ด๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง์ ‘ ํ• ๋‹น์ด ์•„๋‹Œ setState์™€ ๊ฐ™์€ ๋งค์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ

  • ๊ฐ€์ƒ DOM๊ณผ ๋ณ€๊ฒฝ๋œ ์ƒˆ๋กœ์šด ๊ฐ€์ƒ DOM์„ ๋น„๊ตํ•˜์—ฌ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•˜์—ฌ ์—…๋ฐ์ดํŠธ
    โžก๏ธ ์ด๊ฒƒ์„ Reconciliation, ์žฌ์กฐ์ •์ด๋ผ๊ณ  ํ•จ
  • ์—ฌ๋Ÿฌ๊ฐœ ์ƒํƒœ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ์ผ๊ด„์ ์œผ๋กœ ํ•œ๋ฒˆ์— ์—…๋ฐ์ดํŠธ (Batch Update)
    โžก๏ธ ์ด๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿƒโ€โ™€๏ธ Virtual DOM์€ ๋น ๋ฅด๋‹ค?

  • ๊ฐ€์ƒ DOM์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‹ค์ œ DOM์„ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š” ๋น ๋ฅด์ง€๋งŒ, ๋ชจ๋“  ๊ฒฝ์šฐ์— ๊ทธ๋ ‡์ง€๋Š” ์•Š๋‹ค
    โžก๏ธ ๋•Œ๋กœ๋Š” ์ง์ ‘ DOM์„ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅธ ๊ฒฝ์šฐ๋„ ์žˆ์Œ

  • ์‹ค์ œ DOM ์กฐ์ž‘์ด ๋А๋ ค์ง€๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ
    DOM ์กฐ์ž‘์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‹ค์‹œ ๋ ˆ์ด์•„์›ƒ์„ ๊ณ„์‚ฐํ•˜๊ณ , ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ
    โžก๏ธ ์ด๋Ÿฌํ•œ ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋น„์šฉ โ†‘

  • ๊ฐ€์ƒ DOM์„ ํ™œ์šฉํ•˜์—ฌ ์‹ค์ œ DOM ์กฐ์ž‘์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ํ•ต์‹ฌ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Œ

๐Ÿค” Quiz

Q. React์˜ ๊ฐ€์ƒ์˜ DOM ๊ฐ์ฒด๋Š” ๋ชจ๋“  ์‹ค์žฌํ•˜๋Š” DOM ๊ฐ์ฒด๋ฅผ ๋Œ€์‘ํ•˜์ง€ ๋ชปํ•œ๋‹ค ?

A. X

โžก๏ธ React์—๋Š” DOM ๊ฐ์ฒด์— ๋Œ€์‘ํ•˜๋Š” ๊ฐ€์ƒ์˜ DOM ๊ฐ์ฒด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹คReact์—๋Š” DOM ๊ฐ์ฒด์— ๋Œ€์‘ํ•˜๋Š” ๊ฐ€์ƒ์˜ DOM ๊ฐ์ฒด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€