Jieunny์˜ ๋ธ”๋กœ๊ทธ

S4) Unit 4. [React] Virtual DOM ๋ณธ๋ฌธ

CodeStates/learning contents

S4) Unit 4. [React] Virtual DOM

Jieunny 2023. 3. 22. 13:00

๐Ÿ“ฃ  Virtual DOM

๐Ÿญ. Vertual DOM์˜ ์ •์˜

โœ”๏ธ React์— ์žˆ๋Š” ๊ฐ€์ƒ์˜ DOM ๊ฐ์ฒด

โžฐ ์‹ค์ œ DOM์˜ ์‚ฌ๋ณธ ๊ฐ™์€ ๊ฐœ๋…์œผ๋กœ, ๋ฆฌ์•กํŠธ๋Š” ์‹ค์ œ DOM์— ์ ‘๊ทผํ•ด์„œ ์กฐ์ž‘ํ•˜๋Š” ๋Œ€์‹  ๊ฐ€์ƒ์˜ DOM ๊ฐ์ฒด์— ์ ‘๊ทผํ•ด์„œ ๋ณ€ํ™” ์ „๊ณผ ํ›„๋ฅผ ๋น„๊ตํ•˜๊ณ  ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ ์‹ค์ œ DOM์— ์ ์šฉํ•œ๋‹ค.

 

๐Ÿฎ. Vertual DOM์ด ๋‚˜์˜ค๊ฒŒ ๋œ ๋ฐฐ๊ฒฝ

โœ”๏ธ DOM์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ UI ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์—…๋ฐ์ดํŠธ(๋ฆฌํ”Œ๋กœ์šฐ) ๋˜๊ณ , ์ด๋ ‡๊ฒŒ DOM์„ ์กฐ์ž‘ํ•˜๋Š” ์ •๋„๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โžฐ ๋ฐ”๋€ ๋ถ€๋ถ„์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ฆฌ๋ Œ๋”๋งํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๋น„์šฉ๋„ ๋งŽ์ด ๋“ค๊ณ  ๋ธŒ๋ผ์šฐ์ €์˜ ์†๋„๋„ ๋Šฆ์–ด์ง€๊ฒŒ ๋œ๋‹ค.

โžฐ ์‹ค์ œ DOM ๊ฐ์ฒด์™€ ๋™์ผํ•œ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์—๋„ ํ›จ์”ฌ ๊ฐ€๋ฒผ์šด ์‚ฌ๋ณธ์ธ virtual DOM์„ ์กฐ์ž‘ํ•˜๊ฒŒ ๋˜๋ฉด ์‹ค์ œ DOM์ฒ˜๋Ÿผ ์‹ค์ œ๋กœ ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ์†๋„๊ฐ€ ๋น ๋ฅด๊ฒŒ ๋œ๋‹ค.

โžฐ ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ ์‹ค์ œ DOM์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

๐Ÿฏ. Vertual DOM์˜ ํ˜•ํƒœ

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

โžฐ ์ถ”์ƒํ™”๋งŒ ๋˜์—ˆ์„ ๋ฟ ํ‰๋ฒ”ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์ด๋ฏ€๋กœ ์‹ค์ œ DOM์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ ๋„ ํ•„์š”ํ•œ ๋งŒํผ ์ž์œ ๋กญ๊ฒŒ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

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"
					}
				]
			]
		}
	]
}

๐Ÿ“ฃ  React Diffing Algorithm

๐Ÿญ. React Diffing Algorithm์˜ ์ •์˜

โœ”๏ธ ๊ธฐ์กด ๊ฐ€์ƒ DOM๊ณผ ์ƒˆ๋กœ์šด ๊ฐ€์ƒ DOM์„ ๋น„๊ตํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋น„๊ต ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

๐Ÿฎ. React๊ฐ€ DOM ํŠธ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•

โœ”๏ธ ํŠธ๋ฆฌ์˜ ๋ ˆ๋ฒจ ์ˆœ์„œ๋Œ€๋กœ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค.

