[React] Virtual-DOM, Reconciliation, fiber
Virtual DOM์ Real DOM๊ณผ ๋ค๋ฅด๊ฒ ์ ์ฒด ์ค ๋ฐ๋ ๋ถ๋ถ๋ง Reloadํฉ๋๋ค.
์๋ฅผ ๋ค์ด, n๊ฐ์ ์์๊ฐ ์๊ณ ๊ทธ ์ค์ 1๊ฐ์ ์์๋ง ๋ฐ๋์๋ค๋ฉด, Real DOM์ 1๊ฐ์ ์์๋ฅผ ๋ฐ๊พธ๊ธฐ ์ํด ์ ์ฒด n๊ฐ๋ฅผ Reloadํ์ง๋ง, Virtual Dom์ ์ด์ Snapshot๊ณผ ๋น๊ตํด์ ๋ฐ๋ ๋ถ๋ถ๋ง Real DOM์์ ๋ฐ๊ฟ๋๋ค.
<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() ๋ฉ์๋๊ฐ ํธ์ถ๋๊ณ ๋น๊ต ์๊ณ ๋ฆฌ์ฆ์ด ์ด์ ๊ฒฐ๊ณผ์ ์๋ก์ด ๊ฒฐ๊ณผ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
์ ์ฒด DOM ํธ๋ฆฌ๋ฅผ ๋น๊ต/ํ์ํ๋๋ฐ ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ์ ์ผ๋ฐ์ ์ผ๋ก O(n^3)์ ๋ณต์ก๋๋ฅผ ๊ฐ์ต๋๋ค.
React๋ 2๊ฐ์ง ํํธ๋ฅผ ์ด์ฉํด์ O(n)๊น์ง ์ค์์ต๋๋ค.
์ฒซ๋ฒ์งธ>
์์ ํ๊ทธ๋ ๋ถ๋ชจ์ ์ํฅ์ ๋ฐ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก, ๋ถ๋ชจ ํ๊ทธ์ type์ด ๋ฐ๋๋ค๋ฉด ์์ ํ๊ทธ๋ค์ ํ์ํ ํ์๊ฐ ์์ด ํธ๋ฆฌ ์ ์ฒด๋ฅผ ์ฌ๊ตฌ์ถํ๋ค.
/*div ์์ Counter์ span tag์์ Counter*/
<div>
<Counter />
</div>
<span>
<Counter />
</span>
์ปดํฌ๋ํธ ์ธ์คํด์ค๋ componentWillUnmount()๋ก ํ๊ดด๋๊ณ ,
์๋ก์ด DOM ๋ ธ๋๋ค์ด DOM์ ์ฝ์ ๋ฉ๋๋ค.
UNSAFE_componentWillMount()๊ฐ ์คํ๋๊ณ ,
componentDidMount()๊ฐ ์ด์ด์ ์คํ๋๋ฉด์ ์ด์ ํธ๋ฆฌ์ ์ฐ๊ด๋ ๋ชจ๋ state๋ ์ฌ๋ผ์ง๋ค.
๋๋ฒ์งธ>
๊นํ์์๋ line์ด ๋ฌ๋ผ์ง๋ฉด code๊ฐ ๋ฌ๋ผ์ก๋ค๊ณ ์๊ฐํ๋ค.
/*์ */
<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
| [Javascript] ๋น๋๊ธฐ ์ฒ๋ฆฌ(2): Promise โญ (0) | 2021.08.17 |
|---|---|
| [Javascript] Event Loop์ Call Stack โญ (0) | 2021.06.22 |
| [MongoDB] Model Relationships Between Documents (3) (0) | 2021.06.10 |
| [MongoDB] Model Relationships Between Documents (2) (0) | 2021.06.10 |
| [MongoDB] Model Relationships Between Documents (1) (0) | 2021.06.10 |