createRoot
createRoot
๋ก ๋ธ๋ผ์ฐ์ DOM ๋
ธ๋ ์์ React ์ปดํฌ๋ํธ๋ฅผ ํ์ํ๋ ๋ฃจํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
const root = createRoot(domNode, options?)
- ๋ ํผ๋ฐ์ค
- ์ฌ์ฉ๋ฒ
- ๋ฌธ์ ํด๊ฒฐ
- ๋ฃจํธ๋ฅผ ์์ฑํ๋๋ฐ ์๋ฌด๊ฒ๋ ํ์๋์ง ์์ต๋๋ค
- ์ค๋ฅ ๋ฐ์: โroot.render์ ๋ ๋ฒ์งธ ์ธ์๋ฅผ ์ ๋ฌํ์ต๋๋คโ
- โ๋์ ์ปจํ ์ด๋๊ฐ 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
onCaughtError
: React๊ฐ Error Boundary์์ ์ค๋ฅ๋ฅผ ์ก์ ๋ ํธ์ถ๋๋ ์ฝ๋ฐฑ. Error Boundary์์ ์ก์error
์componentStack
์ ํฌํจํ๋errorInfo
๊ฐ์ฒด์ ํจ๊ป ํธ์ถ๋ฉ๋๋ค. - optional
onUncaughtError
: ์ค๋ฅ๊ฐ Error Boundary์ ์ํด ์กํ์ง ์์ ๋ ํธ์ถ๋๋ ์ฝ๋ฐฑ. ์ค๋ฅ๊ฐ ๋ฐ์ํerror
์componentStack
์ ํฌํจํ๋errorInfo
๊ฐ์ฒด์ ํจ๊ป ํธ์ถ๋ฉ๋๋ค. - optional
onRecoverableError
: React๊ฐ ์ค๋ฅ๋ก๋ถํฐ ์๋์ผ๋ก ๋ณต๊ตฌ๋ ๋ ํธ์ถ๋๋ ์ฝ๋ฐฑ. React๊ฐ ๋์ง๋error
์componentStack
์ ํฌํจํ๋errorInfo
๊ฐ์ฒด์ ํจ๊ป ํธ์ถ๋ฉ๋๋ค. ๋ณต๊ตฌ ๊ฐ๋ฅํ ์ค๋ฅ๋ ์๋ณธ ์ค๋ฅ ์์ธ์error.cause
๋ก ํฌํจํ ์ ์์ต๋๋ค. - 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.render(...)
์์ฒด๋ ๋น๋๊ธฐ์ ์ ๋๋ค. ์ฆ,root.render()
์ดํ์ ์์ฑ๋ ์ฝ๋๊ฐ ํด๋น ๋ ๋๋ง์useLayoutEffect
๋useEffect
๋ณด๋ค ๋จผ์ ์คํ๋ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์ํฉ์์๋ ์ด๋ฌํ ๋์๋ ๋ฌธ์ ์์ด ์ ์๋ํ๋ฉฐ, ๋๋ถ๋ถ ์์ ์ด ํ์ํ์ง ์์ต๋๋ค. ๋ค๋ง, Effect์ ์คํ ์์๊ฐ ์ค์ํ ๊ฒฝ์ฐ์๋flushSync
๋กroot.render(...)
ํธ์ถ์ ๊ฐ์ธ๋ฉด ์ด๊ธฐ ๋ ๋๋ง์ด ์์ ํ ๋๊ธฐ์ ์ผ๋ก ์คํ๋๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค.const root = createRoot(document.getElementById('root'));root.render(<App />);// ๐ฉ HTML์๋ ์์ง ๋ ๋๋ง๋ <App /> ๋ด์ฉ์ด ํฌํจ๋์ง ์์ต๋๋ค.console.log(document.body.innerHTML);
root.unmount()
root.unmount
๋ฅผ ํธ์ถํ๋ฉด React ๋ฃจํธ ๋ด๋ถ์์ ๋ ๋๋ง๋ ํธ๋ฆฌ๋ฅผ ์ญ์ ํฉ๋๋ค.
root.unmount();
์จ์ ํ React๋ง์ผ๋ก ์์ฑ๋ ์ฑ์๋ ์ผ๋ฐ์ ์ผ๋ก root.unmount
์ ๋ํ ํธ์ถ์ด ์์ต๋๋ค.
์ด ํจ์๋ ์ฃผ๋ก React ๋ฃจํธ์ DOM ๋
ธ๋(๋๋ ๊ทธ ์กฐ์ ๋
ธ๋)๊ฐ ๋ค๋ฅธ ์ฝ๋์ ์ํด DOM์์ ์ ๊ฑฐ๋ ์ ์๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด DOM์์ ๋นํ์ฑ ํญ์ ์ ๊ฑฐํ๋ jQuery ํญ ํจ๋์ ์์ํด ๋ณด์ธ์. ํญ์ด ์ ๊ฑฐ๋๋ฉด ๊ทธ ์์ ์๋ ๋ชจ๋ ๊ฒ(๋ด๋ถ์ React ๋ฃจํธ๋ฅผ ํฌํจ)์ด DOM์์ ์ ๊ฑฐ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ root.unmount
๋ฅผ ํธ์ถํ์ฌ ์ ๊ฑฐ๋ ๋ฃจํธ์ ์ฝํ
์ธ ๊ด๋ฆฌ๋ฅผ โ์ค์งโํ๋๋ก React์ ์ง์ํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ๊ฑฐ๋ ๋ฃจํธ ๋ด๋ถ์ ์ปดํฌ๋ํธ๋ ๊ตฌ๋
๊ณผ ๊ฐ์ ์ ์ญ ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๊ณ ํ๋ณดํ๋ ๋ฒ์ ๋ชจ๋ฅด๋ ์ฑ๋ก ์๊ฒ ๋ฉ๋๋ค.
root.unmount
๋ฅผ ํธ์ถํ๋ฉด ๋ฃจํธ์ ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ํด์ ๋๊ณ , ํธ๋ฆฌ์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ State๊ฐ ์ ๊ฑฐ๋๋ฉฐ, ๋ฃจํธ DOM ๋
ธ๋์์ React๊ฐ โ๋ถ๋ฆฌโ๋ฉ๋๋ค.
๋งค๊ฐ๋ณ์
root.unmount
๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ง ์์ต๋๋ค.
๋ฐํ๊ฐ
root.unmount
returns undefined
.
์ฃผ์ ์ฌํญ
-
root.unmount
๋ฅผ ํธ์ถํ๋ฉด ํธ๋ฆฌ์ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ํด์ ๋๊ณ ๋ฃจํธ DOM ๋ ธ๋์์ React๊ฐ โ๋ถ๋ฆฌโ๋ฉ๋๋ค. -
root.unmount
๋ฅผ ํ ๋ฒ ํธ์ถํ ํ์๋ ๊ฐ์ ๋ฃจํธ์์root.render
๋ฅผ ๋ค์ ํธ์ถํ ์ ์์ต๋๋ค. ๋ง์ดํธ ํด์ ๋ ๋ฃจํธ์์root.render
๋ฅผ ํธ์ถํ๋ ค๊ณ ํ๋ฉด โ๋ง์ดํธ ํด์ ๋ ๋ฃจํธ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.Cannot update an unmounted rootโ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํด๋น ๋ ธ๋์ ์ด์ ๋ฃจํธ๊ฐ ๋ง์ดํธ ํด์ ๋ ํ ๋์ผํ 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 ์ปดํฌ๋ํธ๊ฐ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ก ์์ฑ๋ ์ฑ ๋ด๋ถ์ ์๋ ๊ฒฝ์ฐ์ ์ฃผ๋ก ์ ์ฉํฉ๋๋ค.
๋ฃจํธ ์ปดํฌ๋ํธ ์ ๋ฐ์ดํธํ๊ธฐ
๊ฐ์ ๋ฃจํธ์์ render
๋ฅผ ๋ ๋ฒ ์ด์ ํธ์ถํ ์๋ ์์ต๋๋ค. ์ปดํฌ๋ํธ ํธ๋ฆฌ ๊ตฌ์กฐ๊ฐ ์ด์ ๋ ๋๋ง๊ณผ ์ผ์นํ๋ ํ, React๋ ๊ธฐ์กด State๋ฅผ ์ ์งํฉ๋๋ค. ๋ค์ ์์์์ ์
๋ ฅ ์ฐฝ์ ์ด๋ป๊ฒ ํ์ดํํ๋ ๊ด๊ณ์์ด, ๋งค ์ด ๋ฐ๋ณต๋๋ 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๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
ํ๋ก๋์ ํ๊ฒฝ์์ ์ค๋ฅ ๋ก๊น ํ๊ธฐ
React๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ค๋ฅ๋ฅผ ์ฝ์์ ์ถ๋ ฅํฉ๋๋ค. ์ฌ์ฉ์ ์ ์ ์ค๋ฅ ๋ณด๊ณ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด์ onUncaughtError
, onCaughtError
, onRecoverableError
์ ๊ฐ์ ์๋ฌ ํธ๋ค๋ฌ ๋ฃจํธ ์ต์
์ ์ ๊ณตํ ์ ์์ต๋๋ค.
import { createRoot } from "react-dom/client";
import { reportCaughtError } from "./reportError";
const container = document.getElementById("root");
const root = createRoot(container, {
onCaughtError: (error, errorInfo) => {
if (error.message !== "Known error") {
reportCaughtError({
error,
componentStack: errorInfo.componentStack,
});
}
},
});
onCaughtError ์ต์ ์ ๋ค์ ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋ ํจ์์ ๋๋ค.
- ๋ฐ์ํ error ๊ฐ์ฒด.
- ์ค๋ฅ์ componentStack ์ ๋ณด๋ฅผ ํฌํจํ errorInfo ๊ฐ์ฒด.
onUncaughtError
์ onRecoverableError
๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด, ์ฌ์ฉ์ ์ ์ ์ค๋ฅ ๋ณด๊ณ ์์คํ
์ ๊ตฌํํ ์ ์์ต๋๋ค.
import { createRoot } from "react-dom/client"; import App from "./App.js"; import { onCaughtErrorProd, onRecoverableErrorProd, onUncaughtErrorProd, } from "./reportError"; const container = document.getElementById("root"); const root = createRoot(container, { // ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ์ด ์ต์ ๋ค์ ์ ๊ฑฐํ๊ณ // React์ ๊ธฐ๋ณธ ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ง์ ์ค๋ฒ๋ ์ด๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. // ์ฌ๊ธฐ์๋ ํธ์๋ฅผ ์ํด ์กฐ๊ฑด ์์ด ํธ๋ค๋ฌ๋ฅผ ์ง์ ํ์ต๋๋ค. onCaughtError: onCaughtErrorProd, onRecoverableError: onRecoverableErrorProd, onUncaughtError: onUncaughtErrorProd, }); root.render(<App />);
๋ฌธ์ ํด๊ฒฐ
๋ฃจํธ๋ฅผ ์์ฑํ๋๋ฐ ์๋ฌด๊ฒ๋ ํ์๋์ง ์์ต๋๋ค
์ค์ ๋ก ์ฑ์ ๋ฃจํธ์ ๋ ๋๋งํ๋ ๊ฒ์ ์์ง ์์๋์ง ํ์ธํ์ธ์.
import { createRoot } from 'react-dom/client';
import App from './App.js';
const root = createRoot(document.getElementById('root'));
root.render(<App />);
root.render(...)
๋ช
๋ น ์์ด๋ ์๋ฌด๊ฒ๋ ํ์๋์ง ์์ต๋๋ค.
์ค๋ฅ ๋ฐ์: โroot.render์ ๋ ๋ฒ์งธ ์ธ์๋ฅผ ์ ๋ฌํ์ต๋๋คโ
ํํ ํ๋ ์ค์๋ createRoot
์ ์ต์
์ root.render(...)
์ ์ ๋ฌํ๋ ๊ฒ์
๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ: ๋ฃจํธ ์ต์
์ root.render(...)
๊ฐ ์๋๋ผ createRoot(...)
์ ์ ๋ฌํ์ธ์.
// ๐ฉ ์๋ชป๋ ๋ฐฉ๋ฒ: root.render๋ ํ๋์ ์ธ์๋ง ๋ฐ์ต๋๋ค.
root.render(App, {onUncaughtError});
// โ
์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ: ์ต์
์ createRoot์ ์ ๋ฌํฉ๋๋ค.
const root = createRoot(container, {onUncaughtError});
root.render(<App />);
โ๋์ ์ปจํ ์ด๋๊ฐ 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
๋ฅผ ํธ์ถํ ๋ ๋ฐ์ํ ์ ์์ต๋๋ค.
// ๐ฉ ์๋ชป๋ ๋ฐฉ๋ฒ: App์ ์ปดํฌ๋ํธ๊ฐ ์๋๋ผ ํจ์์
๋๋ค.
root.render(App);
// โ
์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ: <App />์ ์ปดํฌ๋ํธ์
๋๋ค.
root.render(<App />);
๋๋ ํจ์๋ฅผ ํธ์ถํ ๊ฒฐ๊ณผ ๋์ root.render
์ ํจ์ ์์ฒด๋ฅผ ์ ๋ฌํ์ ๋๋ ๋ฐ์ํ ์ ์์ต๋๋ค.
// ๐ฉ ์๋ชป๋ ๋ฐฉ๋ฒ: createApp์ ์ปดํฌ๋ํธ๊ฐ ์๋๋ผ ํจ์์
๋๋ค.
root.render(createApp);
// โ
์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ: createApp์ ํธ์ถํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํฉ๋๋ค.
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
๋ฅผ ์์ ํธ์ถํ์ง ์์ต๋๋ค.