โžฐ ๊ฐ™์€ ๋ ˆ๋ฒจ(์œ„์น˜)๋ผ๋ฆฌ ๋น„๊ตํ•˜๋Š” ๊ฒƒ -> ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS)์˜ ์ผ์ข…

โžฐ ๋™์ผ ์„ ์ƒ์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ํŒŒ์•…ํ•œ ๋’ค ๋‹ค์Œ ์ž์‹ ์„ธ๋Œ€์˜ ๋…ธ๋“œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ํŒŒ์•…ํ•ด ๋‚˜๊ฐ„๋‹ค.

 

1๏ธโƒฃ ๋‹ค๋ฅธ ํƒ€์ž…์˜ DOM ์—˜๋ฆฌ๋จผํŠธ์ธ ๊ฒฝ์šฐ

<div>
	<Counter />
</div>

//๋ถ€๋ชจ ํƒœ๊ทธ๊ฐ€ div์—์„œ span์œผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.
<span>
	<Counter />
</span>

โžฐ ๋ถ€๋ชจ ๋…ธ๋“œ์˜€๋˜ <div> ๊ฐ€ <span> ์œผ๋กœ ๋ฐ”๋€Œ๋ฉด ์ž์‹ ๋…ธ๋“œ์ธ <Counter />๋Š” ์™„์ „ํžˆ ํ•ด์ œ๋œ๋‹ค.

โžฐ ์ฆ‰, <span> ํƒœ๊ทธ ์† ์ƒˆ๋กœ์šด <Counter /> ๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

โžฐ ๊ธฐ์กด์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ์™„์ „ํžˆ ํ•ด์ œ๋˜๊ธฐ ๋•Œ๋ฌธ์— <Counter />๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋˜ ๊ธฐ์กด state ๋˜ํ•œ ํŒŒ๊ดด๋œ๋‹ค.

 

2๏ธโƒฃ ๊ฐ™์€ ํƒ€์ž…์˜ DOM ์—˜๋ฆฌ๋จผํŠธ์ธ ๊ฒฝ์šฐ

<div className="before" title="stuff" />

//๊ธฐ์กด์˜ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ํƒœ๊ทธ๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์€ ์ฑ„ className๋งŒ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค.
<div className="after" title="stuff" />

โžฐ ํƒ€์ž…์ด ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฆฌ์•กํŠธ๋Š” ๊ฐ€์ƒ DOM์„ ์‚ฌ์šฉํ•ด์„œ ์ตœ์†Œํ•œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

โžฐ ์—…๋ฐ์ดํŠธ ํ•  ๋‚ด์šฉ์ด ์ƒ๊ธฐ๋ฉด ๊ฐ€์ƒ DOM ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ๋งŒ ์ˆ˜์ •ํ•œ ๋’ค, ๋ชจ๋“  ๋…ธ๋“œ์— ๊ฑธ์นœ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋๋‚˜๋ฉด ๊ทธ๋•Œ ์ตœ์ข…์ ์œผ๋กœ ํ•œ๋ฒˆ๋งŒ ์‹ค์ œ DOM์œผ๋กœ์˜ ๋ Œ๋”๋ง์„ ์‹œ๋„ํ•œ๋‹ค.

 

