createRoot
createRoot
๋ก ๋ธ๋ผ์ฐ์ DOM ๋
ธ๋ ์์ React ์ปดํฌ๋ํธ๋ฅผ ํ์ํ๋ ๋ฃจํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
const root = createRoot(domNode, options?)
- ๋ ํผ๋ฐ์ค
- ์ฌ์ฉ๋ฒ
- ๋ฌธ์ ํด๊ฒฐ
- ๋ฃจํธ๋ฅผ ์์ฑํ๋๋ฐ ์๋ฌด๊ฒ๋ ํ์๋์ง ์์ต๋๋ค
- โ๋์ ์ปจํ ์ด๋๊ฐ DOM ์๋ฆฌ๋จผํธ๊ฐ ์๋๋๋คโ ๋ผ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
- โํจ์๊ฐ React ์์์ผ๋ก ์ ํจํ์ง ์์ต๋๋คโ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ์๋ฒ์์ ๋ ๋๋ง๋ HTML์ด ์ฒ์๋ถํฐ ๋ค์ ์์ฑ๋ฉ๋๋ค
๋ ํผ๋ฐ์ค
createRoot(domNode, options?)
createRoot
๋ฅผ ํธ์ถํ๋ฉด ๋ธ๋ผ์ฐ์ DOM ์๋ฆฌ๋จผํธ ์์ ์ฝํ
์ธ ๋ฅผ ํ์ํ ์ ์๋ React ๋ฃจํธ๋ฅผ ์์ฑํฉ๋๋ค.
import { createRoot } from 'react-dom/client';
const domNode = document.getElementById('root');
const root = createRoot(domNode);
React๋ domNode
์ ๋ํ ๋ฃจํธ๋ฅผ ์์ฑํ๊ณ ๊ทธ ์์ ์๋ DOM์ ๊ด๋ฆฌํฉ๋๋ค. ๋ฃจํธ๋ฅผ ์์ฑํ ํ์๋ root.render
๋ฅผ ํธ์ถํด ๊ทธ ์์ React ์ปดํฌ๋ํธ๋ฅผ ํ์ํด์ผ ํฉ๋๋ค.
root.render(<App />);
์จ์ ํ React๋ง์ผ๋ก ์์ฑ๋ ์ฑ์์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฃจํธ ์ปดํฌ๋ํธ์ ๋ํ createRoot
ํธ์ถ์ด ํ๋๋ง ์์ต๋๋ค. ํ์ด์ง์ ์ผ๋ถ์ React๋ฅผ โ๋ฟ๋ ค์โ ์ฌ์ฉํ๋ ํ์ด์ง์ ๊ฒฝ์ฐ์๋ ๋ฃจํธ๋ฅผ ํ์๋ก ํ๋ ๋งํผ ์์ฑํ ์ ์์ต๋๋ค.
์๋์์ ๋ ๋ง์ ์์๋ฅผ ํ์ธํ์ธ์.
๋งค๊ฐ๋ณ์
-
domNode
: DOM ์๋ฆฌ๋จผํธ. React๋ DOM ์๋ฆฌ๋จผํธ์ ๋ํ ๋ฃจํธ๋ฅผ ์์ฑํ๊ณ ๋ ๋๋ง๋ React ์ฝํ ์ธ ๋ฅผ ํ์ํ๋render
์ ๊ฐ์ ํจ์๋ฅผ ๋ฃจํธ์์ ํธ์ถํ ์ ์๋๋ก ํฉ๋๋ค. -
optional
options
: React ๋ฃจํธ์ ๋ํ ์ต์ ์ ๊ฐ์ง ๊ฐ์ฒด์ ๋๋ค.- optional
onRecoverableError
: React๊ฐ ์ค๋ฅ๋ก๋ถํฐ ์๋์ผ๋ก ๋ณต๊ตฌ๋ ๋ ํธ์ถ๋๋ ์ฝ๋ฐฑ. - optional
identifierPrefix
: React๊ฐuseId
์ ์ํด ์์ฑ๋ ID์ ์ฌ์ฉํ๋ ๋ฌธ์์ด ์ ๋์ฌ. ๊ฐ์ ํ์ด์ง์์ ์ฌ๋ฌ๊ฐ์ ๋ฃจํธ๋ฅผ ์ฌ์ฉํ ๋ ์ถฉ๋์ ํผํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
- optional
๋ฐํ๊ฐ
createRoot
๋ render
์ unmount
๋ ๊ฐ์ง ๋ฉ์๋๊ฐ ์๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
์ฃผ์์ฌํญ
- ์ฑ์ด ์๋ฒ์์ ๋ ๋๋ง ๋๋ ๊ฒฝ์ฐ
createRoot()
๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋์hydrateRoot()
๋ฅผ ์ฌ์ฉํ์ธ์. - ์ฑ์
createRoot
ํธ์ถ์ด ๋จ ํ๋๋ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ๋ ์์ํฌ๊ฐ ์ด ํธ์ถ์ ๋์ ์ํํ ์๋ ์์ต๋๋ค. - ์ปดํฌ๋ํธ์ ์์์ด ์๋ DOM ํธ๋ฆฌ์ ๋ค๋ฅธ ๋ถ๋ถ(์: ๋ชจ๋ฌ ๋๋ ํดํ)์ JSX ์กฐ๊ฐ์ ๋ ๋๋งํ๋ ค๋ ๊ฒฝ์ฐ,
createRoot
๋์createPortal
์ ์ฌ์ฉํ์ธ์.
root.render(reactNode)
root.render
๋ฅผ ํธ์ถํ์ฌ JSX์กฐ๊ฐ(โReact ๋
ธ๋โ)์ React ๋ฃจํธ์ ๋ธ๋ผ์ฐ์ DOM ๋
ธ๋์ ํ์ํฉ๋๋ค.
root.render(<App />);
React๋ root
์ <App />
์ ํ์ํ๊ณ ๊ทธ ์์ ์๋ DOM์ ๊ด๋ฆฌํฉ๋๋ค.
์๋์์ ๋ ๋ง์ ์์๋ฅผ ํ์ธํ์ธ์.
๋งค๊ฐ๋ณ์
reactNode
: ํ์ํ๋ ค๋ React ๋ ธ๋. ์ผ๋ฐ์ ์ผ๋ก<App />
๊ณผ ๊ฐ์ JSX ์กฐ๊ฐ์ด ๋์ง๋ง,createElement()
๋ก ์์ฑํ React ์๋ฆฌ๋จผํธ, ๋ฌธ์์ด, ์ซ์,null
,undefined
๋ฑ์ ์ ๋ฌํ ์๋ ์์ต๋๋ค.
๋ฐํ๊ฐ
root.render
๋ undefined
๋ฅผ ๋ฐํํฉ๋๋ค.
์ฃผ์์ฌํญ
-
root.render
๋ฅผ ์ฒ์ ํธ์ถํ๋ฉด React๋ React ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๊ธฐ ์ ์ React ๋ฃจํธ ๋ด๋ถ์ ๋ชจ๋ ๊ธฐ์กด HTML ์ฝํ ์ธ ๋ฅผ ์ง์๋๋ค. -
์๋ฒ์์ ๋๋ ๋น๋ ์ค์ React์ ์ํด ์์ฑ๋ HTML์ด ๋ฃจํธ์ DOM ๋ ธ๋์ ํฌํจ๋ ๊ฒฝ์ฐ, ๋์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๊ธฐ์กด HTML์ ์ฒจ๋ถํ๋
hydrateRoot()
๋ฅผ ์ฌ์ฉํ์ธ์. -
๋์ผํ ๋ฃจํธ์์
render
๋ฅผ ๋ ๋ฒ ์ด์ ํธ์ถํ๋ฉด, React๋ ํ์์ ๋ฐ๋ผ DOM์ ์ ๋ฐ์ดํธํ์ฌ ์ฌ์ฉ์๊ฐ ์ ๋ฌํ ์ต์ JSX๋ฅผ ๋ฐ์ํฉ๋๋ค. React๋ ์ด์ ์ ๋ ๋๋ง ๋ ํธ๋ฆฌ์ โ๋น๊ตโํด์ ์ฌ์ฌ์ฉํ ์ ์๋ ๋ถ๋ถ๊ณผ ๋ค์ ๋ง๋ค์ด์ผ ํ๋ ๋ถ๋ถ์ ๊ฒฐ์ ํฉ๋๋ค. ๋์ผํ ๋ฃจํธ์์render
๋ฅผ ๋ค์ ํธ์ถํ๋ ๊ฒ์ ๋ฃจํธ ์ปดํฌ๋ํธ์์set
ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค. React๋ ๋ถํ์ํ DOM ์ ๋ฐ์ดํธ๋ฅผ ํผํฉ๋๋ค.
root.unmount()
root.unmount
๋ฅผ ํธ์ถํ๋ฉด React ๋ฃจํธ ๋ด๋ถ์์ ๋ ๋๋ง ๋ ํธ๋ฆฌ๋ฅผ ์ญ์ ํฉ๋๋ค.
root.unmount();
์จ์ ํ React๋ง์ผ๋ก ์์ฑ๋ ์ฑ์๋ ์ผ๋ฐ์ ์ผ๋ก root.unmount
์ ๋ํ ํธ์ถ์ด ์์ต๋๋ค.
์ด ํจ์๋ ์ฃผ๋ก React ๋ฃจํธ์ DOM ๋
ธ๋(๋๋ ๊ทธ ์กฐ์ ๋
ธ๋)๊ฐ ๋ค๋ฅธ ์ฝ๋์ ์ํด DOM์์ ์ ๊ฑฐ๋ ์ ์๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด DOM์์ ๋นํ์ฑ ํญ์ ์ ๊ฑฐํ๋ jQuery ํญ ํจ๋์ ์์ํด ๋ณด์ธ์. ํญ์ด ์ ๊ฑฐ๋๋ฉด ๊ทธ ์์ ์๋ ๋ชจ๋ ๊ฒ(๋ด๋ถ์ React ๋ฃจํธ๋ฅผ ํฌํจ)์ด DOM์์ ์ ๊ฑฐ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ root.unmount
๋ฅผ ํธ์ถํ์ฌ ์ ๊ฑฐ๋ ๋ฃจํธ์ ์ฝํ
์ธ ๊ด๋ฆฌ๋ฅผ โ์ค์งโํ๋๋ก React์ ์ง์ํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ๊ฑฐ๋ ๋ฃจํธ ๋ด๋ถ์ ์ปดํฌ๋ํธ๋ ๊ตฌ๋
๊ณผ ๊ฐ์ ์ ์ญ ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๊ณ ํ๋ณดํ๋ ๋ฒ์ ๋ชจ๋ฅด๋ ์ฑ๋ก ์๊ฒ ๋ฉ๋๋ค.
root.unmount
๋ฅผ ํธ์ถํ๋ฉด ๋ฃจํธ์ ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ unmount ๋๊ณ , ํธ๋ฆฌ์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ state๊ฐ ์ ๊ฑฐ๋๋ฉฐ, ๋ฃจํธ DOM ๋
ธ๋์์ React๊ฐ โ๋ถ๋ฆฌโ๋ฉ๋๋ค.
๋งค๊ฐ๋ณ์
root.unmount
๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ง ์์ต๋๋ค.
๋ฐํ๊ฐ
root.unmount
returns undefined
.
์ฃผ์์ฌํญ
-
root.unmount
๋ฅผ ํธ์ถํ๋ฉด ํธ๋ฆฌ์ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ unmount ๋๊ณ ๋ฃจํธ DOM ๋ ธ๋์์ React๊ฐ โ๋ถ๋ฆฌโ๋ฉ๋๋ค. -
root.unmount
๋ฅผ ํ ๋ฒ ํธ์ถํ ํ์๋ ๊ฐ์ ๋ฃจํธ์์root.render
๋ฅผ ๋ค์ ํธ์ถํ ์ ์์ต๋๋ค. unmount ๋ ๋ฃจํธ์์root.render
๋ฅผ ํธ์ถํ๋ ค๊ณ ํ๋ฉด โunmount ๋ root๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.โ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํด๋น ๋ ธ๋์ ์ด์ ๋ฃจํธ๊ฐ unmount ๋ ํ ๋์ผํ DOM ๋ ธ๋์ ์๋ก์ด ๋ฃจํธ๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค.
์ฌ์ฉ๋ฒ
์จ์ ํ React๋ง์ผ๋ก ์์ฑ๋ ์ฑ ๋ ๋๋งํ๊ธฐ
์ฑ์ด ์จ์ ํ React๋ง์ผ๋ก ์์ฑ๋ ๊ฒฝ์ฐ, ์ ์ฒด ์ฑ์ ๋ํด ๋จ์ผ ๋ฃจํธ๋ฅผ ์์ฑํ์ธ์.
import { createRoot } from 'react-dom/client';
const root = createRoot(document.getElementById('root'));
root.render(<App />);
์ผ๋ฐ์ ์ผ๋ก ์ด ์ฝ๋๋ ์์ํ ๋ ํ ๋ฒ๋ง ์คํํ๋ฉด ๋ฉ๋๋ค.
- HTML์ ์ ์๋ ๋ธ๋ผ์ฐ์ DOM ๋ ธ๋๋ฅผ ์ฐพ์ผ์ธ์.
- ์ฑ ๋ด๋ถ์ React ์ปดํฌ๋ํธ๋ฅผ ํ์ํ์ธ์.
import { createRoot } from 'react-dom/client'; import App from './App.js'; import './styles.css'; const root = createRoot(document.getElementById('root')); root.render(<App />);
์ฑ์ด ์จ์ ํ React๋ง์ผ๋ก ์์ฑ๋ ๊ฒฝ์ฐ, ์ถ๊ฐ์ ์ผ๋ก ๋ฃจํธ๋ฅผ ๋ ๋ง๋ค๊ฑฐ๋ root.render
๋ฅผ ๋ค์ ํธ์ถํ ํ์๊ฐ ์์ต๋๋ค.
์ด ์์ ๋ถํฐ React๋ ์ ์ฒด ์ฑ์ DOM์ ๊ด๋ฆฌํฉ๋๋ค. ์ปดํฌ๋ํธ๋ฅผ ๋ ์ถ๊ฐํ๋ ค๋ฉด App
์ปดํฌ๋ํธ ์์ ์ค์ฒฉ์ํค์ธ์. UI ์
๋ฐ์ดํธ๋ ๊ฐ ์ปดํฌ๋ํธ์ state๋ฅผ ํตํด ์ํํ ์ ์์ต๋๋ค. ๋ชจ๋ฌ์ด๋ ํดํ๊ณผ ๊ฐ์ ์ถ๊ฐ ์ฝํ
์ธ ๋ฅผ DOM ๋
ธ๋ ์ธ๋ถ์ ํ์ํด์ผ ํ๋ ๊ฒฝ์ฐ portal๋ก ๋ ๋๋งํ์ธ์.
React๋ก ๋ถ๋ถ์ ์ผ๋ก ์์ฑ๋ ํ์ด์ง ๋ ๋๋งํ๊ธฐ
ํ์ด์ง๊ฐ React๋ง์ผ๋ก ์์ฑ๋์ง ์์ ๊ฒฝ์ฐ, React๊ฐ ๊ด๋ฆฌํ๋ ๊ฐ ์ต์์ UI์ ๋ํ ๋ฃจํธ๋ฅผ ์์ฑํ๊ธฐ ์ํด createRoot
๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ์ถํ ์ ์์ต๋๋ค. ๋ฃจํธ๋ง๋ค root.render
๋ฅผ ํธ์ถํจ์ผ๋ก์จ ๊ฐ๊ฐ ๋ค๋ฅธ ์ฝํ
์ธ ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
๋ค์ ์์์์๋ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ React ์ปดํฌ๋ํธ๊ฐ index.html
ํ์ผ์ ์ ์๋ ๋ ๊ฐ์ DOM ๋
ธ๋์ ๋ ๋๋งํฉ๋๋ค.
import './styles.css'; import { createRoot } from 'react-dom/client'; import { Comments, Navigation } from './Components.js'; const navDomNode = document.getElementById('navigation'); const navRoot = createRoot(navDomNode); navRoot.render(<Navigation />); const commentDomNode = document.getElementById('comments'); const commentRoot = createRoot(commentDomNode); commentRoot.render(<Comments />);
document.createElement()
๋ฅผ ์ฌ์ฉํ์ฌ ์ DOM ๋
ธ๋๋ฅผ ์์ฑํ๊ณ ๋ฌธ์์ ์๋์ผ๋ก ์ถ๊ฐํ ์๋ ์์ต๋๋ค.
const domNode = document.createElement('div');
const root = createRoot(domNode);
root.render(<Comment />);
document.body.appendChild(domNode); // You can add it anywhere in the document
DOM ๋
ธ๋์์ React ํธ๋ฆฌ๋ฅผ ์ ๊ฑฐํ๊ณ ์ด ํธ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๋ ค๋ฉด root.unmount
๋ฅผ ํธ์ถํ์ธ์.
root.unmount();
์ด ๊ธฐ๋ฅ์ React ์ปดํฌ๋ํธ๊ฐ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ก ์์ฑ๋ ์ฑ ๋ด๋ถ์ ์๋ ๊ฒฝ์ฐ์ ์ฃผ๋ก ์ ์ฉํฉ๋๋ค.
Updating a root component
๊ฐ์ ๋ฃจํธ์์ render
๋ฅผ ๋ ๋ฒ ์ด์ ํธ์ถํ ์๋ ์์ต๋๋ค. ์ปดํฌ๋ํธ ํธ๋ฆฌ ๊ตฌ์กฐ๊ฐ ์ด์ ๋ ๋๋ง๊ณผ ์ผ์นํ๋ ํ, React๋ ๊ธฐ์กด state๋ฅผ ์ ์งํฉ๋๋ค. ๋ค์ ์์ ์์ input์ ์ด๋ป๊ฒ ํ์ดํํ๋ ๊ด๊ณ์์ด, ๋งค ์ด ๋ฐ๋ณต๋๋ render
ํธ์ถ๋ก ์ธํ ์
๋ฐ์ดํธ๊ฐ ์๋ฌด๋ฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํค์ง ์์์ ์ฃผ๋ชฉํ์ธ์.
import { createRoot } from 'react-dom/client'; import './styles.css'; import App from './App.js'; const root = createRoot(document.getElementById('root')); let i = 0; setInterval(() => { root.render(<App counter={i} />); i++; }, 1000);
render
๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ์ถํ๋ ๊ฒฝ์ฐ๋ ํํ์ง ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก๋, ์ปดํฌ๋ํธ๊ฐ state๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
๋ฌธ์ ํด๊ฒฐ
๋ฃจํธ๋ฅผ ์์ฑํ๋๋ฐ ์๋ฌด๊ฒ๋ ํ์๋์ง ์์ต๋๋ค
์ค์ ๋ก ์ฑ์ ๋ฃจํธ์ ๋ ๋๋งํ๋ ๊ฒ์ ์์ง ์์๋์ง ํ์ธํ์ธ์.
import { createRoot } from 'react-dom/client';
import App from './App.js';
const root = createRoot(document.getElementById('root'));
root.render(<App />);
root.render(...)
๋ช
๋ น ์์ด๋ ์๋ฌด๊ฒ๋ ํ์๋์ง ์์ต๋๋ค.
โ๋์ ์ปจํ ์ด๋๊ฐ DOM ์๋ฆฌ๋จผํธ๊ฐ ์๋๋๋คโ ๋ผ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด ์ค๋ฅ๋ createRoot
์ ์ ๋ฌํ ๊ฒ์ด DOM ๋
ธ๋๊ฐ ์๋์ ์๋ฏธํฉ๋๋ค.
๋ฌด์จ ์ผ์ด ๋ฐ์ํ๋์ง ํ์คํ์ง ์๋ค๋ฉด ๋ก๊ทธ ์ดํด๋ณด๊ธฐ๋ฅผ ์๋ํด๋ณด์ธ์.
const domNode = document.getElementById('root');
console.log(domNode); // ???
const root = createRoot(domNode);
root.render(<App />);
์๋ฅผ ๋ค์ด domNode
๊ฐ null
์ด๋ฉด getElementById
๊ฐ null
์ ๋ฐํํ์์ ์๋ฏธํฉ๋๋ค. ์ด๋ ํธ์ถ ์์ ์ ๋ฌธ์์ ์ง์ ๋ ID๋ฅผ ๊ฐ์ง ๋
ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ์ ๋ฐ์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ช ๊ฐ์ง ์ด์ ๊ฐ ์์ ์ ์์ต๋๋ค.
- ์ฐพ๊ณ ์ ํ๋ ID๊ฐ HTML ํ์ผ์์ ์ฌ์ฉํ ID์ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์คํ๊ฐ ์๋์ง ํ์ธํ์ธ์!
- ๋ฒ๋ค์
<script>
ํ๊ทธ๋ HTML์์ ๊ทธ๋ณด๋ค ๋ค์ ์๋ DOM ๋ ธ๋๋ฅผ โ์ธ์ํ โ ์ ์์ต๋๋ค.
๋๋ค๋ฅธ ์ผ๋ฐ์ ์ธ ์ฌ๋ก๋ createRoot(domNode)
๋์ createRoot(<App />)
์ผ๋ก ์์ฑํ์ ๊ฒฝ์ฐ์
๋๋ค.
โํจ์๊ฐ React ์์์ผ๋ก ์ ํจํ์ง ์์ต๋๋คโ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด ์ค๋ฅ๋ root.render
์ ์ ๋ฌํ๋ ๊ฒ์ด React ์ปดํฌ๋ํธ๊ฐ ์๋์ ์๋ฏธํฉ๋๋ค.
์ด ์ค๋ฅ๋ <Component />
๋์ Component
๋ก root.render
๋ฅผ ํธ์ถํ ๋ ๋ฐ์ํ ์ ์์ต๋๋ค
// ๐ฉ Wrong: App is a function, not a Component.
root.render(App);
// โ
Correct: <App /> is a component.
root.render(<App />);
๋๋ ํจ์๋ฅผ ํธ์ถํ ๊ฒฐ๊ณผ ๋์ root.render
์ ํจ์ ์์ฒด๋ฅผ ์ ๋ฌํ์ ๋๋ ๋ฐ์ํ ์ ์์ต๋๋ค.
// ๐ฉ Wrong: createApp is a function, not a component.
root.render(createApp);
// โ
Correct: call createApp to return a component.
root.render(createApp());
์๋ฒ์์ ๋ ๋๋ง๋ HTML์ด ์ฒ์๋ถํฐ ๋ค์ ์์ฑ๋ฉ๋๋ค
์ฑ์ด ์๋ฒ์์ ๋ ๋๋ง ๋๊ณ React์ ์ด๊ธฐ HTML์ ํฌํจํ๋ ๊ฒฝ์ฐ์, ๋ฃจํธ๋ฅผ ์์ฑํด์ root.render
๋ฅผ ํธ์ถํ๋ฉด, ๋ชจ๋ HTML์ด ์ญ์ ๋๊ณ ๋ชจ๋ DOM ๋
ธ๋๊ฐ ์ฒ์๋ถํฐ ๋ค์ ์์ฑ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์๋๊ฐ ๋๋ ค์ง๊ณ , ํฌ์ปค์ค์ ์คํฌ๋กค ์์น๊ฐ ์ฌ์ค์ ๋๋ฉฐ, ๊ทธ ๋ฐ์ ๋ค๋ฅธ ์ฌ์ฉ์ ์
๋ ฅ๋ค์ด ์์ค๋ ์ ์์ต๋๋ค.
์๋ฒ์์ ๋ ๋๋ง๋ ์ฑ์ createRoot
๋์ hydrateRoot
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
import { hydrateRoot } from 'react-dom/client';
import App from './App.js';
hydrateRoot(
document.getElementById('root'),
<App />
);
API๊ฐ ๋ค๋ฅด๋ค๋ ์ ์ ์ ์ํ์ธ์. ํนํ, ์ผ๋ฐ์ ์ผ๋ก๋ root.render
๋ฅผ ์์ ํธ์ถํ์ง ์์ต๋๋ค.