๐ Virtual DOM
- React๋ UI์ ์ํ๋ฅผ ์ถ์ ํ๊ณ , ๋ณํ๊ฐ ์ผ์ด๋ ์์๋ค์ ๋น ๋ฅด๊ฒ ์
๋ฐ์ดํธํ ์ ์๋๋ก Virtual DOM์ด๋ผ๋ ๊ฐ์์ DOM ๊ฐ์ฒด๋ฅผ ํ์ฉ
Virtual DOM์ ์ ๋ฑ์ฅํ๋ ?
- Virtual DOM์ Real DOM์ ๊ฐ๋ฒผ์ด ์ฌ๋ณธ๊ณผ๋ ๊ฐ์
- Real DOM์ Browser์์ ์์ฑ๋๋ Document Object Model์ ๊ฐ๋ฆฌํค๋ ์ฉ์ด
(Virtual DOM๊ณผ ๊ตฌ๋ถํ๊ธฐ ์ํด ์ด ์ฉ์ด๋ฅผ ์ฌ์ฉ)
Real DOM (DOM)
- DOM์ด๋ Document Object Model์ ์ฝ์
- ๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ์ ์๋ฏธ โก๏ธ Javascript์ ๊ฐ์ ์คํฌ๋ฆฝํ
์ธ์ด๊ฐ
<html>
, <head>
, <body>
์ ๊ฐ์ ํ๊ทธ๋ค์ ์ ๊ทผํ๊ณ ์กฐ์ํ ์ ์๋๋ก ๋ฌธ์๋ฅผ ํธ๋ฆฌ๊ตฌ์กฐ๋ก ๊ฐ์ฒดํ ํ ๊ฒ
โก๏ธ DOM์ ๋ธ๋ผ์ฐ์ ๊ฐ HTML ๋ฌธ์๋ฅผ ์กฐ์ํ ์ ์๋๋ก ํธ๋ฆฌ ๊ตฌ์กฐํํ ๊ฐ์ฒด๋ชจ๋ธ

DOM์ ์กฐ์ ์๋๊ฐ ๋๋ ค์ง๋ ์ด์
- DOM์ ๊ณ์ธต์ ํํ์ ํธ๋ฆฌ๊ตฌ์กฐ๋ก ๊ตฌ์ฑ
- ์๋ฃ๊ตฌ์กฐ ์ค์์๋ ํนํ "๋ฐ์ดํฐ ์ ์ฅ"์ ์๋ฏธ๋ณด๋ค๋ "์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋ ํจ๊ณผ์ ์ผ๋ก ํ์" ํ๊ธฐ ์ํด ์ฌ์ฉ ๋จ โก๏ธ ๋น ๋ฅธ ์๋ฃ ํ์ ์ฑ๋ฅ์ด ์ฅ์ ์ธ ์๋ฃ๊ตฌ์กฐ
- ํธ๋ฆฌ๊ตฌ์กฐ๋ก ๋ DOM์ Javascript์ ๊ฐ์ ์คํฌ๋ฆฝํ
์ธ์ด๊ฐ ์ ๊ทผ, ํ์ํ๋ ์๋๊ฐ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ์
๋ฐ์ดํธ ์๋ ๋ํ ๋น ๋ฆ

- DOM์ด ๋ณ๊ฒฝ๋๊ณ ์
๋ฐ์ดํธ๊ฐ ๋๋ค๋ ๊ฒ์ ๊ฒฐ๊ตญ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ์์ง ๋ํ ๋ฆฌํ๋ก์ฐ ํ๋ค๋ ๊ฒ์ ์๋ฏธ
- ๋ฆฌํ๋ก์ฐ(reflow) : DOM ์์์ ๊ธฐํํ์ ์์ฑ์ด ๋ณ๊ฒฝ๋ ๋, ๋ธ๋ผ์ฐ์ ์ฌ์ด์ฆ๊ฐ ๋ณํ ๋, ์คํ์ผ์ํธ๊ฐ ๋ก๋ฉ๋์์๋ ๋ฐ์ํ๋ ๋ณํ๋ค์ ๋ค์ ๊ณ์ฐ ํด์ฃผ๋ ์์
์ ๋ปํจ
โก๏ธ ๋ ์ด์์(Layout) ์ด๋ผ๊ณ ๋ ํ๋ค.

-
๋ธ๋ผ์ฐ์ ๋ ๋ ๋๋ง ๊ณผ์ ์์ DOM ํธ๋ฆฌ์ CSSOM ํธ๋ฆฌ๋ฅผ ํ ๋๋ก Render ํธ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ,
๊ฐ ์์๊ฐ ๋ฐฐ์น๋ ๊ณต๊ฐ์ ๊ณ์ฐํ ๋ค ์ด๋ฅผ ํ๋ฉด์ ๊ทธ๋ ค๋
-
๋ง์ฝ DOM์ด ๋ณ๊ฒฝ๋๋ค๋ฉด ์
๋ฐ์ดํธ๋ ์์์ ๊ทธ์ ํด๋นํ๋ ์์์์๋ค์ ์ํด DOMํธ๋ฆฌ๋ฅผ ์ฌ๊ตฌ์ถํ๊ฒ ๋จ
-
๊ทธ ๊ณผ์ ์์ ์ด์๋ํ ๋ ์ด์์ ์ฌ์ฐ์ฐ์ ์ํํ๋ ๋ฆฌํ๋ก์ฐ, ์ด๋ฅผ ํ๋ฉด์ ๊ทธ๋ ค๋ด๋ Repaint๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋จ
โก๏ธ ๋ณํ๊ฐ ํ์์๋ ๋ถ๋ถ๋ ๋ณ๊ฒฝ๋๋ฉด์ ์ฆ์ ๋ฆฌํ๋ก์ฐ ๋ฐ์์ผ๋ก ์ธํด ์ฑ๋ฅ์ ๋จ์ด๋จ๋ฆฌ๋ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐ

