Reconcilation

React Virtual DOM

DOM์ด๋ž€?

  • Document Object Model

  • ๊ฐ์ฒด๋กœ ๋ฌธ์„œ ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ํŠน์ • ๋…ธ๋“œ ์ˆœํšŒ, ์ˆ˜์ •, ์ œ๊ฑฐ ,์ƒ์„ฑ

  • ์ •์ 

  • JS๋ฅผ ์ด์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜์žˆ๋‹ค.

DOM ์ž์ฒด๋Š” ๋น ๋ฅด์ง€๋งŒ, ์š”์†Œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ˆ˜๋ฐฑ๊ฐœ ์ˆ˜์ฒœ๊ฐœ๋กœ ๋Š˜์–ด๋‚  ๊ฒฝ์šฐ, ํ—ˆ๋น„๋˜๋Š” ์‹œ๊ฐ„์ด ๋งŽ์•„์ ธ ๊ฒฐ๊ตญ์—” ๋Š๋ ค์ง„๋‹ค.

๊ฒฐ์ •์ ์ธ ์ด์œ ๋Š” ๊ทธ ๊ณผ์ •์—์„œ DOM์€ ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚  ๋•Œ

  1. CSS์˜ ์žฌ์—ฐ์‚ฐ

  2. ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ

  3. ํŽ˜์ด์ง€ ๋ฆฌํŽ˜์ธํŠธ

Virtual DOM

์†๋„ ์ด์Šˆ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๊ฒฐ๊ตญ DOM์„ ์ตœ์†Œํ•œ์œผ๋กœ ์กฐ์ž‘ํ• ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

Virtual DOM ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด DOM์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์ถ”์ƒํ™” ์ฒ˜๋ฆฌํ•˜์—ฌ ์ฒ˜๋ฆฌ ํšŸ์ˆ˜๋ฅผ ์ตœ์†Œํ™”(=์‹ค์ œ DOM์˜ ์‚ฌ๋ณธ ์ •๋„)

  1. ์—…๋ฐ์ดํŠธํ•œ ์ „์ฒด UI๋ฅผ Virtual DOM์— ๋ฆฌ๋ Œ๋”๋ง

  2. ์‹ค์ œ DOM๊ณผ ์ƒ์„ฑ๋œ Virtual DOM์„ ๋น„๊ต

  3. ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ ์‹ค์ œ DOM์— ์ ์šฉ

๊ทธ๋ ‡๋‹ค๋ฉด Virtual DOM์€ ์ •๋ง๋กœ ๋น ๋ฅผ๊นŒ?

  • ์ง€์†์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ•์‹œ์—๋งŒ ์œ ๋ฆฌ

  • ์ฆ‰ ๊ฐ„๋‹จํ•œ ์ž‘์—…(๋‹จ์ˆœ ๋ผ์šฐํŒ… ์ž‘์—…๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ)์ผ ๋• ๋ฆฌ์—‘ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ 

  • ์ฝ”๋“œ ์ตœ์ ํ™”๋ฅผ ์—ด์‹ฌํžˆ ํ•˜๋ฉด ์†๋„ ๋ฌธ์ œ๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ์—‘ํŠธ๊ฐ€ ๋ณด์žฅํ•˜๋Š” ์„ฑ๋Šฅ์€ ์—…๋ฐ์ดํŠธ ์ฒ˜๋ฆฌ ๊ฐ„๊ฒฐ์„ฑ์ด์ง€, ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ๋ฆฌ์—‘ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋•Œ๋•Œ๋กœ ์œ ์—ฐํ•˜๊ฒŒ ๊ฐœ๋ฐœ์„ ํ•ด์•ผ๋จ

Reconcilation

React๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด, โ€˜render() ํ•จ์ˆ˜๋Š” React ์—˜๋ฆฌ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.โ€™ State ์™€ props๊ฐ€ ๊ฐฑ์‹ ๋˜๋ฉด render() ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ์šด React Element Tree๋ฅผ ๋ฐ˜ํ™˜. React๋Š” ์ด๋•Œ ๋งŒ๋“ค์–ด์ง„ ํŠธ๋ฆฌ์— ๋งž๊ฒŒ ๊ฐ€์žฅ ํšจ๊ณผ์ ์œผ๋กœ UI๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฒ•์„ ์•Œ์•„๋‚ด์•ผํ•จ

ํ•˜๋‚˜์˜ ํŠธ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ๋‹ค๋ฅธ ํŠธ๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ์—ฐ์‚ฐ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” n^3

