1. React Elements์ ํน์ง์ ๋ํ์ฌ
React์ ๋๋๋ง ๊ณผ์ ๊ณผ ์๋ฆฌ์ ๋ํด์ ๋ค๋ฃจ๊ธฐ ์ํด์๋ ๋จผ์ React Elements์ ํน์ง์ ๋ํ์ฌ ์์์ผ ํ๋ค. ์ด์ ํฌ์คํ ์์ ๋ค๋ฃฌ ๋ฐ์ ๊ฐ์ด, React Elements๋ ๋ถ๋ณ์ฑ์ ๊ฐ์ง๋ค. Elements์ ๋ถ๋ณ์ฑ์ด๋,
Elements ์์ฑ ํ์๋ Elements ์ children์ด๋ attributes๋ฅผ ๋ฐ๊ฟ ์ ์๋ค!
์ด๋ค. ๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ง๋ฌธ์ด ๋์ฌ ์๊ฐ ์๋ค.
์ด? ๊ทธ๋ ๋ค๋ฉด, ์ฌ์ฉ์์ ์ ๋ ฅ์ ๋ฐ๋ผ ํ๋ฉด์ ๊ฐฑ์ ํด์ผํ ๊ฒฝ์ฐ๋ ์ด๋ป๊ฒ ํด์ผํ๋์? ํ๋ฉด ์ Dom Elements์ ์๋ณธ์ธ React Elements๊ฐ ๋ถ๋ณ์ฑ์ด๋ฉด, ๊ฐฑ์ ์ ๊ตฌํํ ์ ์์ง ์๋์?
์ข์ ์ง๋ฌธ์ด๋ค!
๋ถ๋ช
React Elements๋ ๋ถ๋ณํ์ง๋ง, ์์ ์กฐ๊ฑด์ด ๋ถ์๋ค. ๋ฐ๋ก 'Elements๊ฐ ์์ฑ๋ ํ' ๋ผ๋ ์กฐ๊ฑด์ด๋ค. React Elements๋ก ๋ง๋ค๋ ค๋ฉด, ๋จผ์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ผ ํจ์ ์ ์ ์์๋ค. ๋ค์ ์์๋ฅผ ๋ณด์
์ปดํฌ๋ํธ๋ ๋ถ์ด๋นต ํ์ด๋ค. ๋ถ์ด๋นต ํ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋๋ก ๊ณ ์น ์ ์๋ค. (์ฒ ์ด๋ผ ํ์ ๋ค๊ฒ ์ง๋ง...) ํ์ง๋ง ๋ถ์ด๋นต ํ๋ก ๋ง๋ ๋ถ์ด๋นต์ ๊ณ ์น ์ ์๋ค! ์ด๋ฏธ ์์ฑ๋ ํํ์ด๊ณ , ๋ฏ์ด ๊ณ ์น ๋ ค ๋ค๋ฉด ๋ถ์์ง์ง ๊ณ ์น๋ค๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค. ์ด๋ ๋ถ์ด๋นต์ Element๋ก ์๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
2. React์ ๋๋๋ง ์๋ฆฌ
๊ทธ๋์ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ๋ผ ๊ฐฑ์ ๋๋ ํ๋ฉด์ ์ด๋ป๊ฒ ๊ตฌํํ๋์!!
์ด์ ๊ทธ ๋ต์ ๋ํด์ ๋งํด๋ณด๋ฉด, ๋ถ์ด๋นต ์์ ์ฒ๋ผ ์ฐ๋ฆฌ๋ ๋ถ์ด๋นต์ ๋ฏ์ด ๊ณ ์น๋ ค ๋ค์ง ๋ง๊ณ '๊ต์ฒด'ํด์ผ ํ๋ค. ๋ฐ๋ผ์ ์ค์ ๋ก ์ฐ๋ฆฌ๋ ์ฌ์ฉ์์ ์ ๋ ฅ์ ๋ฐ๋ผ ์ปดํฌ๋ํธ๋ฅผ ๊ณ ์น๊ณ , (์ ๋ ฅ ๊ฐ์ ๋ฐ๋ฅธ ์๋ก ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ , ์ฐ๋ ์ปดํฌ๋ํธ ์์ฒด๋ฅผ ๋ฐ๊พธ๋ ) ๊ทธ ์ปดํฌ๋ํธ๋ก ์๋ก์ด ์๋ฆฌ๋จผ์ธ ๋ฅผ ๋ง๋ค์ด, Rendering ๋ ํ๋ฉด์ ๊ฐ์ ๋ผ์ด๋ค. React์ ๊ฒฝ์ฐ ์ด๋ฌํ 'Re-Rendering' ๊ณผ์ ์ด ๋งค์ฐ ๋น ๋ฅด๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์์๊ฒ๋ ์ด ๊ฐ์๋ผ์ฐ๋ ํ๋ฉด์ด ์ ๋ ฅ ๊ฐ์ ๋ฐ๋ผ ํ๋ฉด์ด ๊ฐฑ์ ๋๋ ๊ฒ ์ฒ๋ผ ๋ณด์ธ๋ค.
3. React์ ๋๋๋ง ๊ณผ์
์ด์ ๊ณผ์ ์ ๋ํด ์ดํด๋ณด์. React๊ฐ Rendering ๊ณผ์ ์ด ๋น ๋ฅธ ์ด์ ๋ Virtual DOM์ธ React Elements๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ณ์ฐ๊ณผ ๊ฐ์ข ๊ตฌํ์ ์ปดํฌ๋ํธ ํ์ฑ๊ณผ JS ๊ฐ์ฒด์ธ React Elements ํ์ฑ ๋จ๊ณ์์ ๋ค ํด๋๋๋ค. Browser DOM ๋ถ๋ถ์์๋ ๋ฐ๋ ๋ถ๋ถ๋ง ๋ค์ ๋๋๋งํ๋ฉด ๋๋ค. ์ฒ์๋ถํฐ HTML ์ฝ๋๋ฅผ ๊ณ ์ณ์ ๋๋๋งํ๋ ๊ณผ์ ์ ์ฉ๋๋ ๋ฌด๊ฒ๊ณ ๋๋ฆฐ ๋ฐ๋ฉด์ ์์ ๊ณผ์ ์ ๊ฑฐ์น๋ฉด ํจ์ฌ ๋น ๋ฅด๋ค. (์ด ์ด์์ ์ ํํ ์๋ฆฌ๋ ๋ชจ๋ฅธ๋ค.)
๋ฐ๋ผ์ Browser DOM์ ์ด๋ฏธ ์์ฑ๋ Virtual DOM์ ๋๋๋ง๋ง ํด์ ๋ฐ๋ ๋ถ๋ถ๋ง ๊ต์ฒดํ๋ฉด ๋๋ค. ๊ฐ ๋ณํ ์ธ์ง -> ๊ฐ ๋ณํ ๋ฐ๋ฅธ ์ฌ ์ฐ์ฐ ๊ณผ์ ์ VirtualDOM ๋จ๊ณ(์ปดํฌ๋ํธ ํ์ฑ, React Elements๋ก ๋ณํ)์์ ์ ๋ถ ํ๋ ๊ฒ์ด๋ค.
โ ํด๋น ๊ณผ์ ๋ ์์ธํ ๋ฏ์ด๋ณด๊ธฐ
spa(single page aplication)๋ฅผ ์งํค๋ React ํ๋ก์ ํธ์์๋ ํ๋์ root DOM elements๊ฐ ์กด์ฌํ๋ค.
<div id="root"></div>
ํด๋น ๋ถ๋ถ ์์ ์์ ํ๊ทธ๋ก React ํ๋ก์ ํธ์ ๋ชจ๋ ํ๋ฉด์ด ๊ตฌํ๋๋ค. ๋ฐ๋ผ์ ๊ทธ๋ํ๋ก ๋ํ๋ด๋ฉด,
ํด๋น ๋ถ๋ถ์ด ๋๋ค. ์ด์ ์์ฑ๋ React Elements๋ฅผ DOM elements๋ก ์ด๋ป๊ฒ ๋ฐ๊พธ๋์ง ์์๋ณด์. ์ ๋ฒ ํฌ์คํธ๋ฅผ ์ ๋ณด๊ณ ์ค์ ๋ถ๋ค์ ์ํด ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ์๋ฉด, React Elements๋ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ปดํฌ๋ํธ๋ฅผ React.createElements()๋ฅผ ํตํด ๋ฐ๊พผ, 'ํ๋ฉด์ ๊ทธ๋ฆด ๋ด์ฉ์ ๋ํด ๊ธฐ์ ํ JS ๊ฐ์ฒด'๋ฅผ ๋ปํ๋ค. ์ผ๋ฐ JS ํ์ผ์์๋ ์ง์ React.createElements() ํจ์๋ฅผ ์จ์ ์ผ์ผํ ์ปดํฌ๋ํธ๋ฅผ ๋ณํํด์ค์ผ ํ์ง๋ง, JSX ํ์ผ์ ์ฌ์ฉํ๋ค๋ฉด, ํด๋น ๊ณผ์ ์ ๋ค์์ React๊ฐ ๋ค ํด์คฌ๋ค. ์ด์ ์ด JS ๊ฐ์ฒด๋ฅผ ์ง์ง ํ๋ฉด์ ๋ด์ฉ์ ๊ทธ๋ฆฌ๋ DOM Elements๋ก ๋ฐ๊พธ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ค.
const elements = <h1>์๋
, ๋ฆฌ์กํธ! </h1>;
ReactDOM.render(element, document.getElementById('root'));
์ผ๋จ ๋ด๊ฐ ๋๋๋งํ ์์๊ฐ ๋ฑ ํ๋์ด๊ณ , ๊ทธ๊ฒ elements๋ผ๋ ๋ณ์๋ผ๊ณ ํ ๋, ๋ฐ์ ํจ์๋ ๊ทธ๊ฒ์ DOM ์์๋ก ๋ฐ๊พธ๋ ํจ์์ด๋ค. ์ฒซ๋ฒ์งธ ์ธ์๊ฐ DOM ์์๋ก ๋ฐ๊ฟ React Elements๋ฅผ ํน์ ํ๋ ๊ฒ์ด๊ณ , ๋ ๋ฒ์งธ ์ธ์๊ฐ ๊ทธ DOM ์์๊ฐ ๊ธฐ์ ๋ ๋ถ๋ชจ Elements๋ฅผ ํน์ ํ๋ ๊ฒ์ด๋ค.
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<Library />
</React.StrictMode>
);
์ด์ ๊ฐ์ด ์์ฑ๋ ๊ฐ๋ฅํ๋ค.
โ ๋ณต์กํ ์์
tick ํจ์๋ ํ์ฌ ์๊ฐ์ ๋ด์ ์ปดํฌ๋ํธ๋ฅผ ์ข ๊ตญ์ DOM ์๋ฆฌ๋จผ์ธ ๋ก ๋ฐ๊พธ์ด ํ๋ฉด์ ๋์ฐ๋ ํจ์์ด๋ค. setInterval ํจ์๋ ์์ ๊ณผ์ ์ 1์ด๋ง๋ค ๋ฐ๋ณตํ๋ ํจ์์ด๋ค. ํด๋น ์ฝ๋๋ฅผ ์คํํ๋ฉด, 1์ด๋ง๋ค Re-rendering ๋์ด์ ํ๋ฉด์ด ๊ฐ์๋ผ์์ง ๊ฒ์ด๋ค.
F12๋ก ์ฐ๋ฆฌ๊ฐ ๋ง๋ HTML์ ์ด์ด๋ณด๋ฉด, ํด๋น ์๊ฐ ๋ถ๋ถ์ด ๊น๋นก๊ฑฐ๋ฆฌ๋ ๊ฒ์ ์ ์ ์๋ค. ํด๋น ๋ถ๋ถ์ ํ๋ฉด์ด ๊ฐ์๋ผ์์ง ๋๋ง๋ค, ๋ณ๊ฒฝ๋ ๋ถ๋ถ์ ์ธ์งํ์ฌ ๋ณด์ฌ์ฃผ๋ ๋ชจ์ต์ด๋ค.