-
Javascript๋ฅผ ํตํ DOM ์กฐ์์ด ๋ง์์ง์๋ก ์ด์ ๋ํ ๋ฆฌํ๋ก์ฐ๊ฐ ๋ฐ์ํ๋ฏ๋ก DOM ์
๋ฐ์ดํธ ๋น์ฉ์ด ์ปค์ง ์ ์์
โก๏ธ "๋ฐ๋ ๋ถ๋ถ๋ง ๋น๊ตํด์ ๊ทธ ๋ถ๋ถ๋ง ๋ ๋๋ง ํ ์๋ ์์๊น ?"
Virtual DOM ์ด๋?

- ๊ฐ์ DOM์ ์ค์ DOM๊ณผ ๋๊ธฐํ ๋์ด , ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ง๋ค ๊ฐ์ฑ DOM์ ์์ฑํ์ฌ ์ด์ ์ํ์ ๋น๊ต
- " ๋ณ๊ฒฝ์ด ํ์ํ ๋ถ๋ถ๋ง ์ค์ DOM์ ๋ฐ์ํ์ฌ ์
๋ฐ์ดํธ ํจ " โก๏ธ ์ ์ฒด UI๋ฅผ ๋ค์ ๊ทธ๋ฆด ํ์๊ฐ ์์
- React์๋ DOM ๊ฐ์ฒด์ ๋์ํ๋ ๊ฐ์์ DOM๊ฐ์ฒด๊ฐ ์์
- ์๋์ ์ผ๋ก ๋ฌด๊ฑฐ์ด DOM์ ๋นํ์ฌ ํจ์ฌ ๊ฐ๋ฒผ์ด ์ฌ๋ณธ์
โก๏ธ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ก ์ด๋ฃจ์ด์ ธ ์๊ธฐ ๋๋ฌธ !
- ๊ฐ์ DOM๊ฐ์ฒด๋ ๋ง ๊ทธ๋๋ก ๊ฐ์์ด๊ธฐ ๋๋ฌธ์ ๋น๊ต๋ฅผ ์ํด์๋ง ์ฌ์ฉ
โก๏ธ ์ค์ DOM ๊ฐ์ฒด์ฒ๋ผ ํ์๋๋ ๋ด์ฉ์ ์ง์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์๋
์์๋ก ์ดํด๋ณด๋ Virtual DOM

- ๊ฐ์ DOM์ ์กฐ์ํ๋ ๊ฒ๊ณผ ์ค์ DOM์ ์กฐ์ํ๋ ๊ฒ์ ์ฐจ์ด๋ฅผ ์์๋ฅผ ๋ค์ด๋ณธ๋ค๋ฉด
์ง์ ์ด์ฌ๊ฐ๋๋ฅผ ๋ ์ฌ๋ ค ๋ณผ ์ ์์
- ๊ฐ์ DOM์ ์ด์ฟ๋ ๊ฐ๊ตฌ ๋ฐฐ์น ์ ๋ฏธ๋ฆฌ ๊ฐ๊ตฌ๋ฐฐ์น์ ๋ํด ์๊ฐํด๋๊ณ ์ค์ ๋ก ๋ฐฐ์นํ๋ ๊ฒ๊ณผ ๊ฐ์ โก๏ธ ๋ฏธ๋ฆฌ ๋ฐฐ์น๋ฅผ ๋จธ๋ฆฌ์์ผ๋ก ๊ตฌ์ํด ๋๋ ๊ฒ ?
Virtual DOM์ ํํ
- ๊ฐ์ DOM์ ์ถ์ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ ํํ๋ฅผ ๊ฐ์ง๊ณ ์์

์ DOMํธ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด Javascript ๊ฐ์ฒด๋ก๋ ํํ ๊ฐ๋ฅ
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"
}
]
]
}
]
}
- ์ DOM์ ๊ฐ์ DOM์ด๋ผ๊ณ ์๊ฐํด๋ณด๋ฉด, ์ค์ DOM๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ DOM ๋ํ HTML๋ฌธ์ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํจ
- ํ๋ฒํ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด โก๏ธ ์ค์ DOM์ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๋ ํ์ํ ๋งํผ ์์ ์กฐ์ ๊ฐ๋ฅ
- ๊ฐ์ DOM์ ๋ฆฌ์กํธ์์ ์ปดํฌ๋ํธ์ ์ํ๋ ์์ฑ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋ก ์์ฑ
- ๋ฆฌ์กํธ๋ ์ด์ ๊ฐ์ DOM๊ณผ ์๋ก์ด ๊ฐ์ DOM์ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ์ค์ DOM์ ๋ฐ์
Virtual DOM์ ๋์๊ณผ์

