[React] React Diffing Algorithm

Hannahhhยท2022๋…„ 9์›” 28์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
22/30

๐Ÿ” React Diffing Algorithm


React๊ฐ€ ๋ณ€๊ฒฝ ์ „ Virtual DOM๊ณผ ๋ณ€๊ฒฝ ํ›„ Virtual DOM์„ ๋น„๊ตํ•  ๋•Œ, ๊ธฐ์กด์˜ Virtual DOM Tree๋ฅผ ๋ณ€๊ฒฝ ํ›„ ์ƒˆ๋กœ์šด Virtual DOM Tree๋กœ ๋ณ€ํ˜• ์‹œํ‚ค๋Š” ๊ฐ€์žฅ ์ž‘์€ ์กฐ์ž‘ ๋ฐฉ์‹์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์•Œ์•„๋‚ด์•ผ ํ–ˆ๋‹ค.


์ด ๋•Œ,

  • ๊ฐ๊ธฐ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์š”์†Œ๋Š” ๋‹ค๋ฅธ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ œ๊ณตํ•˜๋Š” key ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ , ์—ฌ๋Ÿฌ ๋ฒˆ ๋ Œ๋”๋ง์„ ๊ฑฐ์ณ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ๋ง์•„์•ผ ํ•˜๋Š” ์ž์‹ ์š”์†Œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

์œ„์˜ 2๊ฐ€์ง€ ๊ฐ€์ •์„ ๊ฐ€์ง€๊ณ  ์‹œ๊ฐ„ ๋ณต์žก๋„ O(n)์˜ ๋น„๊ต ์•Œ๊ณ ๋ฆฌ์ฆ˜(Diffing Algorithm)์„ ๊ตฌํ˜„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.



๐Ÿ‘€ React์˜ DOM Tree ํƒ์ƒ‰ ๋ฐฉ๋ฒ•


๊ธฐ์กด์˜ Virtual DOM Tree์™€ ์ƒˆ๋กญ๊ฒŒ ๋ณ€๊ฒฝ๋œ Virtual DOM Tree๋ฅผ ๋น„๊ตํ•  ๋•Œ, Tree์˜ level ์ˆœ์„œ๋Œ€๋กœ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค.(๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰(BFS)์˜ ์ผ์ข…)



โœ” ๋‹ค๋ฅธ ํƒ€์ž…์˜ DOM element์ผ ๊ฒฝ์šฐ


HTML ํƒœ๊ทธ๋งˆ๋‹ค ๊ทœ์น™์ด ์žˆ์–ด, ๊ทธ ์•„๋ž˜์˜ ์ž์‹ ํƒœ๊ทธ๊ฐ€ ํ•œ์ •์ ์ด๋‹ค.

๋”ฐ๋ผ์„œ, ๋ถ€๋ชจ ํƒœ๊ทธ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉด React๋Š” ๊ธฐ์กด์˜ Tree๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด Tree๋ฅผ ๊ตฌ์ถ•ํ•˜๋ฉด์„œ ์ด์ „์˜ DOM node๋“ค์€ ์ „๋ถ€ ์—†์–ด์ง„๋‹ค.

์ฆ‰, ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ๊ธฐ์กด์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ์™„์ „ํžˆ ํ•ด์ œ๋˜๊ณ , ๊ทธ ์•„๋ž˜ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ state๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด ๊ฐ–๊ณ ์žˆ๋˜ ๊ธฐ์กด์˜ state ๋˜ํ•œ ์—†์–ด์ง„๋‹ค.

<div>
	<Counter />
</div>

//๋ถ€๋ชจ ํƒœ๊ทธ๊ฐ€ div์—์„œ span์œผ๋กœ ๋ณ€๊ฒฝ.
<span>
	<Counter />
</span>

โœ” ๊ฐ™์€ ํƒ€์ž…์˜ DOM element์ผ ๊ฒฝ์šฐ


์ตœ๋Œ€ํ•œ ๋ Œ๋”๋ง์„ ํ•˜์ง€ ์•Š๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ตœ์†Œํ•œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

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

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

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

className before์™€ after์ด ๊ฐ์ž ์•„๋ž˜์˜ ์Šคํƒ€์ผ์„ ๊ฐ€์ง„๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ,

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

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

