Jieunny์ ๋ธ๋ก๊ทธ
S4) Unit 4. [React] Virtual DOM ๋ณธ๋ฌธ
๐ฃ Virtual DOM
๐ญ. Vertual DOM์ ์ ์
โ๏ธ React์ ์๋ ๊ฐ์์ DOM ๊ฐ์ฒด
โฐ ์ค์ DOM์ ์ฌ๋ณธ ๊ฐ์ ๊ฐ๋ ์ผ๋ก, ๋ฆฌ์กํธ๋ ์ค์ DOM์ ์ ๊ทผํด์ ์กฐ์ํ๋ ๋์ ๊ฐ์์ DOM ๊ฐ์ฒด์ ์ ๊ทผํด์ ๋ณํ ์ ๊ณผ ํ๋ฅผ ๋น๊ตํ๊ณ ๋ฐ๋ ๋ถ๋ถ๋ง ์ค์ DOM์ ์ ์ฉํ๋ค.
๐ฎ. Vertual DOM์ด ๋์ค๊ฒ ๋ ๋ฐฐ๊ฒฝ
โ๏ธ DOM์ ์ ํ๋ฆฌ์ผ์ด์ ์ UI ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํด๋น ๋ณ๊ฒฝ์ฌํญ์ ๋ํ๋ด๊ธฐ ์ํด ์ ๋ฐ์ดํธ(๋ฆฌํ๋ก์ฐ) ๋๊ณ , ์ด๋ ๊ฒ DOM์ ์กฐ์ํ๋ ์ ๋๊ฐ ๋ง์์ง๋ฉด ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
โฐ ๋ฐ๋ ๋ถ๋ถ์ ํ๋ํ๋ ๋ฆฌ๋ ๋๋งํ๊ฒ ๋๋ค๋ฉด ๋น์ฉ๋ ๋ง์ด ๋ค๊ณ ๋ธ๋ผ์ฐ์ ์ ์๋๋ ๋ฆ์ด์ง๊ฒ ๋๋ค.
โฐ ์ค์ DOM ๊ฐ์ฒด์ ๋์ผํ ์์ฑ์ ๊ฐ์ง๊ณ ์์์๋ ํจ์ฌ ๊ฐ๋ฒผ์ด ์ฌ๋ณธ์ธ virtual DOM์ ์กฐ์ํ๊ฒ ๋๋ฉด ์ค์ DOM์ฒ๋ผ ์ค์ ๋ก ๋ธ๋ผ์ฐ์ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ํจ์ฌ ์๋๊ฐ ๋น ๋ฅด๊ฒ ๋๋ค.
โฐ ๊ฒฐ๊ณผ์ ์ผ๋ก๋ ๋ฐ๋ ๋ถ๋ถ๋ง ์ค์ DOM์ ์ ์ฉํ ์ ์๊ฒ ๋๋ค.
๐ฏ. Vertual DOM์ ํํ
โ๏ธ ์ถ์ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ ํํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
โฐ ์ถ์ํ๋ง ๋์์ ๋ฟ ํ๋ฒํ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ด๋ฏ๋ก ์ค์ DOM์ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๋ ํ์ํ ๋งํผ ์์ ๋กญ๊ฒ ์กฐ์ํ ์ ์๋ค.
const vDom = {
tagName: "html",
children: [
{ tagName: "head" },
{ tagName: "body",
children: [
tagName: "ul",
attributes: { "class": "list"},
children: [
{
tagName: "li",
attributes: { "class": "list_item" },
textContent: "List item"
}
]
]
}
]
}
๐ฃ React Diffing Algorithm
๐ญ. React Diffing Algorithm์ ์ ์
โ๏ธ ๊ธฐ์กด ๊ฐ์ DOM๊ณผ ์๋ก์ด ๊ฐ์ DOM์ ๋น๊ตํ ๋ ์ฌ์ฉ๋๋ ๋น๊ต ์๊ณ ๋ฆฌ์ฆ
๐ฎ. React๊ฐ DOM ํธ๋ฆฌ๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ
โ๏ธ ํธ๋ฆฌ์ ๋ ๋ฒจ ์์๋๋ก ์ํํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํ์ํ๋ค.
โฐ ๊ฐ์ ๋ ๋ฒจ(์์น)๋ผ๋ฆฌ ๋น๊ตํ๋ ๊ฒ -> ๋๋น ์ฐ์ ํ์(BFS)์ ์ผ์ข
โฐ ๋์ผ ์ ์์ ์๋ ๋ ธ๋๋ฅผ ํ์ ํ ๋ค ๋ค์ ์์ ์ธ๋์ ๋ ธ๋๋ฅผ ์์ฐจ์ ์ผ๋ก ํ์ ํด ๋๊ฐ๋ค.
1๏ธโฃ ๋ค๋ฅธ ํ์ ์ DOM ์๋ฆฌ๋จผํธ์ธ ๊ฒฝ์ฐ
<div>
<Counter />
</div>
//๋ถ๋ชจ ํ๊ทธ๊ฐ div์์ span์ผ๋ก ๋ฐ๋๋๋ค.
<span>
<Counter />
</span>
โฐ ๋ถ๋ชจ ๋ ธ๋์๋ <div> ๊ฐ <span> ์ผ๋ก ๋ฐ๋๋ฉด ์์ ๋ ธ๋์ธ <Counter />๋ ์์ ํ ํด์ ๋๋ค.
โฐ ์ฆ, <span> ํ๊ทธ ์ ์๋ก์ด <Counter /> ๊ฐ ๋ค์ ์คํ๋๋ ๊ฒ์ด๋ค.
โฐ ๊ธฐ์กด์ ์ปดํฌ๋ํธ๋ ์์ ํ ํด์ ๋๊ธฐ ๋๋ฌธ์ <Counter />๊ฐ ๊ฐ๊ณ ์๋ ๊ธฐ์กด state ๋ํ ํ๊ดด๋๋ค.
2๏ธโฃ ๊ฐ์ ํ์ ์ DOM ์๋ฆฌ๋จผํธ์ธ ๊ฒฝ์ฐ
<div className="before" title="stuff" />
//๊ธฐ์กด์ ์๋ฆฌ๋จผํธ๊ฐ ํ๊ทธ๋ ๋ฐ๋์ง ์์ ์ฑ className๋ง ๋ฐ๋์์ต๋๋ค.
<div className="after" title="stuff" />
โฐ ํ์ ์ด ๋ฐ๋์ง ์๋๋ค๋ฉด ๋ฆฌ์กํธ๋ ๊ฐ์ DOM์ ์ฌ์ฉํด์ ์ต์ํ์ ๋ณ๊ฒฝ ์ฌํญ๋ง ์ ๋ฐ์ดํธ ํ๋ค.
โฐ ์ ๋ฐ์ดํธ ํ ๋ด์ฉ์ด ์๊ธฐ๋ฉด ๊ฐ์ DOM ๋ด๋ถ์ ํ๋กํผํฐ๋ง ์์ ํ ๋ค, ๋ชจ๋ ๋ ธ๋์ ๊ฑธ์น ์ ๋ฐ์ดํธ๊ฐ ๋๋๋ฉด ๊ทธ๋ ์ต์ข ์ ์ผ๋ก ํ๋ฒ๋ง ์ค์ DOM์ผ๋ก์ ๋ ๋๋ง์ ์๋ํ๋ค.
//className์ด before์ธ ์ปดํฌ๋ํธ
<div style={{color: 'red', fontWeight: 'bold"}} title="stuff" />
//className์ด after์ธ ์ปดํฌ๋ํธ
<div style={{color: 'green', fontWeight: 'bold"}} title="stuff" />
โฐ ๋ฆฌ์กํธ๋ color ์คํ์ผ๋ง ์์ ํ๊ณ , fontWeight ๋ฐ ๋ค๋ฅธ ์์๋ ์์ ํ์ง ์๋๋ค.
โฐ ํ๋์ DOM ๋ ธ๋๋ฅผ ์ฒ๋ฆฌํ ๋ค ๋ฆฌ์กํธ๋ ํด๋น ๋ ธ๋๋ค ๋ฐ์ ์์๋ค์ ์์ฐจ์ ์ผ๋ก ๋์์ ์ํํ๋ฉด์ ์ฐจ์ด๊ฐ ๋ฐ๊ฒฌ๋ ๋๋ง๋ค ๋ณ๊ฒฝํ๋ค -> ์ฌ๊ท์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค
3๏ธโฃ ์์ ์๋ฆฌ๋จผํธ์ ์ฌ๊ท์ ์ฒ๋ฆฌ
<ul>
<li>first</li>
<li>second</li>
</ul>
//์์ ์๋ฆฌ๋จผํธ์ ๋์ ์๋ก์ด ์์ ์๋ฆฌ๋จผํธ๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
<ul>
<li>first</li>
<li>second</li>
<li>third</li>
</ul>
โฐ ๋ฆฌ์กํธ๋ ์์์๋ถํฐ ์๋๋ก ๋น๊ตํ๋ฉด์ ๋ฐ๋ ์ ์ ์ฐพ๋๋ค.
โฐ ์ฒซ ๋ฒ์งธ ์์ ๋ ธ๋๋ค๊ณผ ๋ ๋ฒ์งธ ์์ ๋ ธ๋๋ค์ด ์ผ์นํ๋ ๊ฑธ ํ์ธํ ๋ค ์ธ๋ฒ์งธ ์์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ค.
=> ์ฒซ ๋ฒ์งธ ์์ ๋ ธ๋๋ฅผ ๋ฐ๊พธ๋ฉด ๋ฆฌ์กํธ๋ ๋ ๋ฒ์งธ, ์ธ ๋ฒ์งธ ์์ ๋ ธ๋๋ ์ ์ง์์ผ๋ ๋๋ค๋ ๊ฒ์ ๊นจ๋ซ์ง ๋ชปํ๊ณ ์ ๋ถ ์๋กญ๊ฒ ๋ ๋๋ง ํ๋ค.
=> ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด 'key' ์์ฑ์ ์ง์ํ๋ค.
๐ฏ. Key
โ๏ธ ๋ง์ฝ ์์ ๋ ธ๋๋ค์ด ์ด key๋ฅผ ๊ฐ๊ณ ์๋ค๋ฉด, ๋ฆฌ์กํธ๋ ๊ทธ key๋ฅผ ์ด์ฉํด ๊ธฐ์กด ํธ๋ฆฌ์ ์์๊ณผ ์๋ก์ด ํธ๋ฆฌ์ ์์์ด ์ผ์นํ๋์ง ์๋์ง ์ ์ ์๋ค.
<ul>
<li key="2015">Duke</li>
<li key="2016">Villanova</li>
</ul>
//key๊ฐ 2014์ธ ์์ ์๋ฆฌ๋จผํธ๋ฅผ ์ฒ์์ ์ถ๊ฐํฉ๋๋ค.
<ul>
<li key="2014">Connecticut</li>
<li key="2015">Duke</li>
<li key="2016">Villanova</li>
</ul>
โฐ ๋ฆฌ์กํธ๋ key ์์ฑ์ ํตํด 2014 ๋ผ๋ ์์ ์๋ฆฌ๋จผํธ๊ฐ ์๋ก ์๊ฒผ๊ณ , 2015, 2016 ํค๋ฅผ ๊ฐ์ง ์๋ฆฌ๋จผํธ๋ ๊ทธ์ ์์น๋ง ์ด๋ํ๋ค๋ ๊ฑธ ์ ์ ์๋ค.
โฐ ์ด key ์์ฑ์ ๋ณดํต ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์์ ์ ๋ํฌํ ๊ฐ์ ๋ถ์ฌํด์ฃผ๋ฉด ๋๋๋ฐ, ์ ์ญ์ ์ผ๋ก ์ ์ผํ ํ์๋ ์๊ณ ํ์ ์๋ฆฌ๋จผํธ ์ฌ์ด์์๋ง ์ ์ผํ๋ฉด ๋๋ค => ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ key๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋นํจ์จ์ ์ผ๋ก ๋์ํ๊ฒ ํ๋ค.
'CodeStates > learning contents' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
S4) Unit 4. [React] React์ ๊ธฐ๋ฅ (0) | 2023.03.23 |
---|---|
S4) Unit 4. [React] React Hooks (0) | 2023.03.23 |
S4) Unit 3. [React] ๋ฒ๋ค๋ง๊ณผ ์นํฉ (0) | 2023.03.20 |
S4) Unit 2. [HTML/CSS] CSS ์ ๋๋ฉ์ด์ & Canvas (0) | 2023.03.17 |
S4) Unit 2. [HTML/CSS] ๋ฐ์ํ ์น (0) | 2023.03.16 |