Virtual DOM

#react

Written by Paul

Virtual DOM์€ ๋ฌด์—‡์ธ๊ฐ€?

DOM

Document Object Model
ํŠธ๋ฆฌ๊ตฌ์กฐ๋กœ HTML, XHTML, XML ๋ฌธ์„œ์—์„œ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ์ค€ํ™”๋œ API Javascript๋ฅผ HTML๊ณผ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค. DOM Node๋“ค์€ ์ง์ ‘ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (ex. getElementById) Tree์˜ ๊ฐ ๋…ธ๋“œ๋“ค์€ html element๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค

Web Browser ์ž‘๋™ ์ˆœ์„œ

HTML์„ ํŒŒ์‹ฑํ•˜์—ฌ DOM Tree๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค -> ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค -> ๋ Œ๋” ํŠธ๋ฆฌ์˜ ๋ ˆ์ด์•„์›ƒ์„ ๊ตฌ์„ฑํ•œ๋‹ค -> ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ๊ทธ๋ฆฐ๋‹ค
  • DOM ํŠธ๋ฆฌ ์ž์ฒด๋Š” HTML ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ๋ Œ๋”๋ง ์—”์ง„์— ์˜ํ•ด ์ƒ์„ฑ๋œ๋‹ค. (ex. Webkit)
  • CSS๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ  HTML์— ํŒŒ์‹ฑ๋œ CSS๋ฅผ ์ ์šฉํ•˜๋Š” ํ•˜์—ฌ ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
  • ๋ Œ๋”ํŠธ๋ฆฌ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ๊ทธ๋ ค์ง„๋‹ค.
์šฐ๋ฆฌ๊ฐ€ node๋ฅผ ๋ณ€๊ฒฝํ• ๋•Œ์— ์œ„์˜ ์ผ๋“ค์ด ๋งค๋ฒˆ ์ผ์–ด๋‚œ๋‹ค. node์˜ ๋ณ€๊ฒฝ์ด ์ž์ฃผ ์ผ์–ด๋‚ ์ˆ˜๋ก, ๋ทฐ๋ฅผ ๋‹ค์‹œ ๊ทธ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฐ›๋Š” ๋ถ€ํ•˜๋Š” ๊ณ„์† ๋œ๋‹ค. ๊ต‰์žฅํžˆ ๊ณ ๋น„์šฉ์˜ ์ผ์ด ๋˜๋Š” ๊ฒƒ ์ด๋‹ค.

Virtual DOM์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ํ•ด๊ฒฐํ•œ ์ผ๋“ค

  • node๋“ค์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ๋ฐ”๋กœ ๊ทธ๋ ค์ฃผ๋Š” ๋Œ€์‹ , ๋จผ์ € Virtual DOM์— ์ ์šฉํ•œ๋‹ค.
  • Virtual DOM์— ์ ์šฉ๋œ ๊ฒƒ์€ ์‹ค์ œ ๋ทฐ์—๋Š” ๊ทธ๋ ค์ง€์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ €๋น„์šฉ์˜ ์ž‘์—…์— ํ•ด๋‹นํ•œ๋‹ค. ์ƒˆ๋กœ์šด ๋นŒ๋”ฉ์„ ์ง“๋Š” ๊ฒƒ๊ณผ ์ƒˆ๋กœ์šด ๋นŒ๋”ฉ์„ ์ง“๊ธฐ์œ„ํ•œ ์ฒญ์‚ฌ์ง„์„ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์˜ ์ฐจ์ด์ด๋‹ค.
  • ๋˜ํ•œ Virtual DOM์€ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด ๋ณ€ํ™”๋ฅผ ํ•œ๋ฒˆ์— ๋ชจ์•„์„œ ๋ฐฐ์น˜์ž‘์—…์„ ํ•œ๋‹ค.

Virtual DOM

๋‹จ์ˆœํžˆ Virtual DOM์€ ํŠธ๋ฆฌ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋Š” ์ˆœ์ˆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์ด๋‹ค.
๊ฐ€๋ณ๊ณ , ๋ฉ”๋ชจ๋ฆฌ ๋‚ด๋ถ€์— ์กด์žฌํ•œ๋‹ค. ์ ˆ๋Œ€๋กœ ์‹ค์ œ๋กœ ๊ทธ๋ ค์ง€์ง€ ์•Š๋Š”๋‹ค. ์ด Virtual DOM์ด๋ผ๋Š” ์•„์ด๋””์–ด๋Š” React์— ์˜ํ•ด์„œ ๋‚˜์™”์ง€๋งŒ, ๋‹ค๋ฅธ ํ”„๋ŸฐํŠธ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์—๋„ ์‚ฌ์šฉ์ค‘์ด๋‹ค. (ex. Angular 2, Vue)

React์˜ Virtual DOM์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ?

  • ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์ž‘์—…์—์„œ, JSX๋Š” ํ…œํ”Œ๋ฆฟ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ in-memory DOM Tree๋ฅผ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ• ์ง€ ์•Œ๋ ค์ค€๋‹ค.
  • ReactDOM.render() ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋ €์„๋•Œ์—, Virtual DOM Tree๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด๋ถ€์—์„œ ์ƒ์„ฑํ•œ๋‹ค.