React์—์„œ ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•œ๋‹ค๋ฉด, 1000๊ฐœ์˜ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•ด 10์–ต๋ฒˆ์˜ ๋น„๊ต ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰

React๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐ€์ •์„ ๊ธฐ๋ฐ˜ํ•˜์—ฌ O(n) ๋ณต์žก๋„์˜ ํœด๋ฆฌ์Šคํ‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„

  1. ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋‘ ์—˜๋ฆฌ๋จผํŠธ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.

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

๋น„๊ต ์•Œ๊ณ ๋ฆฌ์ฆ˜

์—˜๋ฆฌ๋จผํŠธ์˜ ํƒ€์ž…์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ

React๋Š” ๋‘ root element๋ถ€ํ„ฐ ๋น„๊ตํ•œ๋‹ค. ๋‘ root element์˜ ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฉด React๋Š” ์ด์ „ ํŠธ๋ฆฌ๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค. <a>์—์„œ <img>๋กœ, <Article>์—์„œ <Comment>๋กœ, ํ˜น์€ <Button>์—์„œ <div>๋กœ ๋ฐ”๋€Œ๋Š” ๊ฒƒ ๋ชจ๋‘ ํŠธ๋ฆฌ ์ „์ฒด๋ฅผ ์žฌ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒฝ์šฐ

ํŠธ๋ฆฌ๋ฅผ ๋ฒ„๋ฆด๋•Œ ์ด์ „ DOM ๋…ธ๋“œ๋“ค์€ ๋ชจ๋‘ ํŒŒ๊ดด๋œ๋‹ค. ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค๋Š” componentWillUnmount()๊ฐ€ ์‹คํ–‰. ์ƒˆ๋กœ์šด ํŠธ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ, ์ƒˆ๋กœ์šด DOM ๋…ธ๋“œ๋“ค์ด DOM์— ์‚ฝ์ž…. ๊ทธ์— ๋”ฐ๋ผ ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค๋Š” UNSAFE_componentWillMount()๊ฐ€ ์‹คํ–‰๋˜๊ณ  componentDidMount()๊ฐ€ ์ด์–ด์„œ ์‹คํ–‰๋œ๋‹ค. ์ด์ „ ํŠธ๋ฆฌ์™€ ์—ฐ๊ด€๋œ ๋ชจ๋“  state๋Š” ์‚ฌ๋ผ์ง„๋‹ค.

[Before]
<div>
  <Counter />
</div>

[After]
<span>
  <Counter />
</span>

DOM ์—˜๋ฆฌ๋จผํŠธ์˜ ํƒ€์ž…์ด ๊ฐ™์€ ๊ฒฝ์šฐ

๊ฐ™์€ ํƒ€์ž…์˜ ๋‘ React DOM ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋น„๊ตํ• ๋•Œ, React๋Š” ๋‘ ์—˜๋ฆฌ๋จผํŠธ์˜ ์†์„ฑ์„ ํ™•์ธํ•˜์—ฌ, ๋™์ผํ•œ ๋‚ด์—ญ์€ ์œ ์ง€ํ•˜๊ณ  ๋ณ€๊ฒฝ๋œ ์†์„ฑ๋งŒ ๊ฐฑ์‹ ํ•œ๋‹ค.

[Before]
 <div className=โ€œbeforeโ€ title=โ€œstuffโ€ />

[After]
<div className=โ€œafterโ€ title=โ€œstuffโ€ />

DOM ๋…ธ๋“œ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด, React๋Š” ์ด์–ด์„œ ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ž์‹๋“ค์„ ์žฌ๊ท€์ ์œผ๋กœ ์ฒ˜๋ฆฌ

๊ฐ™์€ ํƒ€์ž…์˜ ์ปดํฌ๋„ŒํŠธ ์—˜๋ฆฌ๋จผํŠธ

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐฑ์‹ ๋˜๋ฉด ์ธ์Šคํ„ด์Šค๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜์–ด ๋ Œ๋”๋ง ๊ฐ„ State๊ฐ€ ์œ ์ง€๋œ๋‹ค. React๋Š” ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ์˜ ๋‚ด์šฉ์„ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค์˜ props๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค. ๋‹ค์Œ์œผ๋กœ render() ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๋น„๊ต ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ด์ „ ๊ฒฐ๊ณผ์™€ ์ƒˆ๋กœ์šด ๊ฒฐ๊ณผ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์ž์‹์— ๋Œ€ํ•œ ์žฌ๊ท€์ ์ฒ˜๋ฆฌ