//className์ด before์ธ ์ปดํฌ๋„ŒํŠธ
<div style={{color: 'red', fontWeight: 'bold"}} title="stuff" />

//className์ด after์ธ ์ปดํฌ๋„ŒํŠธ
<div style={{color: 'green', fontWeight: 'bold"}} title="stuff" />

โžฐ ๋ฆฌ์•กํŠธ๋Š” color ์Šคํƒ€์ผ๋งŒ ์ˆ˜์ •ํ•˜๊ณ , fontWeight ๋ฐ ๋‹ค๋ฅธ ์š”์†Œ๋Š” ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.

โžฐ ํ•˜๋‚˜์˜ DOM ๋…ธ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•œ ๋’ค ๋ฆฌ์•กํŠธ๋Š” ํ•ด๋‹น ๋…ธ๋“œ๋“ค ๋ฐ‘์˜ ์ž์‹๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋™์‹œ์— ์ˆœํšŒํ•˜๋ฉด์„œ ์ฐจ์ด๊ฐ€ ๋ฐœ๊ฒฌ๋  ๋•Œ๋งˆ๋‹ค ๋ณ€๊ฒฝํ•œ๋‹ค -> ์žฌ๊ท€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค

 

3๏ธโƒฃ ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ์˜ ์žฌ๊ท€์  ์ฒ˜๋ฆฌ

<ul>
  <li>first</li>
  <li>second</li>
</ul>

//์ž์‹ ์—˜๋ฆฌ๋จผํŠธ์˜ ๋์— ์ƒˆ๋กœ์šด ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
<ul>
  <li>first</li>
  <li>second</li>
  <li>third</li>
</ul>

โžฐ ๋ฆฌ์•กํŠธ๋Š” ์œ„์—์„œ๋ถ€ํ„ฐ ์•„๋ž˜๋กœ ๋น„๊ตํ•˜๋ฉด์„œ ๋ฐ”๋€ ์ ์„ ์ฐพ๋Š”๋‹ค.

โžฐ ์ฒซ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ๋“ค๊ณผ ๋‘ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ๋“ค์ด ์ผ์น˜ํ•˜๋Š” ๊ฑธ ํ™•์ธํ•œ ๋’ค ์„ธ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

=> ์ฒซ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋ฐ”๊พธ๋ฉด ๋ฆฌ์•กํŠธ๋Š” ๋‘ ๋ฒˆ์งธ, ์„ธ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ๋Š” ์œ ์ง€์‹œ์ผœ๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ์ง€ ๋ชปํ•˜๊ณ  ์ „๋ถ€ ์ƒˆ๋กญ๊ฒŒ ๋ Œ๋”๋ง ํ•œ๋‹ค.

=> ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด 'key' ์†์„ฑ์„ ์ง€์›ํ•œ๋‹ค.

 

๐Ÿฏ. Key

โœ”๏ธ ๋งŒ์•ฝ ์ž์‹ ๋…ธ๋“œ๋“ค์ด ์ด key๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค๋ฉด, ๋ฆฌ์•กํŠธ๋Š” ๊ทธ key๋ฅผ ์ด์šฉํ•ด ๊ธฐ์กด ํŠธ๋ฆฌ์˜ ์ž์‹๊ณผ ์ƒˆ๋กœ์šด ํŠธ๋ฆฌ์˜ ์ž์‹์ด ์ผ์น˜ํ•˜๋Š”์ง€ ์•„๋‹Œ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

<ul>
  <li key="2015">Duke</li>
  <li key="2016">Villanova</li>
</ul>

//key๊ฐ€ 2014์ธ ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ฒ˜์Œ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
<ul>
  <li key="2014">Connecticut</li>
  <li key="2015">Duke</li>
  <li key="2016">Villanova</li>
</ul>

โžฐ ๋ฆฌ์•กํŠธ๋Š” key ์†์„ฑ์„ ํ†ตํ•ด 2014 ๋ผ๋Š” ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์ƒˆ๋กœ ์ƒ๊ฒผ๊ณ , 2015, 2016 ํ‚ค๋ฅผ ๊ฐ€์ง„ ์—˜๋ฆฌ๋จผํŠธ๋Š” ๊ทธ์ € ์œ„์น˜๋งŒ ์ด๋™ํ–ˆ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

โžฐ ์ด key ์†์„ฑ์€ ๋ณดํ†ต ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ƒ์˜ ์œ ๋‹ˆํฌํ•œ ๊ฐ’์„ ๋ถ€์—ฌํ•ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ, ์ „์—ญ์ ์œผ๋กœ ์œ ์ผํ•  ํ•„์š”๋Š” ์—†๊ณ  ํ˜•์ œ ์—˜๋ฆฌ๋จผํŠธ ์‚ฌ์ด์—์„œ๋งŒ ์œ ์ผํ•˜๋ฉด ๋œ๋‹ค => ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ key๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•œ๋‹ค.