#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"์ด๋ผ๊ณ ๋ถ๋ฆฌ์ด๋ค