Reconcilation
React Virtual DOM
DOM์ด๋?
Document Object Model
๊ฐ์ฒด๋ก ๋ฌธ์ ๊ตฌ์กฐ๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ
ํธ๋ฆฌ ํํ๋ก ํน์ ๋ ธ๋ ์ํ, ์์ , ์ ๊ฑฐ ,์์ฑ
์ ์
JS๋ฅผ ์ด์ฉํ์ฌ ๋์ ์ผ๋ก ๋ง๋ค ์์๋ค.
DOM ์์ฒด๋ ๋น ๋ฅด์ง๋ง, ์์์ ๊ฐ์๊ฐ ์๋ฐฑ๊ฐ ์์ฒ๊ฐ๋ก ๋์ด๋ ๊ฒฝ์ฐ, ํ๋น๋๋ ์๊ฐ์ด ๋ง์์ ธ ๊ฒฐ๊ตญ์ ๋๋ ค์ง๋ค.
๊ฒฐ์ ์ ์ธ ์ด์ ๋ ๊ทธ ๊ณผ์ ์์ DOM์ ๋ณํ๊ฐ ์ผ์ด๋ ๋
CSS์ ์ฌ์ฐ์ฐ
๋ ์ด์์ ๊ตฌ์ฑ
ํ์ด์ง ๋ฆฌํ์ธํธ
Virtual DOM
์๋ ์ด์์ ๋ํ ํด๊ฒฐ์ฑ ์ ๊ฒฐ๊ตญ DOM์ ์ต์ํ์ผ๋ก ์กฐ์ํ ์ ๋ฐ์ ์๋ค.
Virtual DOM ๋ฐฉ์์ ์ฌ์ฉํด DOM์ ์ ๋ฐ์ดํธ๋ฅผ ์ถ์ํ ์ฒ๋ฆฌํ์ฌ ์ฒ๋ฆฌ ํ์๋ฅผ ์ต์ํ(=์ค์ DOM์ ์ฌ๋ณธ ์ ๋)
์ ๋ฐ์ดํธํ ์ ์ฒด UI๋ฅผ Virtual DOM์ ๋ฆฌ๋ ๋๋ง
์ค์ DOM๊ณผ ์์ฑ๋ Virtual DOM์ ๋น๊ต
๋ฐ๋ ๋ถ๋ถ๋ง ์ค์ DOM์ ์ ์ฉ
๊ทธ๋ ๋ค๋ฉด Virtual DOM์ ์ ๋ง๋ก ๋น ๋ฅผ๊น?
์ง์์ ์ผ๋ก ๋ณํํ๋ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์์๋ง ์ ๋ฆฌ
์ฆ ๊ฐ๋จํ ์์ (๋จ์ ๋ผ์ฐํ ์์ ๋ง ์๋ ๊ฒฝ์ฐ)์ผ ๋ ๋ฆฌ์ํธ๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ๋ ํจ์จ์
์ฝ๋ ์ต์ ํ๋ฅผ ์ด์ฌํ ํ๋ฉด ์๋ ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ ์ ์๋ค.
๋ฆฌ์ํธ๊ฐ ๋ณด์ฅํ๋ ์ฑ๋ฅ์ ์ ๋ฐ์ดํธ ์ฒ๋ฆฌ ๊ฐ๊ฒฐ์ฑ์ด์ง, ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ๋ฆฌ์ํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ ๋๋๋ก ์ ์ฐํ๊ฒ ๊ฐ๋ฐ์ ํด์ผ๋จ
Reconcilation
React๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด, โrender() ํจ์๋ React ์๋ฆฌ๋จผํธ ํธ๋ฆฌ๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.โ State ์ props๊ฐ ๊ฐฑ์ ๋๋ฉด render() ํจ์๋ ์๋ก์ด React Element Tree๋ฅผ ๋ฐํ. React๋ ์ด๋ ๋ง๋ค์ด์ง ํธ๋ฆฌ์ ๋ง๊ฒ ๊ฐ์ฅ ํจ๊ณผ์ ์ผ๋ก UI๋ฅผ ๊ฐฑ์ ํ๋ ๋ฒ์ ์์๋ด์ผํจ
ํ๋์ ํธ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ๋ค๋ฅธ ํธ๋ฆฌ๋ก ๋ณํํ๊ธฐ ์ํ ์ต์ํ์ ์ฐ์ฐ ์๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ๋ณต์ก๋๋ n^3
React์์ ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ๋ค๋ฉด, 1000๊ฐ์ ์๋ฆฌ๋จผํธ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํด 10์ต๋ฒ์ ๋น๊ต ์ฐ์ฐ์ ์ํ
React๋ ๋ ๊ฐ์ง ๊ฐ์ ์ ๊ธฐ๋ฐํ์ฌ O(n) ๋ณต์ก๋์ ํด๋ฆฌ์คํฑ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ
์๋ก ๋ค๋ฅธ ํ์ ์ ๋ ์๋ฆฌ๋จผํธ๋ ์๋ก ๋ค๋ฅธ ํธ๋ฆฌ๋ฅผ ๋ง๋ค์ด๋ธ๋ค.
๊ฐ๋ฐ์๊ฐ key props๋ฅผ ํตํด, ์ฌ๋ฌ ๋ ๋๋ง ์ฌ์ด์์ ์ด๋ค ์์ ์๋ฆฌ๋จผํธ๊ฐ ๋ณ๊ฒฝ๋์ง ์์์ผ ํ ์ง ํ์ํด ์ค์์๋ค.
๋น๊ต ์๊ณ ๋ฆฌ์ฆ
์๋ฆฌ๋จผํธ์ ํ์
์ด ๋ค๋ฅธ ๊ฒฝ์ฐ
React๋ ๋ root element๋ถํฐ ๋น๊ตํ๋ค. ๋ root element์ ํ์ ์ด ๋ค๋ฅด๋ฉด React๋ ์ด์ ํธ๋ฆฌ๋ฅผ ๋ฒ๋ฆฌ๊ณ ์์ ํ ์๋ก์ด ํธ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๋ค. <a>์์ <img>๋ก, <Article>์์ <Comment>๋ก, ํน์ <Button>์์ <div>๋ก ๋ฐ๋๋ ๊ฒ ๋ชจ๋ ํธ๋ฆฌ ์ ์ฒด๋ฅผ ์ฌ๊ตฌ์ถํ๋ ๊ฒฝ์ฐ
ํธ๋ฆฌ๋ฅผ ๋ฒ๋ฆด๋ ์ด์ DOM ๋ ธ๋๋ค์ ๋ชจ๋ ํ๊ดด๋๋ค. ์ปดํฌ๋ํธ ์ธ์คํด์ค๋ componentWillUnmount()๊ฐ ์คํ. ์๋ก์ด ํธ๋ฆฌ๊ฐ ๋ง๋ค์ด์ง ๋, ์๋ก์ด DOM ๋ ธ๋๋ค์ด DOM์ ์ฝ์ . ๊ทธ์ ๋ฐ๋ผ ์ปดํฌ๋ํธ ์ธ์คํด์ค๋ UNSAFE_componentWillMount()๊ฐ ์คํ๋๊ณ componentDidMount()๊ฐ ์ด์ด์ ์คํ๋๋ค. ์ด์ ํธ๋ฆฌ์ ์ฐ๊ด๋ ๋ชจ๋ state๋ ์ฌ๋ผ์ง๋ค.
DOM ์๋ฆฌ๋จผํธ์ ํ์
์ด ๊ฐ์ ๊ฒฝ์ฐ
๊ฐ์ ํ์ ์ ๋ React DOM ์๋ฆฌ๋จผํธ๋ฅผ ๋น๊ตํ ๋, React๋ ๋ ์๋ฆฌ๋จผํธ์ ์์ฑ์ ํ์ธํ์ฌ, ๋์ผํ ๋ด์ญ์ ์ ์งํ๊ณ ๋ณ๊ฒฝ๋ ์์ฑ๋ง ๊ฐฑ์ ํ๋ค.
DOM ๋ ธ๋์ ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด, React๋ ์ด์ด์ ํด๋น ๋ ธ๋์ ์์๋ค์ ์ฌ๊ท์ ์ผ๋ก ์ฒ๋ฆฌ
๊ฐ์ ํ์
์ ์ปดํฌ๋ํธ ์๋ฆฌ๋จผํธ
์ปดํฌ๋ํธ๊ฐ ๊ฐฑ์ ๋๋ฉด ์ธ์คํด์ค๋ ๋์ผํ๊ฒ ์ ์ง๋์ด ๋ ๋๋ง ๊ฐ State๊ฐ ์ ์ง๋๋ค. React๋ ์๋ก์ด ์๋ฆฌ๋จผํธ์ ๋ด์ฉ์ ๋ฐ์ํ๊ธฐ ์ํด ํ์ฌ ์ปดํฌ๋ํธ ์ธ์คํด์ค์ props๋ฅผ ๊ฐฑ์ ํ๋ค. ๋ค์์ผ๋ก render() ๋ฉ์๋๊ฐ ํธ์ถ๋๊ณ ๋น๊ต ์๊ณ ๋ฆฌ์ฆ์ด ์ด์ ๊ฒฐ๊ณผ์ ์๋ก์ด ๊ฒฐ๊ณผ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค.
์์์ ๋ํ ์ฌ๊ท์ ์ฒ๋ฆฌ
DOM ๋ ธ๋์ ์์๋ค์ด ์ฌ๊ท์ ์ผ๋ก ์ฒ๋ฆฌํ ๋, React๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์์ ๋ ๋ฆฌ์คํธ๋ฅผ ์ํํ๊ณ ์ฐจ์ด์ ์ด ์์ผ๋ฉด ๋ณ๊ฒฝ์ ์์ฑํ๋ค.
์๋ฅผ ๋ค์ด ์์์ ๋์ ์๋ฆฌ๋จผํธ๋ฅผ ์ถ๊ฐํ๋ฉด, ๋ ํธ๋ฆฌ ์ฌ์ด์ ๋ณ๊ฒฝ์ ์ ์๋๋ ๊ฒ์ด๋ค.
๋ฐ๋๋ก, ๋ฆฌ์คํธ์ ๋งจ ์์ ์๋ฆฌ๋จผํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ์ด ์ข์ง ์๋ค.
React๋ <li>Duke</li>์ <li>Villanova</li> ์ข ์ ํธ๋ฆฌ๋ฅผ ๊ทธ๋๋ก ์ ์งํ๋ ๋์ ๋ชจ๋ ์์์ ๋ณ๊ฒฝํ๊ธฐ์ ๋นํจ์จ์ ๋ฌธ์ ๊ฐ ๋ ์ ์์
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด React๋ key ์์ฑ์ ์ง์ํ๋ค. ์์๋ค์ด key๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด, React๋ ํค๋ฅผ ํตํด ๊ธฐ์กด ํธ๋ฆฌ์ ์ดํ ํธ๋ฆฌ์ ์์๋ค์ด ์ผ์นํ๋์ง ํ์ธํ๋ค.
์ผ๋ฐ์ ์ผ๋ก ์๋ณ์๋ฅผ ๊ฐ์ง์ง ๋ชปํ key๊ฐ์ ๋ํด์ ํค๊ฐ์ ์ ์ฉํด์ ํค๋ฅผ ์์ฑํ ์ ์๋ค. ํด๋น ํค๋ ์ค๋ก์ง ํ์ ์ฌ์ด์์๋ง ์ ์ผํ๋ฉด ๋๊ณ , ์ ์ญ์์๋ ์ ์ผํ ํ์๋ ์๋ค.
์ตํ์ ์๋จ์ผ๋ก ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ key๋ก ์ฌ์ฉํ ์ ์๋ค. ๋ง์ฝ ํญ๋ชฉ๋ค์ด ์ฌ๋ฐฐ์ด๋์ง ์๋๋ค๋ฉด ์ด๋ฐฉ๋ฒ๋ ์ ๋์ํ ๊ฒ์ด์ง๋ง, ์ฌ๋ฐฐ์ด๋๋ ๊ฒฝ์ฐ ๋นํจ์จ์ ์ผ๋ก ๋์ํ๋ค.
React Virtual DOM์ ๋จ์
React๋ ํด๋ฆฌ์คํฑ์ ์์กดํ๊ณ ์๊ธฐ ๋๋ฌธ์, ํด๋ฆฌ์คํฑ์ด ๊ธฐ๋ฐํ๊ณ ์๋ ๊ฐ์ ์ ๋ถํฉํ์ง ์๋ ๊ฒฝ์ฐ ์ฑ๋ฅ์ด ๋๋น ์ง ์ ์๋ค.
์๊ณ ๋ฆฌ์ฆ์ ๋ค๋ฅธ ์ปดํฌ๋ํธ ํ์ ์ ๊ฐ๋ ์ข ์ ํธ๋ฆฌ๋ค์ ์ผ์น ์ฌ๋ถ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค. ๋ง์ฝ ๋งค์ฐ ๋น์ทํ ๊ฒฐ๊ณผ๋ฌผ์ ์ถ๋ ฅํ๋ ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ต์ฒดํ๊ณ ์๋ค๋ฉด, ๊ทธ ๋์ ๊ฐ์ ํ์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ด ๋ ๋์ ์๋ ์์ต๋๋ค.
key๋ ๋ฐ๋์ ๋ณํ์ง ์๊ณ , ์์ ๊ฐ๋ฅํ๋ฉฐ, ์ ์ผํด์ผ ํฉ๋๋ค. ๋ณํ๋ key(Math.random()์ผ๋ก ์์ฑ๋ ๊ฐ ๋ฑ)๋ฅผ ์ฌ์ฉํ๋ฉด ๋ง์ ์ปดํฌ๋ํธ ์ธ์คํด์ค์ DOM ๋ ธ๋๋ฅผ ๋ถํ์ํ๊ฒ ์ฌ์์ฑํ์ฌ ์ฑ๋ฅ์ด ๋๋น ์ง๊ฑฐ๋ ์์ ์ปดํฌ๋ํธ์ state๊ฐ ์ ์ค๋ ์ ์
Last updated