React๋ ํ์ฌ๋ ๊ณ์ํด์ ์ ๋ฐ์ดํธ๊ฐ ๋๊ณ ์๋ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
์ด๋ฒ์ React๊ฐ ๋ฒ์ 18๋ก ์
๋ฐ์ดํธ๊ฐ ๋๋ฉด์ ๋ง์ ๋ถ๋ถ์ด ๋ฐ๋์๋๋ฐ,
๊ฐ์ฅ ๋น ๋ฅด๊ฒ ์์๋ณผ ์ ์๋ ๋ณํ๋ ์ฝ์ ์ฐฝ์ ์ด์ ์ ๋ณด์ด์ง ์๋ ๊ฒฝ๊ณ ๋ฌธ์ด ๋ณด์ธ๋ค๋ ์ ์ด๋ค.
ํด๋น ๊ฒฝ๊ณ ๋ฌธ์ ์ด์ React 18 ๋ฒ์ ์ ๋ ์ด์ ReactDOM.render๋ฅผ ์ง์ํ์ง ์๋๋ค๋ ๋ด์ฉ์ด๋ค.
๋ฌผ๋ก ๋ฒ์ ์ด 18๋ณด๋ค ๋ฎ์ ์ฑ์์๋ ํด๋น ๊ฒฝ๊ณ ๋ฌธ์ ๋ณด์ด์ง ์๋๋ค.
๊ทธ๋ฌ๋ ๊ณ์ํด์ ์
๋ฐ์ดํธ๊ฐ ๋๊ณ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋๋งํผ ํด๋น ์ด์๋ ์์๋ฌ์ผ ํ ๊ฒ์ด๋ค.
์ธ์ ๊น์ง 18 ๋ฒ์ ์ดํ๋ง ์ฌ์ฉํ ์ผ์ ์์ ๊ฒ์ด๊ณ ,
18 ๋ฒ์ ์ ์ฐ๋๋ฐ๋ ์ง์ํ์ง ์๋ ์ด์ ์ ๋ฌธ๋ฒ์ ์ฌ์ฉํด์๋ ์ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
// React 18์ด์ ์ index.js
const rootElement = document.getElementById("root");
ReactDOM.render(<AppTest />, rootElement);
// ๋ฐ๋ index.js
import { createRoot } from "react-dom/client";
const rootElement = document.getElementById("root");
const root = createRoot(rootElement);
root.render(
<App />
);
์ ๋ฐ ๊ฒฝ๊ณ ๋ฌธ์ด ๋ณด์ด๋ ์ด์ ๋ React 18์์๋ ์ด์ createRoot API๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
React 18์์ ์๊ธด ์๋ ๋ฐฐ์นญ ๋ํ ์ด createRoot API๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
๊ทธ์ค ์ฃผ๋ชฉํ ๋ถ๋ถ์ Concurrent Feature์ด๋ค. ์ง๊ธ๊น์ง๋ Concurrent Mode๋ผ๊ณ ๋ช
๋ช
๋์์ง๋ง ์ด๋ฒ์ Concurrent Feature๋ก ๋ฐ๋๋ฉด์ ํ๋์ ๊ธฐ๋ฅ์ผ๋ก ๋ค์ด์ค๊ฒ ๋์๋ค. ๊ทธ์ค์๋ Suspense
๊ธฐ๋ฅ์ด ์๋๋ฐ, React 18 ๋ฒ์ ๋ถํฐ๋ ์ด Suspense
๊ธฐ๋ฅ์ ์ด์ฉํด ๋
๋ฆฝ์ ์ผ๋ก ๋ ๋๋ง์ ํ ์ ์๋๋ก ํ๋ค.
React.lazy()
์ Suspense
๊ธฐ๋ฅ์ ์๊ธฐ ์ ์
์ฝ๋ ๋ถํ (code spliting)์ ๋ํด ์๋ฉด ์กฐ๊ธ ๋ ์ดํดํ๊ธฐ๊ฐ ์ฌ์์ง๋ค.
๋๋ถ๋ถ React ์ฑ๋ค์ Webpack, Rollup๊ณผ ๊ฐ์ ํด์ ์ฌ์ฉํด ๋ฒ๋ค๋ง(Bundling)ํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด HTML ์น ํ์ด์ง์ JavaScript๋ฅผ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฒ๋ค๋ ์ฑ์ ๋ชจ๋ JavaScript๊ฐ ํ ๊ณณ์ ์๊ธฐ ๋๋ฌธ์ ํ์ด์ง๋ฅผ ์ค์ ํ๋ ๋ฐ ํ์ํ ํธ์ถ ์๊ฐ ์ ์ ๋งํฌ ํ๊ทธ ํ๋๋ง ํ์ํ๊ฒ ๋๋ค. ๊ณผ๊ฑฐ์๋ ์ด๋ ๊ฒ ํด๋ ๋ฌด๋ฆฌ๊ฐ ์์๋ค. ๋ชจ๋ ์น ์ด์ ์ ์น JavaScript ์ฝ๋๋ ์ต์ํ์ ์์ค์ผ๋ก ์์ฑ๋์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฌ๋ ์ด์ ๋ ๋ฒ๋ค๋งํ๊ฒ ๋๋ฉด ํน์ ์ง์ ์์ ์ฝ๋๋ฅผ ํด์ํ๊ณ ์คํํ๋ ์ ๋๊ฐ ๋๋ ค์ง๊ฒ ๋์๋ค.
๋ชจ๋ ์น์ผ๋ก ๋ฐ์ ํ๋ฉด์ ์ ์ DOM์ ๋ค๋ฃจ๋ ์ ๋๊ฐ ์ ๊ตํด์ง๋ฉฐ,
JavaScript ์ฝ๋ ์์ฒด๊ฐ ๋ฐฉ๋ํด์ง๊ณ ๋ฌด๊ฑฐ์์ก๊ธฐ ๋๋ฌธ์ด๋ค.
โ๊ทธ๋ ๋ค๋ฉด ์ด๋ ํ์ด์ง์์ ์ฝ๋๋ฅผ ํด์ํ๊ณ ์คํํ๋ ์ ๋๊ฐ ๋๋ ค์ก๋์ง ํ์ ํด์ ๋ฒ๋ค์ ๋๋ ๋ค์ ์ง๊ธ ํ์ํ ์ฝ๋๋ง ๋ถ๋ฌ์ค๊ณ ๋์ค์ ํ์ํ ์ฝ๋๋ ๋์ค์ ๋ถ๋ฌ์ฌ ์ ์์ง ์์๊น??โ
์ด๊ฒ์ด ์ฝ๋ ๋ถํ ์ ํต์ฌ ์์ด๋์ด์ด๋ค. ๋ฒ๋ค์ด ๊ฑฐ๋ํด์ง๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํ ์ข์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ฒ๋ค์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋๋๋ ๊ฒ์ด๋ค. ์ฝ๋ ๋ถํ ์ ๋ฐํ์ ์ ์ฌ๋ฌ ๋ฒ๋ค์ ๋์ ์ผ๋ก ๋ง๋ค๊ณ ๋ถ๋ฌ์ค๋ ๊ฒ์ผ๋ก, Webpack, Rollup๊ณผ ๊ฐ์ ๋ฒ๋ค๋ฌ๊ฐ ์ง์ํ๋ ๊ธฐ๋ฅ์ด๋ค.
๋ฐ๋ผ์ ์ฝ๋ ๋ถํ ์ ํ๊ฒ ๋๋ฉด ์ง๊ธ ๋น์ฅ ํ์ํ ์ฝ๋๊ฐ ์๋๋ผ๋ฉด ๋ฐ๋ก ๋ถ๋ฆฌ๋ฅผ ์ํค๊ณ , ๋์ค์ ํ์ํ ๋ ๋ถ๋ฌ์์ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฅผ ํตํ์ฌ ๋๊ท๋ชจ ํ๋ก์ ํธ์ ์ฑ์ธ ๊ฒฝ์ฐ์๋ ํ์ด์ง์ ๋ก๋ฉ ์๋๋ฅผ ๊ฐ์ ํ ์ ์๊ฒ ๋๋ค.
๋ฒ๋ค ๋ถํ ํน์ ์ค์ด๋ ๋ฒ
๋ฒ๋ค๋ง ๋๋ ํ์ผ์๋ ์ฑ์ ๋ง๋ค๋ฉด์ npm์ ํตํด ๋ค์ด๋ก๋ํ๋ ์๋ํํฐ(Third Party) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํฌํจ์ด ๋๋ค. ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ฐ์ธ ๊ฐ๋ฐ์๋ ํ๋ก์ ํธ ํ, ํน์ ์ ์ฒด ๋ฑ์์ ๊ฐ๋ฐํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์ฆ ์ 3์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ฌ๊ทธ์ธ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ํ๋ ์์ํฌ ๋ฑ์ด ์กด์ฌํ๋ฉฐ, ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ฌ์ฉํ๋ฉด ํธํ๊ณ ํจ์จ์ ์ธ ๊ฐ๋ฐ์ ํ ์ ์๋ค.
๊ทธ๋ฌ๋ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฌ์ฉ์์๊ฒ ๋ค์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ์์ด ๋ง๊ณ , ๋ฒ๋ค๋ง ์ ๋ง์ ๊ณต๊ฐ์ ์ฐจ์งํ๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ ์ค์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ๋ถ๋ฅผ ๋ถ๋ฌ์์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ฐ๋ก๋ฐ๋ก ๋ถ๋ฌ์์ ์ฌ์ฉํ ์ ์๋ค๋ฉด ๋ง์ ๊ณต๊ฐ์ ์ฐจ์งํ์ง ์์ ์ ์๊ฒ ๋๋ค.
/* ์ด๋ ๊ฒ lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ฒด๋ฅผ ๋ถ๋ฌ์์ ๊ทธ ์์ ๋ค์ ๋ฉ์๋๋ฅผ ๊บผ๋ด ์ฐ๋ ๊ฒ์ ๋นํจ์จ์ ์ด๋ค.*/
import _ from 'lodash';
...
_.find([]);
/* ์ด๋ ๊ฒ lodash์ ๋ฉ์๋ ์ค ํ๋๋ฅผ ๋ถ๋ฌ์ ์ฐ๋ ๊ฒ์ด ์ฑ์ ์ฑ๋ฅ์ ๋ ์ข๋ค.*/
import find from 'lodash/find';
find([]);
ํด๋น ์ฝ๋๋ lodash๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์๋ก ํ๊ณ ์๋ค. ์น์
2์์ underbar ๊ณผ์ ๋ฅผ ํ๋ ๊ฒ์ ๊ธฐ์ตํด๋ณด์. ๊ทธ ๊ณผ์ ๋ lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋น์ทํ๊ฒ ๊ตฌํํ๋ ๊ณผ์ ์๋ค. lodash๋ ๋ฐฐ์ด, ์ซ์, ๊ฐ์ฒด, ๋ฌธ์์ด์ ์ฌ์ฉํ ๋ ๋ฐ๋ณต์ ์ธ ์์
๊ฐ์ ๊ฒ์ ํ ์ ์ฌ์ฉํ๊ธฐ์ ์ข์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
lodash๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋์ ํด๋์ ๊ฐ๊ณ , ๊ทธ ํด๋ ์์๋ ๊ฐ๋ฐ ์ ๋ค์ํ ์ํฉ์ ์ฐ๊ธฐ ์ข์ ๋ฉ์๋๋ค, ์ฆ ํจ์ ์ฝ๋๋ค์ด ๋ค์ด ์๋ค. ์ด ํจ์ ์ฝ๋๋ค์ ์์ด ์๋นํ๊ธฐ ๋๋ฌธ์ ์ ๋ถ ๊ฐ์ ธ์ฌ ์, ์ ๋ง๋ก ํ์ํ ๊ฒ ํ๋ ๊ฐ๋ง ์ฐ์ธ๋ค๋ฉด ๋๋จธ์ง๋ ๊ทธ๋ฅ ์ฐ์ด์ง ์๋ ์ฝ๋ ๋ญ์น๋ก ์ฑ ๋ด๋ถ์ ๋จ๊ฒ ๋๋ค. ์ด๋ ์ฑ์ ์ฑ๋ฅ์ ์ ํ์ํฌ ์์ง๊ฐ ์๊ธฐ ๋๋ฌธ์, ํ์ํ ๊ฒ ํ๋ ๊ฐ๋ง ๊ฐ์ ธ๋ค ์ฐ๋ ์์ผ๋ก ๊ฐ๋ฐํ๋ ๊ฒ์ด ํจ์ฌ ์ข๋ค.
React์์์ ์ฝ๋ ๋ถํ
React๋ SPA(Single-Page-Application)์ธ๋ฐ, ์ฌ์ฉํ์ง ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊น์ง ํ ๋ฒ์ ๋ถ๋ฌ์ค๊ธฐ ๋๋ฌธ์ ์ฒซ ํ๋ฉด์ด ๋ ๋๋ง ๋ ๋๊น์ง์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค. ๊ทธ๋์ ์ฌ์ฉํ์ง ์๋ ์ปดํฌ๋ํธ๋ ๋์ค์ ๋ถ๋ฌ์ค๊ธฐ ์ํด ์ฝ๋ ๋ถํ ๊ฐ๋ ์ ๋์ ํ๋ค.
React์์ ์ฝ๋ ๋ถํ ํ๋ ๋ฐฉ๋ฒ์ dynamic import(๋์ ๋ถ๋ฌ์ค๊ธฐ)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ๊ทธ์ ๊น์ง๋ ์ฝ๋ ํ์ผ์ ๊ฐ์ฅ ์ต์์์์ import ์ง์์๋ฅผ ์ฌ์ฉํด ์ฌ์ฉํ๊ณ ์ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ์ผ์ ๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์๋ค. ์ด๋ฅผ static import(์ ์ ๋ถ๋ฌ์ค๊ธฐ)๋ผ๊ณ ํ๋ค.
Static Import
/* ๊ธฐ์กด์๋ ํ์ผ์ ์ต์์์์ import ์ง์์๋ฅผ ์ด์ฉํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ์ผ์ ๋ถ๋ฌ์๋ค. */
import moduleA from "library";
form.addEventListener("submit", e => {
e.preventDefault();
someFunction();
});
const someFunction = () => {
/* ๊ทธ๋ฆฌ๊ณ ์ฝ๋ ์ค๊ฐ์์ ๋ถ๋ฌ์จ ํ์ผ์ ์ฌ์ฉํ๋ค. */
}
๊ธฐ์กด์๋ ํญ์ import
๊ตฌ๋ฌธ์ ๋ฌธ์์ ์์์ ์์นํด์ผ ํ๊ณ , ๋ธ๋ก๋ฌธ ์์์๋ ์์นํ ์ ์๋ ์ ์ฝ ์ฌํญ์ด ์์๋ค. ์๋ํ๋ฉด ๋ฒ๋ค๋ง ์ ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ๋ถ์ํด ๋ชจ๋์ ํ ๋ฐ ๋ชจ์ผ๊ณ ์ฌ์ฉํ์ง ์๋ ๋ชจ๋์ ์ ๊ฑฐํ๋ ๋ฑ์ ์์
์ ํ๋๋ฐ, ์ฝ๋ ๊ตฌ์กฐ๊ฐ ๊ฐ๋จํ๊ณ ๊ณ ์ ์ด ๋์ด ์์ ๋์์ผ๋ง ์ด ์์
์ด ๊ฐ๋ฅํด์ง๊ธฐ ๋๋ฌธ์ด์๋ค.
๊ทธ๋ฌ๋ ์ด์ ๋ ๊ตฌ๋ฌธ ๋ถ์ ๋ฐ ์ปดํ์ผํด์ผ ํ๋ ์คํฌ๋ฆฝํธ์ ์์
์ต์ํํ๊ธฐ ์ํด dynamic import ๊ตฌ๋ฌธ์ ์ง์ํ๋ค.
Dynamic Import
form.addEventListener("submit", e => {
e.preventDefault();
/* ๋์ ๋ถ๋ฌ์ค๊ธฐ๋ ์ด๋ฐ ์์ผ๋ก ์ฝ๋์ ์ค๊ฐ์ ๋ถ๋ฌ์ฌ ์ ์๊ฒ ๋๋ค. */
import('library.moduleA')
.then(module => module.default)
.then(someFunction())
.catch(handleError());
});
const someFunction = () => {
/* moduleA๋ฅผ ์ฌ๊ธฐ์ ์ฌ์ฉํ๋ค. */
}
์ด๋ฐ ์์ผ๋ก dynamic import๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ถ๋ฌ์จ moduleA
๊ฐ ๋ค๋ฅธ ๊ณณ์์
์ฌ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ, ์ฌ์ฉ์๊ฐ form์ ํตํด ์์์ ์ ์ถํ ๊ฒฝ์ฐ์๋ง ๊ฐ์ ธ์ค๋๋ก ํ ์ ์๋ค.
dynamic import๋ then
ํจ์๋ฅผ ์ฌ์ฉํด ํ์ํ ์ฝ๋๋ง ๊ฐ์ ธ์จ๋ค.
๊ฐ์ ธ์จ ์ฝ๋์ ๋ํ ๋ชจ๋ ํธ์ถ์ ํด๋น ํจ์ ๋ด๋ถ์ ์์ด์ผ ํ๋ค.
์ด ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋ฒ๋ค๋ง ์ ๋ถํ ๋ ์ฝ๋(์ฒญํฌ)๋ฅผ
์ง์ฐ ๋ก๋ฉ์ํค๊ฑฐ๋ ์์ฒญ ์์ ๋ก๋ฉํ ์ ์๋ค.
์ด dynamic import๋ React.lazy
์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
React.lazy ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด dynamic import๋ฅผ ์ฌ์ฉํด ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ์ ์๋ค.
React๋ SPA(Single-Page-Application)์ด๋ฏ๋ก ํ ๋ฒ์
์ฌ์ฉํ์ง ์๋ ์ปดํฌ๋ํธ๊น์ง ๋ถ๋ฌ์ค๋ ๋จ์ ์ด ์๋ค๊ณ ์์ ์ฑํฐ์์ ํ์ตํ๋ค.
React๋ React.lazy๋ฅผ ํตํด ์ปดํฌ๋ํธ๋ฅผ ๋์ ์ผ๋ก import๋ฅผ ํ ์ ์๊ธฐ ๋๋ฌธ์
์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๊ธฐ ๋ ๋๋ง ์ง์ฐ์๊ฐ์ ์ด๋ ์ ๋ ์ค์ผ ์ ์๊ฒ ๋๋ค.
import Component from './Component';
/* React.lazy๋ก dynamic import๋ฅผ ๊ฐ์ผ๋ค. */
const Component = React.lazy(() => import('./Component'));
์ด React.lazy
๋ก ๊ฐ์ผ ์ปดํฌ๋ํธ๋ ๋จ๋
์ผ๋ก ์ฐ์ผ ์๋ ์๊ณ ,
React.suspense
์ปดํฌ๋ํธ์ ํ์์์ ๋ ๋๋ง์ ํด์ผ ํ๋ค.
Router๋ก ๋ถ๊ธฐ๊ฐ ๋๋์ด์ง ์ปดํฌ๋ํธ๋ค์ ์ ์ฝ๋์ฒ๋ผ lazy๋ฅผ ํตํด importํ๋ฉด
ํด๋น path๋ก ์ด๋ํ ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์ค๊ฒ ๋๋๋ฐ ์ด ๊ณผ์ ์์ ๋ก๋ฉํ๋ ์๊ฐ์ด ์๊ธฐ๊ฒ ๋๋ค.
Suspense
๋ ์์ง ๋ ๋๋ง์ด ์ค๋น๋์ง ์์ ์ปดํฌ๋ํธ๊ฐ ์์ ๋ ๋ก๋ฉ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ณ ,
๋ก๋ฉ์ด ์๋ฃ๋๋ฉด ๋ ๋๋ง์ด ์ค๋น๋ ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
/* suspense ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ import ํด์์ผ ํ๋ค. */
import { Suspense } from 'react';
const OtherComponent = React.lazy(() => import('./OtherComponent'));
const AnotherComponent = React.lazy(() => import('./AnotherComponent'));
function MyComponent() {
return (
<div>
{/* ์ด๋ฐ ์์ผ๋ก React.lazy๋ก ๊ฐ์ผ ์ปดํฌ๋ํธ๋ฅผ Suspense ์ปดํฌ๋ํธ์ ํ์์ ๋ ๋๋งํ๋ค. */}
<Suspense fallback={<div>Loading...</div>}>
{/* Suspense ์ปดํฌ๋ํธ ํ์์ ์ฌ๋ฌ ๊ฐ์ lazy ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง์ํฌ ์ ์๋ค. */}
<OtherComponent />
<AnotherComponent />
</Suspense>
</div>
);
}
Supense
์ปดํฌ๋ํธ์ fallback
prop์ ์ปดํฌ๋ํธ๊ฐ ๋ก๋๋ ๋๊น์ง
๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ก๋ฉ ํ๋ฉด์ผ๋ก ๋ณด์ฌ์ค React ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐ์๋ค์
๋๋ค.
Suspense
์ปดํฌ๋ํธ ํ๋๋ก ์ฌ๋ฌ ๊ฐ์ lazy ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ค ์๋ ์๋ค.
React.lazy์ Suspense์ ์ ์ฉ
์ฑ์ ์ฝ๋ ๋ถํ ์ ๋์
ํ ๊ณณ์ ๊ฒฐ์ ํ๋ ๊ฒ์ ์ฌ์ค ๊น๋ค๋กญ๊ธฐ ๋๋ฌธ์, ์ค๊ฐ์ ์ ์ฉ์ํค๋ ๊ฒ๋ณด๋ค๋
์น ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ง์
ํ๋ ๋จ๊ณ Route์ ์ด ๋ ๊ธฐ๋ฅ์ ์ ์ฉ์ํค๋ ๊ฒ์ด ์ข๋ค.
import { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
const Home = lazy(() => import('./routes/Home'));
const About = lazy(() => import('./routes/About'));
const App = () => (
<Router>
<Suspense fallback={<div>Loading...</div>}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Suspense>
</Router>
);
๋ผ์ฐํฐ์ Suspense
๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ๊ฐ๋จํ ํธ์ด๋ค. ๋ผ์ฐํฐ๊ฐ ๋ถ๊ธฐ๋๋ ์ปดํฌ๋ํธ์์ ๊ฐ ์ปดํฌ๋ํธ์ React.lazy
๋ฅผ ์ฌ์ฉํ์ฌ import
ํ๋ค. ๊ทธ๋ฆฌ๊ณ Route ์ปดํฌ๋ํธ๋ค์ Suspense
๋ก ๊ฐ์ผ ํ ๋ก๋ฉ ํ๋ฉด์ผ๋ก ์ฌ์ฉํ ์ปดํฌ๋ํธ๋ฅผ fallback
์์ฑ์ผ๋ก ์ค์ ํด ์ฃผ๋ฉด ๋๋ค. ์ด๊ธฐ ๋ ๋๋ง ์๊ฐ์ด ์ค์ด๋๋ ๋ถ๋ช
ํ ์ฅ์ ์ด ์์ผ๋ ํ์ด์ง๋ฅผ ์ด๋ํ๋ ๊ณผ์ ๋ง๋ค ๋ก๋ฉ ํ๋ฉด์ด ๋ณด์ด๊ธฐ ๋๋ฌธ์ ์๋น์ค์ ๋ฐ๋ผ์ ์ ์ฉ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํด์ผ ํ๋ค.
์ด๋ฒ ๊ณผ์ ๋ ์ด๋ฒ ์ ๋์์ ๋ฐฐ์ด React Hooks๋ฅผ ์ ์ฉํด ๋ณด๊ณ , Custom Hook๊ณผ
React.lazy()
์ Suspense
๋ฅผ ์ด์ฉํ์ฌ React ์ฑ์ ์ง์ ๋ฆฌํฉํ ๋ง์ ํด๋ด
๋๋ค.
json-server ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ด๋ฒ ๊ณผ์ ์์๋ ์กฐ๊ธ ํน๋ณํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํฉ๋๋ค.
json-server๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์ฌ๋ฌ๋ถ์ด ์ง์ DB๋ฅผ ๋ง๋ค๊ณ ์๋ฒ๋ฅผ ๊ตฌ์ถํ
ํ์ ์์ด json ํ์ผ์ ์ด์ฉํ์ฌ REST API ์๋ฒ๋ฅผ ๊ตฌ์ถํด ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
// ์ค์น
npm i -g json-server
// ์๋ฒ ์ด๊ธฐ
cd data
json-server --watch data.json --port 3001
Home ํ๋ฉด
Detail ํ๋ฉด (PATCH)
๊ธ ์์ฑ (POST)
โ๏ธ Code
๋๋ฌด ์ข์ ๊ธ์ด๋ค์. ๊ณต์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.