๐ Chapter 3: ๊ฐ์ DOM
๊ฐ์ DOM ์๊ฐโ
๊ทธ๋ฅ DOM์ด๋ผ๊ณ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ฐํ์์ ๋ฌธ์ ๋ชจ๋ธ์ ์๋ฏธํฉ๋๋ค. DOM์ ๊ฐ๋ฒผ์ด ๋ณต์ฌ๋ณธ์ด ๊ฐ์ DOM์ธ๋ฐ, ์ค์ DOM์ ๋ ธ๋ ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋๊ณ ๊ฐ์ DOM์ ์ค๋ช ์ญํ ์ ํ๋ ํ๋ฒํ JS ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋๋ค๋ ์ ์์ ํฐ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๋ฆฌ์กํธ๋ ์ฐ๋ฆฌ๊ฐ setState
๋๋ ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ์ ํตํด UI๋ฅผ ๋ณ๊ฒฝํ๋ผ๊ณ ์ง์ํ ๋๋ง๋ค ๊ฐ์ DOM์ ๋จผ์ ์
๋ฐ์ดํธํ ๋ค์, ๊ฐ์ DOM์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ง์ถฐ ์ค์ DOM์ ์
๋ฐ์ดํธํฉ๋๋ค. ์ด ๊ณผ์ ์ ๊ฐ๋ฆฌ์ผ ์ฌ์กฐ์ (reconciliation)์ด๋ผ๊ณ ํฉ๋๋ค.
๊ฐ์ DOM์ ๋จผ์ ์ ๋ฐ์ดํธํ๋ ์ด์ ๋ ์ค์ DOM์ ์ ๋ฐ์ดํธ๊ฐ ๋ค์ ๋๋ฆฌ๊ณ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฐ์ DOM ์ ๋ฐ์ดํธ๋ ์ค์ ํ์ด์ง ๋ ์ด์์์ ๋ณ๊ฒฝํ์ง ์๊ธฐ ๋๋ฌธ์ ํจ์ฌ ๋น ๋ฅด๊ฒ ๋์ํฉ๋๋ค.
๋ฆฌ์กํธ๋ ๊ฐ์ DOM์ด ์ ๋ฐ์ดํธ๋๋ฉด ๋น๊ต ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ฐ์ DOM์ ์ด์ ๋ฒ์ ๊ณผ ์ ๋ฒ์ ์ ์ฐจ์ด์ ์ ์๋ณํฉ๋๋ค. ๊ทธ ํ ์ค์ DOM ์ ๋ฐ์ดํธ์ ํ์ํ ์ต์ํ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ ํ๊ณ , ์ผ๊ด์ ์ด๊ณ ์ต์ ํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํด ์ฑ๋ฅ ์ํฅ์ ์ต์ํํฉ๋๋ค.
์ค์ DOMโ
์น ๋ธ๋ผ์ฐ์ ๋ HTML ํ์ด์ง๋ฅผ ์ฝ์ด ๋ค์ด๊ณ ๋๋ฉด, ๊ตฌ๋ฌธ์ ๋ถ์ํด ๋ ธ๋์ ๊ฐ์ฒด์ ํธ๋ฆฌ, ๋ค์ ๋งํด DOM์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฐ์ฒด ๋ชจ๋ฌ๋ก ๋ณํํฉ๋๋ค. DOM์ ์ปค๋ค๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ผ ๋ฟ์ ๋๋ค. ์น ํ์ด์ง์ ํ์ฌ ์ํ๋ฅผ ์ค์๊ฐ์ผ๋ก ํํํ ๊ฒ์ผ๋ก, ์ฌ์ฉ์๊ฐ ํ์ด์ง์ ์ํธ์์ฉํ๋ ๋๋ก ๊ณ์ ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
์ค์ DOM์ ๋ฌธ์ ์ โ
์ฑ๋ฅ, ๋ธ๋ผ์ฐ์ ๊ฐ ํธํ์ฑ, ๋ณด์ ์ทจ์ฝ์ฑ ๋ฑ์ด๋ฉฐ, DOM์ ์ง์ ์กฐ์ํ๋ฉด ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ (XSS) ์ทจ์์ ์ด ์๊ธธ ์ ์์ต๋๋ค.
์ฑ๋ฅโ
์ค์ DOM์์ ๊ฐ์ฅ ๋ฌธ์ ์๋๋ ์ฌ์์ ์ฑ๋ฅ์ ๋๋ค. ์๋ฆฌ๋จผํธ์ ์ถ๊ฐ๋ ์ ๊ฑฐ, ์๋ฆฌ๋จผํธ์ ํ ์คํธ๋ ์์ฑ ์ ๋ฐ์ดํธ ๋ฑ์ผ๋ก DOM์ ๋ณ๊ฒฝํ ๋๋ง๋ค ๋ธ๋ผ์ฐ์ ๋ ๋ ์ด์์์ ๋ค์ ๊ณ์ฐํ๊ณ ํ์ด์ง์ ์ํฅ์ ๋ฐ๋ ๋ถ๋ถ์ ๋ค์ ๊ทธ๋ฆฝ๋๋ค. ํนํ ํฌ๊ณ ๋ณต์กํ ์น ํ์ด์ง๋ผ๋ฉด ์ด ๊ณผ์ ์ ์๋๊ฐ ๋๋ ค์ง๊ณ ๋ฆฌ์์ค๋ฅผ ๋ง์ด ์ฌ์ฉํ๊ธฐ๋ ํฉ๋๋ค.
์ ๋ฐ์ ์ผ๋ก ์ค์ DOM์ ์ฑ๋ฅ ๋ฌธ์ ๋ ํฌ๊ณ ๋ณต์กํ ์น ํ์ด์ง๋ฅผ ์ฒ๋ฆฌํ ๋ ํฐ ๋ถ๋ด์ด ๋ฉ๋๋ค. CSS ์ ํ์ ์ต์ ํ, ์ด๋ฒคํธ ์์ ์ฌ์ฉ, ์ฝ๊ธฐ/์ฐ๊ธฐ DOM ์์ ์ผ๊ด ์ฒ๋ฆฌ, CSS ์ ๋๋ฉ์ด์ ์ฌ์ฉ ๋ฑ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ํํ๋ ๊ธฐ์ ์ด ์๊ธฐ๋ ํ์ง๋ง ๋ณต์กํ๊ณ ๊ตฌํ์ด ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๊ฐ์ DOM์ ์ฌ์ฉํ๋ฉด ์ค์ DOM์ ๋ณต์ก์ฑ์ ์ถ์ํํ๊ณ UI๋ฅผ ๋ ๊ฐ๋ณ๊ฒ ํํํจ์ผ๋ก์จ ๋ณด๋ค ํจ์จ์ ์ด๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ UI๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ ํธํ์ฑโ
์ค์ DOM์์ ๋ฌธ์ ์๋๋ ๋ ๋ค๋ฅธ ์ฌ์์ ๋ธ๋ผ์ฐ์ ๊ฐ ํธํ์ฑ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ง๋ค ๋ฌธ์ ๋ชจ๋ธ๋ง ๋ฐฉ์์ด ๋ฌ๋ผ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋์ง ์๊ณ , ์ด๋ก ์ธํด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ ํธํ์ฑ์ด ์ฃผ์ ๋ฌธ์ ์ค ํ๋๋ ํน์ DOM ์๋ฆฌ๋จผํธ์ ์์ฑ์ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์์ ์๋ ์๋ค๋ ์ ์ ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ๋ชจ๋ ๋์ ํ๋ซํผ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋๋ก ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ๋ ๋ฌธ์ ๋ฅผ ์ฐํํ ๋ฐฉ๋ฒ์ ๊ตฌํํ๋ ๋ฐ ์ถ๊ฐ์ ์ธ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ ๋ค์ฌ์ผ ํ์ต๋๋ค.
๋ฆฌ์กํธ์ ํฉ์ฑ ์ด๋ฒคํธ ์์คํ
์ด ํด๊ฒฐํ๊ณ ์ ํ ๋ฌธ์ ๊ฐ ๋ฐ๋ก ๊ทธ๊ฒ์
๋๋ค. SyntheticEvent
๋ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ณธ ์ด ๋ฒคํธ๋ฅผ ๋๋ฌ์ผ ๋ํผ(wrapper) ๊ฐ์ฒด๋ก, ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ์์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค. ์ด ๊ฐ์ฒด๋ ๋ค์๊ณผ ๊ฐ์ ๋งค์ปค๋์ฆ์ ์ฌ์ฉํด ๋ธ๋ผ์ฐ์ ๊ฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- ํตํฉ ์ธํฐํ์ด์ค
// ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๊ฐ๋ฐ์๋ ๊ฐ๋ณ ๋ธ๋ผ์ฐ์ ๋ง๋ค ์์ฑ์ ํ์ธํด์ผ ํฉ๋๋ค.
const targetElement = event.target || event.srcElement;
// ๋ฆฌ์กํธ์์๋ SyntheticEvent ๋๋ถ์ ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋ฉ๋๋ค.
function handleClick(event) {
const target = event.target;
// ...๋๋จธ์ง ์ฝ๋
}
- ์ด๋ฒ ํธ ์์
- ๋ฆฌ์กํธ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์๋ฆฌ๋จผํธ์ ์ง์ ์ถ๊ฐํ์ง ์๊ณ ๋์ ๋ฃจํธ์์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ๋ค์ํ ๊ธฐ๋ฅ ๊ฐ์
- ๊ธฐ๋ณธ ์๋ฐ์คํฌ๋ฆฝํธ์์
onChange
์ด๋ฒคํธ์ ๋์์ ์ ๋ ฅ ์ปดํฌ๋ํธ์ ์ข ๋ฅ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. - ๋ฆฌ์กํธ์
SyntheticEvent
์์คํ ์ ์ด๋ฌํ ์ ๋ ฅ ์๋ฆฌ๋จผํธ ์ ์ฒด์์onChange
์ด๋ฒคํธ์ ๋์์ ์ ๊ทํํฉ๋๋ค.
- ๋ค์ดํฐ๋ธ ์ด๋ฒคํธ์ ์ ๊ทผ
- ์น ๋ธ๋ผ์ฐ์ ์ ๋ค์ดํฐ๋ธ ์ด๋ฒคํธ๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋
event.nativeEvent
๋ฅผ ํตํด ์ ๊ทผํ ์ ์์ต๋๋ค.
๋ฌธ์ ์กฐ๊ฐโ
๋ฌธ์ ์กฐ๊ฐ์ DOM ๋ ธ๋๋ฅผ ์ ์ฅํ๋ ๊ฐ๋ฒผ์ด ์ปจํ ์ด๋์ ๋๋ค. ๊ธฐ๋ณธ DOM์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์ฌ๋ฌ ๊ฐ์ง ์ ๋ฐ์ดํธ๋ฅผ ์ํํ ์ ์๋ ์์ ์ ์ฅ์์ฒ๋ผ ๋์ํฉ๋๋ค. ์ ๋ฐ์ดํธ ์์ ์ด ์๋ฃ๋๋ฉด ๋ฌธ์ ์กฐ๊ฐ์ DOM์ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ๋ฆฌํ๋ก์ ๋ฆฌํ์ธํ ์ ํ ๋ฒ๋ง ๋ฐ์์ํต๋๋ค. ์ ๋ฐ์ดํธ ๋ฐฉ์์ด ๋ฆฌ์กํธ์ ๊ฐ์ DOM๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
๋ฌธ์ ์กฐ๊ฐ์ ์ผ๊ด ์ ๋ฐ์ดํธ๊ฐ ๊ฐ๋ฅํ ๊ฐ๋ฒผ์ด ์ปจํ ์ด๋์ด๋ฏ๋ก ์ฌ๋ฌ ๊ฐ์ง ์ฑ๋ฅ ์ด์ ์ด ์์ต๋๋ค.
- ์ผ๊ด ์
๋ฐ์ดํธ
- ๋ฌธ์ ์กฐ๊ฐ ๋ด์์ ์ผ๋ง๋ ๋ง์ ์๋ฆฌ๋จผํธ๋ ์ ๋ฐ์ดํธ๋ฅผ ์ํํ๋ ๋ฆฌํ๋ก์ ๋ฆฌํ์ธํ ์ ํ ๋ฒ๋ง ์ํ๋ฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ
- ๋ฌธ์ ์กฐ๊ฐ์ ์ถ๊ฐ๋ ๋ ธ๋๋ ๋ฌธ์์ ์ค์ DOM์์ ์ ๊ฑฐ๋ฉ๋๋ค. ์ด๋ ๋ฌธ์์์ ํฐ ์์ญ์ ์ฌ์ ๋ ฌํ ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ต์ ํํ๋ ๋ฐ ์ผ์กฐํฉ๋๋ค.
- ์ค๋ณต ๋ ๋๋ง ๋ฐฉ์ง
- ๋ฌธ์ ์กฐ๊ฐ์ ํ์ฑํ๋ ๋ฌธ์ DOM ํธ๋ฆฌ์ ์ํ์ง ์์ผ๋ฏ๋ก ๋ฌธ์ ์กฐ๊ฐ์ ๋ณ๊ฒฝํด๋ ์ค์ ๋ฌธ์์๋ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉฐ, ์ค์ DOM์ ์ถ๊ฐ๋ ๋๊น์ง ์คํ์ผ๊ณผ ์คํฌ๋ฆฝํธ๊ฐ ์ ์ฉ๋์ง ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์คํ์ผ ์ฌ๊ณ์ฐ๊ณผ ์คํฌ๋ฆฝํธ ์คํ์ ์ค๋ณต ์ํ์ ๋ฐฉ์งํฉ๋๋ค.
๋ชฉ๋ก์ ์ฌ๋ฌ ๊ฐ์ ํญ๋ชฉ์ ์ถ๊ฐํด์ผ ํ๋ค๊ณ ์๊ฐํด ๋ด ์๋ค.
const fragment = document.createDocumentFragment();
for(let i = 0; i < 100; i++) {
const li = document.createElement("li");
li.textContent = `๋ชฉ๋ก ํญ๋ชฉ ${i + 1}`;
fragment.appendChild(li);
}
document.getElementById("myList").appendChild(fragment);
์ด ์์์๋ 100๊ฐ์ ๋ชฉ๋ก ํญ๋ชฉ์ด ๋จผ์ ๋ฌธ์ ์กฐ๊ฐ์ ์ถ๊ฐ๋ฉ๋๋ค. ๊ทธ ํ์ ๋ฌธ์ ์กฐ๊ฐ์ ๊ธฐ๋ณธ ๋ชฉ๋ก์ ์ถ๊ฐํฉ๋๋ค. ๋๋ถ์ ๋ฌธ์์ ์ค์ DOM์ ๊ฐ๊ฐ 100๋ฒ์ด ์๋๋ผ ๋จ ํ ๋ฒ ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ์กฐ๊ฐ์ ์ฌ๋ฌ ๋ณ๊ฒฝ ์ฌํญ์ ์ผ๊ด ์ฒ๋ฆฌํด DOM์ ํจ์จ์ ์ผ๋ก ์กฐ์ํฉ๋๋ค. ๋ฐ๋ผ์ ๋น์ฉ์ด ๋ง์ด ๋๋ ๋ฆฌํ๋ก์ ๋ฆฌํ์ธํธ ํ์๊ฐ ์ค๋๋ค.
๋ฆฌ์กํธ์ ๊ฐ์ DOM์ ๋ฌธ์ ์กฐ๊ฐ ๊ฐ๋ ์ ๋ ๋์ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ๊ฒ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค. ๋น์ทํ ์ ์ ๊ฐ๋ตํ๊ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
- ์ผ๊ด ์
๋ฐ์ดํธ
- ๋ฌธ์ ์กฐ๊ฐ๊ณผ ์ ์ฌํ๊ฒ ๋ฆฌ์กํธ์ ๊ฐ์ DOM์ ์ฌ๋ฌ ๋ณ๊ฒฝ ์ฌํญ์ ํ๊บผ๋ฒ์ ์ผ๊ด ์ฒ๋ฆฌํฉ๋๋ค.
- ํจ์จ์ ์ธ ๋น๊ต ์๊ณ ๋ฆฌ์ฆ
- ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋๊ณ ๋๋ฉด ๋ฆฌ์กํธ๋ ํ์ฌ ๊ฐ์ DOM๊ณผ ์ค์ฌ DOM์ ์ฐจ์ด์ ์ ํ์ธํฉ๋๋ค.
- ๋จ์ผ ๋ ๋๋ง
- ์ฐจ์ด์ ์ด ์๋ณ๋๋ฉด ๋ฆฌ์กํธ๋ ๋จ ํ ๋ฒ์ ์ผ๊ด ์ฒ๋ฆฌ๋ฅผ ํตํด ์ค์ DOM์ ์ ๋ฐ์ดํธํฉ๋๋ค.
๊ฐ๋จํ ๋งํด ๋ฌธ์ ์กฐ๊ฐ์ ๋ฌธ์์ ์ค์ฌ DOM์ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ทธ๋ฃนํํ์ฌ ์ต์ ํํ์ง๋ง, ๋ฆฌ์กํธ์ ๊ฐ์ DOM์ ํ ๊ฑธ์ ๋ ๋์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ UI ์ ๋ฐ์ ๊ฑธ์ณ ์๋ฆฌํ๊ฒ ์ฐจ์ด์ ์ ํ์ ํ๊ณ ์ผ๊ด์ ์ผ๋ก ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํด ๋ ๋๋ง์ ํจ์จ์ฑ์ ๊ทน๋ํํฉ๋๋ค.
๊ฐ์ DOM ์๋ ๋ฐฉ์โ
๋ฆฌ์กํธ ์๋ฆฌ๋จผํธโ
๋ค์์ ๋ฆฌ์กํธ ์๋ฆฌ๋จผํธ์ ์์์ ๋๋ค.
const element = React.createElement(
"div",
{ className: "my-class" },
"Hello, world!"
);
๋ค์์ ์ค์ ๋ก ์์ฑ๋ ์๋ฆฌ๋จผํธ์ ๋๋ค.
{
$$typeof: Symbol(react.element),
type: "div",
key: null,
ref: null,
props: {
className: "my-class",
children: "Hello, world!"
},
_owner: null,
_store: {}
}
$$typeof
โ
๊ฐ์ฒด๊ฐ ์ ํจํ ๋ฆฌ์กํธ ์๋ฆฌ๋จผํธ์ธ์ง ํ์ธํ ๋ ์ฌ์ฉํ๋ ํน์ํ ์ฌ๋ฒ์
๋๋ค. ์ฌ๊ธฐ์๋ Symbol(react.element)
๋ก ์ค์ ๋์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก $$typeof
๋ ๋ฆฌ์กํธ ์๋ฆฌ๋จผํธ์ ์ข
๋ฅ๋ฅผ ์๋ณํ๋ ํ์์ ์ญํ ์ ํฉ๋๋ค.
type
โ
type
์์ฑ์ ์๋ฆฌ๋จผํธ๊ฐ ๋ํ๋ด๋ ์ปดํฌ๋ํธ์ ์ข
๋ฅ๋ฅผ ์๋ ค ์ค๋๋ค. ๋ฆฌ์กํธ ์๋ฆฌ๋จผํธ์ type
์์ฑ์ ๋ฌธ์์ด์ด๊ฑฐ๋ ํจ์์
๋๋ค. ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ์๋ div
, span
, button
๊ฐ์ HTML ํ๊ทธ ์ด๋ฆ์ ๋ํ๋
๋ ๋ค. ํฉ์์ธ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ ์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ, ์ฆ JSX๋ฅผ ๋ฐํํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์๊ฐ ๋ฉ๋๋ค.
ref
โ
๋ถ๋ชจ ์ปดํฌ๋ํธ๋ ์ด ์์ฑ์ ์ฌ์ฉํด ๊ธฐ๋ณธ DOM ๋
ธ๋์ ๋ํ ์ฐธ์กฐ๋ฅผ ์์ฒญํ ์ ์์ต๋๋ค. ๋ณดํต DOM์ ์ง์ ์กฐ์ํด์ผํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค. ์์์์ ref
๋ null
๋ก ์ค์ ๋์์ต๋๋ค.
props
โ
์ด ์์ฑ์ ์ปดํฌ๋ํธ์ ์ ๋ฌ๋ ๋ชจ๋ ์์ฑ๊ณผ ํ๋กญ์ ํฌํจํ๋ ๊ฐ์ฒด์ ๋๋ค.
_owner
โ
ํ๋ก๋์ ๋น๋๊ฐ ์๋ ๋๋ง ์ ๊ทผํ ์ ์๋ ์์ฑ์ผ๋ก, ์ด ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ ์ปดํฌ๋ํธ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ๋ฆฌ์กํธ์์ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ด ์ ๋ณด๋ ํ๋กญ์ด๋ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์๋ฆฌ๋จผํธ์ ์ ๋ฐ์ดํธ๋ฅผ ๋ด๋นํ ์ปดํฌ๋ํธ๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
function Parent() {
return <Child />;
}
function Child() {
const element = <div>Hello, world!</div>;
console.log(element._owner); // parent
return element;
}
_store
โ
๋ฆฌ์กํธ ์๋ฆฌ๋จผํธ ๊ฐ์ฒด์ _store
์์ฑ์ ์๋ฆฌ๋จผํธ์ ๋ํ ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ฆฌ์กํธ๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฐ์ฒด์
๋๋ค. _store
์ ์ ์ฅ๋ ํน์ ์์ฑ ๋ฐ ๊ฐ์ ๊ณต๊ฐ API์ ์ผ๋ถ๊ฐ ์๋๋ฏ๋ก ์ง์ ์ ๊ทผํด์๋ ์ ๋ฉ๋๋ค.
๊ฐ์ DOM๊ณผ ์ค์ DOM ๋น๊ตโ
๋ฆฌ์กํธ์์ ์ ๊ณตํ๋ React.createElement
๋ ๋ฉ๋ชจ๋ฆฌ์ ์๋ก์ด ๊ฐ์ ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ๋ ํจ์์ด๊ณ , DOM API์์ ์ ๊ณตํ๋ document.createElement
๋ document.appendChild
๋ฑ์ API๋ก DOM์ ์ถ๊ฐ๋๊ธฐ ์ , ๋ฉ๋ชจ๋ฆฌ์ ์๋ก์ด ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ๋ ๋ฉ์๋์
๋๋ค.
๋ฆฌ์กํธ์ ๊ฐ์ DOM์ ํธ๋ฆฌ ๊ฐ์ ์๋ฆฌ๋จผํธ๋ฅผ ํํํ๋ค๋ ์ ์์ ์ค์ DOM๊ณผ ๊ฐ๋ ์ด ์ ์ฌํฉ๋๋ค. ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๊ฐ ๋ ํฐ๋ง๋๋ฉด ๋ฆฌ์กํธ๋ ์ ๊ฐ์ DOM ํธ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์ด์ ๊ฐ์ DOM ํธ๋ฆฌ์ ๋น๊ตํ ๋ค์, ์ด์ ํธ๋ฆฌ๋ฅผ ์ ํธ๋ฆฌ์ ์ผ์นํ๋๋ก ์ ๋ฐ์ดํธํ๋ ๋ฐ ํ์ํ ์ต์ ๋ณ๊ฒฝ ํ์๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ด๋ฅผ ์ฌ์กฐ์ ํ๋ก์ธ์ค๋ผ๊ณ ํฉ๋๋ค. ๋ค์ ์์๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์์ ์ฌ์กฐ์ ํ๋ก์ธ์ค๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ณด์ฌ ์ค๋๋ค.
function App() {
const [count, setCount] = useState(0);
return (
<div>
<h1>์นด์ดํธ: {count}</h1>
<button onClick={() => setCount(count + 1)}>์ฆ๊ฐ</button>
</div>
);
}
์ด ์ปดํฌ๋ํธ๋ฅผ ๋ค์๊ณผ ๊น์ด ํํํ ์๋ ์์ต๋๋ค.
function App() {
const [count, setCount] = React.useState(0);
return React.createElement(
"div",
null,
React.createElement("h1", null, "์นด์ดํธ: ", count),
React.createElement(
"button",
{ onClick: () => setCount(count + 1) },
"์ฆ๊ฐ"
)
);
}
์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ ๋๋ง๋ ๋ ๋ฆฌ์กํธ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ DOM ํธ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
div
- h1
- "์นด์ดํธ: 0"
- button
- "์ฆ๊ฐ"
๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ฆฌ์กํธ๋ ๋ค์๊ณผ ๊ฐ์ด ์๋ก์ด ๊ฐ์ DOM ํธ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
div
- h1
- "์นด์ดํธ: 1"
- button
- "์ฆ๊ฐ"
๊ทธ๋ฌ๋ฉด ๋ฆฌ์กํธ๋ h1
์๋ฆฌ๋จผํธ์ ํ
์คํธ ๋ด์ฉ๋ง ์
๋ฐ์ดํธํ๋ฉด ๋๋ค๊ณ ๊ณ์ฐํ๊ณ ์ค์ DOM์ ํด๋น ๋ถ๋ถ๋ง ์
๋ฐ์ดํธํฉ๋๋ค.
ํจ์จ์ ์ธ ์ ๋ฐ์ดํธโ
๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ์ํ๋ ํ๋กญ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ฆฌ์กํธ๋ ์ ๋ฐ์ดํธ๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ํํํ๋ ์๋ก์ด ๋ฆฌ์กํธ ์๋ฆฌ๋จผํธ ํธ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋น๊ต ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด ์ ํธ๋ฆฌ๋ฅผ ์ด์ ํธ๋ฆฌ์ ๋น๊ตํด ์ค์ DOM์ ์ ๋ฐ์ดํธ์ ํ์ํ ์ต์ํ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฒฐ์ ํฉ๋๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ ๋ฆฌ์กํธ ์๋ฆฌ๋จผ์คํ ์ ํธ๋ฆฌ๋ฅผ ์ด์ ํธ๋ฆฌ์ ๋น๊ตํ๊ณ ๋์ ์ฐจ์ด์ ์ ์๋ณํฉ๋๋ค. ์ด๋ ๋น๊ต๋ ์ฌ๊ท์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค. ๋ ธ๋๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ๋ฆฌ์กํธ๋ ์ค์ DOM์์ ํด๋น ๋ ธ๋๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ๋ ธ๋๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋ ๊ฒฝ์ฐ ๋ฆฌ์กํธ๋ ์ค์ DOM์์ ํด๋น ๋ ธ๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํฉ๋๋ค.
์ด๋ ๊ฒ ์ ํธ๋ฆฌ์ ์ด์ ํธ๋ฆฌ๋ฅผ ๋ ธ๋๋ฒผ๋ก ๋น๊ตํด ํธ๋ฆฌ์ ์ด๋ ๋ถ๋ถ์ด ๋ณ๊ฒฝ๋์๋์ง ์์๋ด๋ ์์ ์ ๋ํ(diffing)์ด๋ผ๊ณ ํ๊ณ , ์ด๋ ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ํฉ๋๋ค.
๋ฆฌ์กํธ์ ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ๊ณ ๋๋ก ์ต์ ํ๋์์ผ๋ฉฐ ์ค์ DOM์ ์ ์ฉํด์ผ ํ๋ ๋ณ๊ฒฝ ํ์์ ์ต์ํ๋ฅผ ๋ชฉํ๋ก ํฉ๋๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค.
- ๋ ํธ๋ฆฌ์ ๋ฃจํธ์ ์๋ ๋ ธ๋๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ, ๋ฆฌ์กํธ๋ ๊ธฐ์กด ํธ๋ฆฌ ์ ์ฒด๋ฅผ ์ ํธ๋ฆฌ๋ก ๋์ฒดํฉ๋๋ค.
- ๋ฃจํธ ๋ ธ๋๊ฐ ๋์ผํ๋ค๋ฉด ๋ฆฌ์กํธ๋ ๋ ธ๋์ ์์ฑ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ์ ๋ฐ์ดํธํฉ๋๋ค.
- ์์ ๋ ธ๋๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ ๋ฆฌ์กํธ๋ ๋ณ๊ฒฝ๋ ์์ ๋ ธ๋๋ง ์ ๋ฐ์ดํธํฉ๋๋ค.
- ๋ ธ๋์ ์์๋ค์ด ๋์ผํ์ง๋ง ์์๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ, ๋ฆฌ์กํธ๋ ๋ ธ๋๋ฅผ ๋ค์ ์์ฑํ์ง ์๊ณ ์ค์ DOM์์ ๋ ธ๋์ ์์๋ฅผ ๋ค์ ์ค์ ํฉ๋๋ค.
- ํธ๋ฆฌ์์ ๋ ธ๋๊ฐ ์ ๊ฑฐ๋๋ฉด ๋ฆฌ์กํธ๋ ์ค์ DOM์์ ๋ ธ๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
- ํธ๋ฆฌ์ ์ ๋ ธ๋๊ฐ ์ถ๊ฐ๋๋ฉด ๋ฆฌ์กํธ๋ ํด๋น ๋ ธ๋๋ฅผ ์ค์ DOM์ ์ถ๊ฐํฉ๋๋ค.
- ๋ ธ๋์ด ์ข ๋ฅ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ, ๋ฆฌ์กํธ๋ ์ด์ ๋ ธ๋๋ฅผ ์ ๊ฑฐํ๊ณ ๋ณ๊ฒฝ๋ ์ข ๋ฅ์ ์ ๋ ธ๋๋ฅผ ์์ฑํฉ๋๋ค.
- ๋
ธ๋์
key
ํ๋กญ์ด ์๋ค๋ฉด ๋ฆฌ์กํธ๋ ์ด๋ฅผ ์ฌ์ฉํด ๋ ธ๋์ ๊ต์ฒด๊ฐ ํ์ํ์ง ํ์ ํฉ๋๋ค. ์ปดํฌ๋ํธ ์ํ๋ฅผ ์ฌ ์ค์ ํ ๋ ์ ์ฉํฉ๋๋ค.
๋ถํ์ํ ๋ฆฌ๋ ๋๋งโ
๋ฆฌ์กํธ์ ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ํ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ต์ํํด ์ค์ DOM์ ํจ์จ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ํ์ง๋ง ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฌธ์ ๋ ์์ง ๋จ์ ์์ต๋๋ค.
๋ฆฌ๋ ๋๋ง์ ์ ์ด์ ๋ฆฌ์กํธ๊ฐ ์ค๊ณ๋ ๋๋ก ์๋ํ๋ ๋ฐฉ์์ ๋๋ค. ๋ฆฌ์กํธ๋ ํ๋กญ์ด ๋ณ๊ฒฝ๋์ง ์๋ ์ปดํฌ๋ํธ๋ ๋ฌด์ํ์ง ์๊ณ ์ํ๋ ํ๋กญ์ด ๋ณ๊ฒฝ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋ชจ๋ ์์ ์ปดํฌ๋ํธ๋ฅผ ํธ์ถํฉ๋๋ค. ๋ฆฌ์กํธ๋ ์ปดํฌ๋ํธ๊ฐ ์ด๋ ์ํ์ ์ข ์๋๋์ง ์์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ UI์ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋งํฉ๋๋ค.
๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ฉด ๋ง์ ์ปดํฌ๋ํธ๊ฐ ๋ถํ์ํ๊ฒ ๋ฆฌ๋ ๋๋ง๋์ด ์ ์ฌ๋์๋ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ถ๊ฑฐ์ง ์ ์์ผ๋ฏ๋ก ์ต์ ํ๋ฅผ ์์ฃผ ์คํํด์ผ ํฉ๋๋ค.