๋ค์๊ณผ ๊ฐ์ ๋์์ ์ฌ์ดํธ์์ ํน์ ์ธ๋ค์ผ ํด๋ฆญ ์, ๋ชจ๋ฌ ํ๋ ์ด์ด๊ฐ ์ฌ์๋๋ ๊ฒฝ์ฐ๋ฅผ ์์ํด๋ณด์ !
โก๏ธ ๐ค ๋ฆฌ์ํธ์์ ์ด์ ๊ฐ์ ์ํ ๋ณํ์ ์ด๋ป๊ฒ ๋์ํ ๊น ?

- ๋ฆฌ์กํธ๋ฅผ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ์์
์ด ์ผ์ด๋ฌ์ ๋, ๊ฐ์ DOM์ ์ ์ฅ๋ ์ด์ ์ํ์ ํ์ฌ ์ํ๋ฅผ ๋น๊ต
- ์ ๊ณผ์ ์์ React๋ Diffing ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝ๋ ๋ถ๋ถ์ ๊ฐ์ง
- React์์ ์ํ๋ณ๊ฒฝ์ ํ๋ ๊ฒฝ์ฐ์๋ Diffing ์๊ณ ๋ฆฌ์ฆ์์ ์ด๋ฅผ ๊ฐ์งํ ์ ์๋๋ก ์ง์ ํ ๋น์ด ์๋
setState
์ ๊ฐ์ ๋งค์๋๋ฅผ ํ์ฉํด ์ํ๋ฅผ ๋ณ๊ฒฝ

- ๊ฐ์ DOM๊ณผ ๋ณ๊ฒฝ๋ ์๋ก์ด ๊ฐ์ DOM์ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ์ด ํ์ํ ๋ถ๋ถ๋ง ์ค์ DOM์ ๋ฐ์ํ์ฌ ์
๋ฐ์ดํธ
โก๏ธ ์ด๊ฒ์ Reconciliation, ์ฌ์กฐ์ ์ด๋ผ๊ณ ํจ
- ์ฌ๋ฌ๊ฐ ์ํ๋ณํ๊ฐ ์์ ๊ฒฝ์ฐ, ์ผ๊ด์ ์ผ๋ก ํ๋ฒ์ ์
๋ฐ์ดํธ (Batch Update)
โก๏ธ ์ด๋ฅผ ํตํด ์ฑ๋ฅ์ ์ต์ ํํ๊ณ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ต์ํํ ์ ์์
๐โโ๏ธ Virtual DOM์ ๋น ๋ฅด๋ค?
-
๊ฐ์ DOM์ ์ผ๋ฐ์ ์ผ๋ก ์ค์ DOM์ ์กฐ์ํ๋ ๊ฒ ๋ณด๋ค๋ ๋น ๋ฅด์ง๋ง, ๋ชจ๋ ๊ฒฝ์ฐ์ ๊ทธ๋ ์ง๋ ์๋ค
โก๏ธ ๋๋ก๋ ์ง์ DOM์ ์กฐ์ํ๋ ๊ฒ์ด ๋ ๋น ๋ฅธ ๊ฒฝ์ฐ๋ ์์
-
์ค์ DOM ์กฐ์์ด ๋๋ ค์ง๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ
DOM ์กฐ์์ด ๋ฐ์ํ ๋๋ง๋ค ๋ธ๋ผ์ฐ์ ์์ ๋ค์ ๋ ์ด์์์ ๊ณ์ฐํ๊ณ , ํ์ด์ง๋ฅผ ๋ค์ ๊ทธ๋ฆฌ๊ธฐ ๋๋ฌธ
โก๏ธ ์ด๋ฌํ ๋ ๋๋ง ๊ณผ์ ์์ ๋ฐ์ํ๋ ๋น์ฉ โ
-
๊ฐ์ DOM์ ํ์ฉํ์ฌ ์ค์ DOM ์กฐ์์ ์ต์ํํ๋ ๊ฒ์ด ์ฑ๋ฅ ์ต์ ํ์ ํต์ฌ์ด๋ผ๊ณ ๋ณผ ์ ์์
๐ค Quiz
Q. React์ ๊ฐ์์ DOM ๊ฐ์ฒด๋ ๋ชจ๋ ์ค์ฌํ๋ DOM ๊ฐ์ฒด๋ฅผ ๋์ํ์ง ๋ชปํ๋ค ?
A. X
โก๏ธ React์๋ DOM ๊ฐ์ฒด์ ๋์ํ๋ ๊ฐ์์ DOM ๊ฐ์ฒด๊ฐ ์์ต๋๋คReact์๋ DOM ๊ฐ์ฒด์ ๋์ํ๋ ๊ฐ์์ DOM ๊ฐ์ฒด๊ฐ ์์ต๋๋ค