์ •ํ™•ํžˆ color ์Šคํƒ€์ผ๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉฐ, ํ•˜๋‚˜์˜ DOM node๋ฅผ ์ฒ˜๋ฆฌํ•œ ๋’ค์— ์ด์–ด์„œ ๋ฐ‘์˜ ์ž์‹๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋™์‹œ์— ์ˆœํšŒํ•˜๋ฉด์„œ ์ฐจ์ด๊ฐ€ ๋ฐœ๊ฒฌ๋  ๋•Œ๋งˆ๋‹ค ๋ณ€๊ฒฝํ•œ๋‹ค.(์žฌ๊ท€์  ์ฒ˜๋ฆฌ)



โœ” ์ž์‹ element์˜ ์žฌ๊ท€์  ์ฒ˜๋ฆฌ


์œ„์—์„œ ๋ฐ‘์˜ ์ž์‹๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋™์‹œ์— ์ˆœํšŒ(๊ธฐ์กด DOM Tree & ๋ณ€๊ฒฝ๋œ DOM Tree)ํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ๋งŒ์ผ ์ž์‹ element ๋์— ์ƒˆ๋กœ์šด ์ž์‹ element๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ์—” ๊ทธ ์ด์ „์˜ ์ž์‹ node๋“ค์ด ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ›„ ์ƒˆ๋กœ์šด ์ž์‹ node๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ์•„๋ž˜์™€ ๊ฐ™์ด ์ž์‹ element๋ฅผ ์ฒ˜์Œ์— ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด ๋™์‹œ์— DOM Tree๋ฅผ ์ˆœํšŒํ•  ๋•Œ, ์ตœ์†Œํ•œ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.(๊ฐ n๋ฒˆ์งธ ์ž์‹ node๋“ค์ด ์ผ์น˜ํ•˜์ง€x)

<ul>
  <li>Apple</li>
  <li>Banana</li>
</ul>

//์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ฒ˜์Œ์— ์ถ”๊ฐ€.
<ul>
  <li>Grape</li>
  <li>Apple</li>
  <li>Banana</li>
</ul>

๋”ฐ๋ผ์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด React์—์„œ key๋ผ๋Š” ์†์„ฑ์„ ์ง€์›ํ•˜๋ฉฐ, ํšจ์œจ์ ์œผ๋กœ Virtual DOM์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋กํ•œ๋‹ค.(key๊ฐ’์„ ์„ค์ •ํ•˜์ง€ ์•Š์„ ์‹œ, ๊ฒฝ๊ณ ๋ฌธ์„ ๋„์šฐ๋Š” ์ด์œ =key๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ node๊ฐ€ ๋น„ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.)



๋”ฐ๋ผ์„œ, ์•„๋ž˜์™€ ๊ฐ™์ด ์ž์‹ ๋…ธ๋“œ๋“ค์—๊ฒŒ key๋ฅผ ์„ค์ •ํ•ด์ฃผ๋ฉด, ํ•ด๋‹น key๋ฅผ ์ด์šฉํ•ด ํšจ์œจ์ ์œผ๋กœ ๋‘ Tree๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋•Œ, key๊ฐ’์€ ๋ณดํ†ต DB์ƒ์˜ ์œ ๋‹ˆํฌํ•œ ๊ฐ’(ex.id)๋ฅผ ๋ถ€์—ฌํ•˜๋ฉฐ, ์ „์—ญ์ ์œผ๋กœ ์œ ์ผํ•  ํ•„์š”๋Š” ์—†๊ณ  ํ˜•์ œ element ์‚ฌ์ด์—์„œ๋งŒ ์œ ์ผํ•˜๋ฉด ๋œ๋‹ค.(์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ index ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

<ul>
  <li key="a">Apple</li>
  <li key="b">Banana</li>
</ul>

//key๊ฐ€ g์ธ ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ฒ˜์Œ์— ์ถ”๊ฐ€.
<ul>
  <li key="g">Grape</li>
  <li key="a">Apple</li>
  <li key="b">Banana</li>
</ul>




Reference: ์ฝ”๋“œ์Šคํ…Œ์ด์ธ 

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