DOM ๋…ธ๋“œ์˜ ์ž์‹๋“ค์ด ์žฌ๊ท€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ• ๋•Œ, React๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์‹œ์— ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๊ณ  ์ฐจ์ด์ ์ด ์žˆ์œผ๋ฉด ๋ณ€๊ฒฝ์„ ์ƒ์„ฑํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ž์‹์˜ ๋์— ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, ๋‘ ํŠธ๋ฆฌ ์‚ฌ์ด์˜ ๋ณ€๊ฒฝ์€ ์ž˜ ์ž‘๋™๋  ๊ฒƒ์ด๋‹ค.

[Before]
<ul>
  <li>first</li>
  <li>second</li>
</ul>

[After]
<ul>
  <li>first</li>
  <li>second</li>
  <li>third</li>
</ul>

๋ฐ˜๋Œ€๋กœ, ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์•ž์— ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š๋‹ค.

React๋Š” <li>Duke</li>์™€ <li>Villanova</li> ์ข…์† ํŠธ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋Š” ๋Œ€์‹  ๋ชจ๋“  ์ž์‹์„ ๋ณ€๊ฒฝํ•˜๊ธฐ์— ๋น„ํšจ์œจ์€ ๋ฌธ์ œ๊ฐ€ ๋ ์ˆ˜ ์žˆ์Œ

[Before]
<ul>
  <li>Duke</li>
  <li>Villanova</li>
</ul>

[After]
<ul>
  <li>Connecticut</li>
  <li>Duke</li>
  <li>Villanova</li>
</ul>

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด React๋Š” key ์†์„ฑ์„ ์ง€์›ํ•œ๋‹ค. ์ž์‹๋“ค์ด key๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด, React๋Š” ํ‚ค๋ฅผ ํ†ตํ•ด ๊ธฐ์กด ํŠธ๋ฆฌ์™€ ์ดํ›„ ํŠธ๋ฆฌ์˜ ์ž์‹๋“ค์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

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

[After]
<ul>
  <li key="2014">Connecticut</li>
  <li key="2015">Duke</li>
  <li key="2016">Villanova</li>
</ul>

์ผ๋ฐ˜์ ์œผ๋กœ ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง€์ง€ ๋ชปํ•œ key๊ฐ’์— ๋Œ€ํ•ด์„  ํ‚ค๊ฐ’์„ ์ ์šฉํ•ด์„œ ํ‚ค๋ฅผ ์ƒ์„ฑํ• ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ํ‚ค๋Š” ์˜ค๋กœ์ง€ ํ˜•์ œ ์‚ฌ์ด์—์„œ๋งŒ ์œ ์ผํ•˜๋ฉด ๋˜๊ณ , ์ „์—ญ์—์„œ๋Š” ์œ ์ผํ•  ํ•„์š”๋Š” ์—†๋‹ค.

์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ key๋กœ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ํ•ญ๋ชฉ๋“ค์ด ์žฌ๋ฐฐ์—ด๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ด๋ฐฉ๋ฒ•๋„ ์ž˜ ๋™์ž‘ํ•  ๊ฒƒ์ด์ง€๋งŒ, ์žฌ๋ฐฐ์—ด๋˜๋Š” ๊ฒฝ์šฐ ๋น„ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

React Virtual DOM์˜ ๋‹จ์ 

React๋Š” ํœด๋ฆฌ์Šคํ‹ฑ์— ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํœด๋ฆฌ์Šคํ‹ฑ์ด ๊ธฐ๋ฐ˜ํ•˜๊ณ  ์žˆ๋Š” ๊ฐ€์ •์— ๋ถ€ํ•ฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์„ฑ๋Šฅ์ด ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค.

  1. ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ ํƒ€์ž…์„ ๊ฐ–๋Š” ์ข…์† ํŠธ๋ฆฌ๋“ค์˜ ์ผ์น˜ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋งค์šฐ ๋น„์Šทํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ์ถœ๋ ฅํ•˜๋Š” ๋‘ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ต์ฒดํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๊ทธ ๋‘˜์„ ๊ฐ™์€ ํƒ€์ž…์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. key๋Š” ๋ฐ˜๋“œ์‹œ ๋ณ€ํ•˜์ง€ ์•Š๊ณ , ์˜ˆ์ƒ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์œ ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ•˜๋Š” key(Math.random()์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ’ ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค์™€ DOM ๋…ธ๋“œ๋ฅผ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์žฌ์ƒ์„ฑํ•˜์—ฌ ์„ฑ๋Šฅ์ด ๋‚˜๋น ์ง€๊ฑฐ๋‚˜ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ state๊ฐ€ ์œ ์‹ค๋  ์ˆ˜ ์žˆ

Last updated