State์˜ ๋ณ€ํ™” ๋‹ค๋ฃจ๊ธฐ

  • ๋Œ€๋ถ€๋ถ„ setStateํ•จ์ˆ˜์— ์˜ํ•ด์„œ App์ด ์—…๋ฐ์ดํŠธ ๋œ๋‹ค.
  • ์ด ๋•Œ์— Tree๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅด๊ฒŒ ์ƒˆ๋กœ์ด ์ƒ์„ฑ๋œ๋‹ค.
  • state๊ฐ€ ๋ณ€ํ• ์‹œ์— ๋‘๊ฐœ์˜ ๋‹ค๋ฅธ Virtual DOM์ด ๋ฉ”๋ชจ๋ฆฌ ๋‚ด๋ถ€์— ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค
  • ์ด๊ฒƒ์€ ๋น„ํšจ์œจ์ ์œผ๋กœ ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. React Element๋“ค์€ ๊ต‰์žฅํžˆ ๊ฐ€๋ณ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์ด๋•Œ์— React๋Š” ๋‘๊ฐœ์˜ Tree๋ฅผ ๋น„๊ตํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘ Tree๊ฐ„์˜ ์ฐจ์ด์ ์„ ๋งคํ•‘ํ•œ๋‹ค.
  • ๊ทธ ์ฐจ์ด์ ๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ ํŒจ์น˜๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ณ , ๋ณ€ํ™”๋ฅผ ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•œ๋‹ค.
  • ์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” diff ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์‹ค์ œ DOM์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ตœ์†Œํ•œ์˜ ์ž‘์—…์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์ž‘์—…๋“ค์€ batch๋˜์–ด ์ฒ˜๋ฆฌ๋˜์–ด์„œ ๋งค lifecycle ๋งˆ๋‹ค ์‹ค์ œ DOM์€ ํ•œ๋ฒˆ๋งŒ ๋ณ€ํ™”๋œ๋‹ค.

Diffing, or "Reconciliation"

  • ์ตœ์†Œํ•œ์˜ ์ž‘์—…์„ ์ฐพ๊ธฐ ์œ„ํ•œ ๊ฒƒ์€ O(n3) complexity๋ฅผ ๊ฐ€์ง„๋‹ค.
  • React๋Š” O(n)์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์–ด๋–ป๊ฒŒ? ๋‘๊ฐ€์ง€ ๊ฐ€์ •์— ์˜์กดํ•œ๋‹ค.

๊ฐ€์ • 1

  • ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ Element๋“ค์€ ์„œ๋กœ ๋‹ค๋ฅธ Tree๋ฅผ ์ƒ์„ฑํ•ด๋‚ธ๋‹ค.
  • ๋”ฐ๋ผ์„œ React๋Š” ๋‘๊ฐœ์˜ ์„œ๋กœ๋‹ค๋ฅธ Tree๋ฅผ ๋น„๊ตํ• ๋•Œ์— ๊ฐ ํŠธ๋ฆฌ์˜ Root Element๋ฅผ ๋น„๊ตํ•œ๋‹ค.
  • ๋งŒ์•ฝ ๋‘๊ฐœ์˜ Root Element๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, React๋Š” ์ด์ „์˜ Tree๋ฅผ ๋ชจ๋‘ ์ƒˆ๋กœ์šด Tree๋กœ ๊ฐˆ์•„ ์—Ž๋Š”๋‹ค. Root Element ๋ฐ‘์˜ ๋ชจ๋“  SubTree๋ฅผ ์ƒˆ๋กœ์ด ๊ทธ๋ ค๋‚ธ๋‹ค.

๊ฐ€์ • 2

  • key ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ž์‹ Element๋“ค์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๋Š”๋ฐ ํžŒํŠธ๊ฐ€ ๋˜์–ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” key๊ฐ’๋“ค์ด ๋ชจ๋‘ ์•ˆ์ •์ ์ด๊ณ  ์˜ˆ์ธก๊ฐ€๋Šฅํ•˜๊ณ  ์ค‘๋ณต๋œ ๊ฐ’์ด ์—†์–ด์•ผ ํ•œ๋‹ค.
<ul> <li>John</li> <li>Alice</li> </ul>
<ul> <li>John</li> <li>Alice</li> <li>Ed</li> </ul>
key ๊ฐ’์ด ์—†๋‹ค๋ฉด ์ƒˆ๋กœ์šด ์ž์‹ element๊ฐ€ ์ถ”๊ฐ€๋˜์–ด๋„, ๋ชจ๋“  ์ž์‹ element๋ฅผ ๋ชจ๋‘ ๋‹ค์‹œ ๊ทธ๋ ค์ค˜์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ key ๊ฐ’์œผ๋กœ ์ž์‹ element๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์–ด๋–ค ๊ฒƒ๋งŒ ์ƒˆ๋กœ์ด ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
<ul> <li key="9">John</li> <li key="10">Alice</li> <li key="11">Ed</li> </ul>
๋งŒ์•ฝ key ๊ฐ’์ด ์˜ˆ์ธกํ•˜์ง€ ๋ชปํ•˜๋Š” randomํ•œ ๊ฐ’์ด๋ผ๋ฉด (ex. Math.random()) React๋Š” ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ž์‹ Element๊ฐ€ ์ œ๋Œ€๋กœ ๊ทธ๋ ค์ง€์ง€ ๋ชปํ•˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์€?

React Fiber

React์˜ reconciliation ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‹ค์‹œ ์“ฐ๋Š”๋ฐ์— ์ƒˆ๋กœ ๋‚˜์˜จ ๊ฒƒ์ด๋‹ค. DOM ์„ ๊ณ„์† ์ˆœํ™˜ํ•˜๋Š” ๋Œ€์‹ ์—, fiber๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Fiber๋Š” ์ˆœ์ˆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์ด๋ฉฐ parent-child node ๊ฐ„ ๊ด€๊ณ„๋ฅผ ํ•˜๋‚˜์˜ linked-listํ˜•ํƒœ๋กœ ํŠธ๋ž˜ํ‚นํ•œ๋‹ค. ์œ„์˜ ์ž‘์—…๋“ค์€ "incremental rendering" ํ˜น์€ "scheduling"์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ์šด๋‹ค
โ† Go home