์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[React] Virtual-DOM, Reconciliation, fiber

๐Ÿ˜Ž ์ง€์‹ in Action/React, Typescript, Javascript ๐ŸŒ

by :ํ•ดํ”ผ๋ž˜๋น—๐Ÿพ 2021. 6. 21. 17:49

๋ณธ๋ฌธ

- React์˜ Virtual-DOM ?

Virtual DOM์€ Real DOM๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ „์ฒด ์ค‘ ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ Reloadํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, n๊ฐœ์˜ ์š”์†Œ๊ฐ€ ์žˆ๊ณ  ๊ทธ ์ค‘์— 1๊ฐœ์˜ ์š”์†Œ๋งŒ ๋ฐ”๋€Œ์—ˆ๋‹ค๋ฉด, Real DOM์€ 1๊ฐœ์˜ ์š”์†Œ๋ฅผ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ์ „์ฒด n๊ฐœ๋ฅผ Reloadํ•˜์ง€๋งŒ, Virtual Dom์€ ์ด์ „ Snapshot๊ณผ ๋น„๊ตํ•ด์„œ ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ Real DOM์—์„œ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

 

- DOM Elements Of the Same Type

<div className='before' title='stuff'/>
<div className='after' title='stuff'/>

React์—์„œ๋Š” className๋งŒ ๋ฐ”๊พธ๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•ˆ๋‹ค.

<div style={{color: 'red', fontWeight: 'bold'}} />
<div style={{color: 'green', fontWeight: 'bold'}} />

color๋งŒ ๋ฐ”๊พธ๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•ˆ๋‹ค.

 

์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค๋Š” ๋™์ผํ•œ ์œ ์ง€๋˜์–ด ๋ Œ๋”๋ง๊ฐ„ state๊ฐ€ ์œ ์ง€๋œ๋‹ค.

React๋Š” ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ์˜ ๋‚ด์šฉ์„ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค์˜ props๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.

UNSAFE_componentWillReceiveProps(), UNSAFE_componentWillUpdate(), componentDidUpdate

๋‹ค์Œ์œผ๋กœ render() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๋น„๊ต ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ด์ „ ๊ฒฐ๊ณผ์™€ ์ƒˆ๋กœ์šด ๊ฒฐ๊ณผ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


- Reconciliation : ์žฌ์กฐ์ • ?

์ „์ฒด DOM ํŠธ๋ฆฌ๋ฅผ ๋น„๊ต/ํƒ์ƒ‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ผ๋ฐ˜์ ์œผ๋กœ O(n^3)์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

React๋Š” 2๊ฐ€์ง€ ํžŒํŠธ๋ฅผ ์ด์šฉํ•ด์„œ O(n)๊นŒ์ง€ ์ค„์˜€์Šต๋‹ˆ๋‹ค. 

 

  1. Two elements of different types will produce different trees. 
  2. The developer can hint at which child elements may be stable across different renders with a key prop.

์ฒซ๋ฒˆ์งธ>

์ž์‹ ํƒœ๊ทธ๋Š” ๋ถ€๋ชจ์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ, ๋ถ€๋ชจ ํƒœ๊ทธ์˜ type์ด ๋ฐ”๋€๋‹ค๋ฉด ์ž์‹ ํƒœ๊ทธ๋“ค์€ ํƒ์ƒ‰ํ•  ํ•„์š”๊ฐ€ ์—†์ด ํŠธ๋ฆฌ ์ „์ฒด๋ฅผ ์žฌ๊ตฌ์ถ•ํ•œ๋‹ค.

/*div ์•ˆ์˜ Counter์™€ span tag์•ˆ์˜ Counter*/
<div>
  <Counter />
</div>

<span>
  <Counter />
</span>

์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค๋Š” componentWillUnmount()๋กœ ํŒŒ๊ดด๋˜๊ณ ,

์ƒˆ๋กœ์šด DOM ๋…ธ๋“œ๋“ค์ด DOM์— ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค.

UNSAFE_componentWillMount()๊ฐ€ ์‹คํ–‰๋˜๊ณ ,

componentDidMount()๊ฐ€ ์ด์–ด์„œ ์‹คํ–‰๋˜๋ฉด์„œ ์ด์ „ ํŠธ๋ฆฌ์™€ ์—ฐ๊ด€๋œ ๋ชจ๋“  state๋Š” ์‚ฌ๋ผ์ง„๋‹ค.

 

 

๋‘๋ฒˆ์งธ>

 

๊นƒํ—™์—์„œ๋Š” line์ด ๋‹ฌ๋ผ์ง€๋ฉด code๊ฐ€ ๋‹ฌ๋ผ์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

-Recursing On Children

/*์ „*/
<ul>
  <li>Duke</li>
  <li>Villanova</li>
</ul>

/*ํ›„*/
<ul>
  <li>Connecticut</li>
  <li>Duke</li>
  <li>Villanova</li>
</ul>

์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ Connecticut๋งŒ ์ถ”๊ฐ€๋˜์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์œ„์น˜์— ๋”ฐ๋ผ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊นƒํ—™์ฒ˜๋Ÿผ code๊ฐ€ ๋ชจ๋‘ ๋‹ฌ๋ผ์กŒ๋‹ค๊ณ  ์ธ์‹ํ•œ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ, key ์†์„ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค. key ์†์„ฑ์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ key='2014'์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’๋งŒ ์ถ”๊ฐ€๋ Œ๋”๋ง ํ•˜๋ฉด ๋œ๋‹ค.

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

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

: ์ฐธ๊ณ ๋กœ ๊ณต์‹๋ฌธ์„œ์—์„œ๋Š” ์ธ๋ฑ์Šค๋ฅผ key๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์†Œ๊ฐœํ•˜๊ณ ,

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•œ๋‹ค.

https://codepen.io/pen?&editors=0010 

 

> ๊ณต์‹ ๋ฌธ์„œ

https://reactjs.org/docs/reconciliation.html

> ์ฐธ์กฐํ•œ ๋ฌธ์„œ

https://www.huskyhoochu.com/virtual-dom/

 

 

 


๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์กฐ๊ธˆ ๋” ์‚ดํŽด ๋ณด๋‹ˆ, React 16๋ถ€ํ„ฐ fiber ๋ผ๋Š” ์•„ํ‚คํ…์ณ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

๊ด€๋ จ ๋‚ด์šฉ์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

https://github.com/acdlite/react-fiber-architecture

 

 

 

 

 

 

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