React๊ฐ ๋ณ๊ฒฝ ์ Virtual DOM๊ณผ ๋ณ๊ฒฝ ํ Virtual DOM์ ๋น๊ตํ ๋, ๊ธฐ์กด์ Virtual DOM Tree๋ฅผ ๋ณ๊ฒฝ ํ ์๋ก์ด Virtual DOM Tree๋ก ๋ณํ ์ํค๋ ๊ฐ์ฅ ์์ ์กฐ์ ๋ฐฉ์์ ์๊ณ ๋ฆฌ์ฆ์ ์์๋ด์ผ ํ๋ค.
์ด ๋,
key
ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๊ณ , ์ฌ๋ฌ ๋ฒ ๋ ๋๋ง์ ๊ฑฐ์ณ๋ ๋ณ๊ฒฝ๋์ง ๋ง์์ผ ํ๋ ์์ ์์๊ฐ ๋ฌด์์ธ์ง ์์๋ผ ์ ์๋ค.์์ 2๊ฐ์ง ๊ฐ์ ์ ๊ฐ์ง๊ณ ์๊ฐ ๋ณต์ก๋ O(n)์ ๋น๊ต ์๊ณ ๋ฆฌ์ฆ(Diffing Algorithm)์ ๊ตฌํํด ์ฌ์ฉํ๋ค.
๊ธฐ์กด์ Virtual DOM Tree์ ์๋กญ๊ฒ ๋ณ๊ฒฝ๋ Virtual DOM Tree๋ฅผ ๋น๊ตํ ๋, Tree์ level ์์๋๋ก ์ํํ๋ ๋ฐฉ์์ผ๋ก ํ์ํ๋ค.(๋๋น์ฐ์ ํ์(BFS)์ ์ผ์ข )
HTML ํ๊ทธ๋ง๋ค ๊ท์น์ด ์์ด, ๊ทธ ์๋์ ์์ ํ๊ทธ๊ฐ ํ์ ์ ์ด๋ค.
๋ฐ๋ผ์, ๋ถ๋ชจ ํ๊ทธ๊ฐ ๋ฌ๋ผ์ง๋ฉด React๋ ๊ธฐ์กด์ Tree๋ฅผ ๋ฒ๋ฆฌ๊ณ ์๋ก์ด Tree๋ฅผ ๊ตฌ์ถํ๋ฉด์ ์ด์ ์ DOM node๋ค์ ์ ๋ถ ์์ด์ง๋ค.
์ฆ, ์๋ก์ด ์ปดํฌ๋ํธ๊ฐ ์คํ๋๋ฉด์ ๊ธฐ์กด์ ์ปดํฌ๋ํธ๋ ์์ ํ ํด์ ๋๊ณ , ๊ทธ ์๋ ์์ ์ปดํฌ๋ํธ๊ฐ state๋ฅผ ๊ฐ์ง๊ณ ์์๋ค๋ฉด ๊ฐ๊ณ ์๋ ๊ธฐ์กด์ state ๋ํ ์์ด์ง๋ค.
<div>
<Counter />
</div>
//๋ถ๋ชจ ํ๊ทธ๊ฐ div์์ span์ผ๋ก ๋ณ๊ฒฝ.
<span>
<Counter />
</span>
์ต๋ํ ๋ ๋๋ง์ ํ์ง ์๋ ๋ฐฉํฅ์ผ๋ก ์ต์ํ์ ๋ณ๊ฒฝ ์ฌํญ๋ง ์ ๋ฐ์ดํธํ๋ค.
์ ๋ฐ์ดํธ ํ ๋ด์ฉ์ด ์๊ธฐ๋ฉด virtual DOM ๋ด๋ถ์ ํ๋กํผํฐ๋ง ์์ ํ ๋ค, ๋ชจ๋ ๋ ธ๋์ ๊ฑธ์น ์ ๋ฐ์ดํธ๊ฐ ๋๋๋ฉด ๊ทธ๋ ๋จ ํ๋ฒ ์ค์ DOM์ผ๋ก์ ๋ ๋๋ง์ ์๋ํ๋ค.
<div className="before" title="example" />
//๊ธฐ์กด์ ์๋ฆฌ๋จผํธ๊ฐ ํ๊ทธ๋ ๋ฐ๋์ง ์์ ์ฑ className๋ง ๋ณ๊ฒฝ.
<div className="after" title="example" />
className
before
์ after
์ด ๊ฐ์ ์๋์ ์คํ์ผ์ ๊ฐ์ง๋ค๊ณ ํ์ ๋,
//className์ด before์ธ ์ปดํฌ๋ํธ
<div style={{color: 'red', fontWeight: 'bold"}} title="example" />
//className์ด after์ธ ์ปดํฌ๋ํธ
<div style={{color: 'blue', fontWeight: 'bold"}} title="example" />
์ ํํ color
์คํ์ผ๋ง ๋ณ๊ฒฝํ๋ฉฐ, ํ๋์ DOM node๋ฅผ ์ฒ๋ฆฌํ ๋ค์ ์ด์ด์ ๋ฐ์ ์์๋ค์ ์์ฐจ์ ์ผ๋ก ๋์์ ์ํํ๋ฉด์ ์ฐจ์ด๊ฐ ๋ฐ๊ฒฌ๋ ๋๋ง๋ค ๋ณ๊ฒฝํ๋ค.(์ฌ๊ท์ ์ฒ๋ฆฌ)
์์์ ๋ฐ์ ์์๋ค์ ์์ฐจ์ ์ผ๋ก ๋์์ ์ํ(๊ธฐ์กด DOM Tree & ๋ณ๊ฒฝ๋ DOM Tree)ํ๋ค๊ณ ํ๋๋ฐ, ๋ง์ผ ์์ element ๋์ ์๋ก์ด ์์ element๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ์ ๊ทธ ์ด์ ์ ์์ node๋ค์ด ์ผ์นํ๋ ๊ฒ์ ํ์ธ ํ ์๋ก์ด ์์ node๋ฅผ ์ถ๊ฐํ๋ค.
๊ทธ๋ฌ๋, ์๋์ ๊ฐ์ด ์์ element๋ฅผ ์ฒ์์ ์ถ๊ฐํ๋ค๋ฉด ๋์์ DOM Tree๋ฅผ ์ํํ ๋, ์ต์ํ์ผ๋ก ๋์ํ์ง ์๋๋ค.(๊ฐ n๋ฒ์งธ ์์ node๋ค์ด ์ผ์นํ์งx)
<ul>
<li>Apple</li>
<li>Banana</li>
</ul>
//์์ ์๋ฆฌ๋จผํธ๋ฅผ ์ฒ์์ ์ถ๊ฐ.
<ul>
<li>Grape</li>
<li>Apple</li>
<li>Banana</li>
</ul>
๋ฐ๋ผ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด React์์ key
๋ผ๋ ์์ฑ์ ์ง์ํ๋ฉฐ, ํจ์จ์ ์ผ๋ก Virtual DOM์ ์กฐ์ํ ์ ์๋๋กํ๋ค.(key
๊ฐ์ ์ค์ ํ์ง ์์ ์, ๊ฒฝ๊ณ ๋ฌธ์ ๋์ฐ๋ ์ด์ =key
๊ฐ์ด ์์ ๊ฒฝ์ฐ node๊ฐ ๋นํจ์จ์ ์ผ๋ก ๋์ํ ์ ์๋ค.)
๋ฐ๋ผ์, ์๋์ ๊ฐ์ด ์์ ๋
ธ๋๋ค์๊ฒ key
๋ฅผ ์ค์ ํด์ฃผ๋ฉด, ํด๋น key
๋ฅผ ์ด์ฉํด ํจ์จ์ ์ผ๋ก ๋ Tree๋ฅผ ๋น๊ตํ ์ ์๋ค.
์ด๋, key
๊ฐ์ ๋ณดํต DB์์ ์ ๋ํฌํ ๊ฐ(ex.id)๋ฅผ ๋ถ์ฌํ๋ฉฐ, ์ ์ญ์ ์ผ๋ก ์ ์ผํ ํ์๋ ์๊ณ ํ์ element ์ฌ์ด์์๋ง ์ ์ผํ๋ฉด ๋๋ค.(์ตํ์ ์๋จ์ผ๋ก index ์ฌ์ฉ ๊ฐ๋ฅ)
<ul>
<li key="a">Apple</li>
<li key="b">Banana</li>
</ul>
//key๊ฐ g์ธ ์์ ์๋ฆฌ๋จผํธ๋ฅผ ์ฒ์์ ์ถ๊ฐ.
<ul>
<li key="g">Grape</li>
<li key="a">Apple</li>
<li key="b">Banana</li>
</ul>
Reference: ์ฝ๋์คํ ์ด์ธ