| title | Create React App ์ง์ ์ข ๋ฃ |
|---|---|
| author | Matt Carroll and Ricky Hanlon |
| date | 2025/02/14 |
| description | ์๋ก์ด ์ฑ์ ๋ํ Create React App ์ฌ์ฉ์ ์ค๋จํ๋ฉฐ, ๊ธฐ์กด ์ฑ์ ํ๋ ์์ํฌ๋ Vite, Parcel, RSBuild ๊ฐ์ ๋น๋ ๋๊ตฌ๋ก์ ๋ง์ด๊ทธ๋ ์ด์ ์ ๊ถ์ฅํฉ๋๋ค. ๋ํ ํ๋ ์์ํฌ๊ฐ ํ๋ก์ ํธ์ ๋ง์ง ์๊ฑฐ๋, ์์ ๋ง์ ํ๋ ์์ํฌ๋ฅผ ๊ตฌ์ถํ๊ณ ์ถ๊ฑฐ๋, ํน์ React๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ฐฐ์ฐ๊ธฐ ์ํด React ์ฑ์ ์ฒ์๋ถํฐ ๋ง๋ค์ด ๋ณด๊ณ ์ถ์ ์ฌ์ฉ์๋ค์์ ์ํ ๋ฌธ์๋ฅผ ์ ๊ณตํฉ๋๋ค. |
2025๋ 2์ 14์ผ, Matt Carroll, Ricky Hanlon
์๋ก์ด ์ฑ์ ๋ํ Create React App ์ฌ์ฉ์ ์ค๋จํ๋ฉฐ, ๊ธฐ์กด ์ฑ์ ํ๋ ์์ํฌ๋ Vite, Parcel, RSBuild ๊ฐ์ ๋น๋ ๋๊ตฌ๋ก์ ๋ง์ด๊ทธ๋ ์ด์ ์ ๊ถ์ฅํฉ๋๋ค.
๋ํ ํ๋ ์์ํฌ๊ฐ ํ๋ก์ ํธ์ ๋ง์ง ์๊ฑฐ๋, ์์ ๋ง์ ํ๋ ์์ํฌ๋ฅผ ๊ตฌ์ถํ๊ณ ์ถ๊ฑฐ๋, ํน์ React๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ฐฐ์ฐ๊ธฐ ์ํด React ์ฑ์ ์ฒ์๋ถํฐ ๋ง๋ค์ด ๋ณด๊ณ ์ถ์ ์ฌ์ฉ์๋ค์ ์ํ ๋ฌธ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
2016๋ Create React App์ ์ฒ์ ์ถ์ํ์์ ๋๋ React ์ฑ์ ์๋ก ๊ตฌ์ถํ ๋ช ํํ ๋ฐฉ๋ฒ์ด ์์์ต๋๋ค.
๋น์ React ์ฑ์ ๋ง๋ค๊ธฐ ์ํด์๋ JSX, Linting, Hot Reloading๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ง์ํ๋ ์ฌ๋ฌ ๋๊ตฌ๋ฅผ ์ง์ ์ค์นํ๊ณ ์ฐ๊ฒฐํด์ผ ํ์ต๋๋ค. ์ด๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ํํ๊ธฐ ๋งค์ฐ ๊น๋ค๋ก์ ๊ธฐ ๋๋ฌธ์, ์ปค๋ฎค๋ํฐ์์๋ ์์ฃผ ์ฌ์ฉํ๋ ์ค์ ์ ๋ํ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ฅผ ๋ง๋ค์์ต๋๋ค. ํ์ง๋ง ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ ์ ๋ฐ์ดํธํ๊ธฐ ์ด๋ ต๊ณ ์กฐ๊ฐํ๋ก ์ธํด React ํ์ด ์๋ก์ด ๊ธฐ๋ฅ์ ๋ฐฐํฌํ๋ ๋ฐ ์ด๋ ค์์ด ๋ง์์ต๋๋ค.
Create React App์ ์ฌ๋ฌ ๋๊ตฌ๋ฅผ ํ๋์ ๊ถ์ฅ ์ค์ ์ผ๋ก ํตํฉํ์ฌ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ์ด๋ก ์ธํด ์ฑ์ด ์๋ก์ด ๋๊ตฌ ๊ธฐ๋ฅ์ผ๋ก ์ฝ๊ฒ ์ ๊ทธ๋ ์ด๋ํ ์ ์๊ฒ ๋์์ผ๋ฉฐ, React ํ์ ์๋ช ํ์ง ์์ ๋๊ตฌ ๋ณ๊ฒฝ (Fast Refresh ์ง์, React Hooks Lint ๊ท์น ๋ฑ)์ ๊ฐ๋ฅํ ๋ง์ ์ฌ์ฉ์์๊ฒ ๋ฐฐํฌํ ์ ์์์ต๋๋ค.
์ด ๋ชจ๋ธ์ ๋งค์ฐ ์ธ๊ธฐ๋ฅผ ๋์๊ณ , ์ค๋๋ ๋น์ทํ ๋ฐฉ์์ผ๋ก ์๋ํ๋ ๋๊ตฌ๋ค์ด ํ๋์ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ํ์ฑํ ์ ๋๊ฐ ๋์์ต๋๋ค.
Create React App์ ์์์ ์ฝ๊ฒ ํด์ฃผ์ง๋ง, ๊ณ ์ฑ๋ฅ์ ํ๋ก๋์ ์ฑ ๊ตฌ์ถ์ ์ด๋ ต๊ฒ ํ๋ ๋ช ๊ฐ์ง ์ ํ์ด ์์ต๋๋ค. ์์น์ ์ผ๋ก๋ ์ด๋ฅผ ํ๋ ์์ํฌ๋ก ๋ฐ์ ์์ผ ํด๊ฒฐํ ์๋ ์์ต๋๋ค.
ํ์ง๋ง ํ์ฌ Create React App์ ์ ๊ทน์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ด๋น์๊ฐ ์๊ณ , ์ด๋ฏธ ๋ง์ ๊ธฐ์กด ํ๋ ์์ํฌ๋ค์ด ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ ํด๊ฒฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ ์ค๋จํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
์ค๋๋ถํฐ ์๋ก์ด ์ฑ ์ค์น ์์๋ ์ง์ ์ข ๋ฃ ๊ฒฝ๊ณ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
create-react-app is deprecated. {'\n\n'} You can find a list of up-to-date React frameworks on react.dev For more info see: react.dev/link/cra {'\n\n'} This error message will only be shown once per install.
Create React App ์น์ฌ์ดํธ์ GitHub ์ ์ฅ์์๋ ์ง์ ์ข ๋ฃ ์๋ด๋ฅผ ์ถ๊ฐํ์ต๋๋ค. Create React App์ ์ ์ง ๋ณด์ ๋ชจ๋๋ก ๊ณ์ ๋์ํ๋ฉฐ, React 19์ ํธํ๋๋ ์๋ก์ด ๋ฒ์ ์ ๋ฐฐํฌํ์ต๋๋ค.
React ์ฑ์ ํ๋ ์์ํฌ๋ก ์๋ก ๋ง๋ค๊ธฐ๋ฅผ ๊ถ์ฅํฉ๋๋ค. ์ถ์ฒํ๋ ๋ชจ๋ ํ๋ ์์ํฌ๋ ํด๋ผ์ด์ธํธ ์ธก ๋ ๋๋ง(CSR)๊ณผ ๋จ์ผ ํ์ด์ง ์ฑ(SPA)์ ์ง์ํ๋ฉฐ, CDN ๋๋ ์ ์ ํธ์คํ ์๋น์ค์ ์๋ฒ ์์ด ๋ฐฐํฌ ๊ฐ๋ฅํฉ๋๋ค.
๊ธฐ์กด ์ฑ์ ๊ฒฝ์ฐ ๋ค์ ์๋ด์๋ฅผ ์ฐธ๊ณ ํ์ฌ ํด๋ผ์ด์ธํธ ์ ์ฉ SPA๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ์ ์์ต๋๋ค.
- Next.js์ Create React App ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋
- React Router์ ํ๋ ์์ํฌ ๋์ ๊ฐ์ด๋
- Expo ์นํฉ์์ Expo Router๋ก์ ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋
์ฑ์ด ํน์ํ ์ ์ฝ ์กฐ๊ฑด์ ๊ฐ์ง๊ณ ์๊ฑฐ๋, ์์ ๋ง์ ํ๋ ์์ํฌ๋ฅผ ๊ตฌ์ถํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ถ์ ๊ฒฝ์ฐ, ํน์ React๊ฐ ์ฒ์๋ถํฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ๋ฐฐ์ฐ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ Vite, Parcel, RSBuild ๋ฑ์ ์ด์ฉํ์ฌ ์ปค์คํ ์ค์ ์ ์ง์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๊ธฐ์กด ์ฑ์ ๊ฒฝ์ฐ ๋ค์ ์๋ด์๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋น๋ ๋๊ตฌ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ์ ์์ต๋๋ค.
- Vite์ Create React App ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋
- Parcel์ Create React App ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋
- RSBuild์ Create React App ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋
Vite, Parcel ๋๋ RSBuild๋ก ์์ํ๋ ๋ฐ ๋์์ ์ฃผ๊ธฐ ์ํด React ์ฑ ๊ตฌ์ถํ๊ธฐ์ ๋ํ ์๋ก์ด ๋ฌธ์๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
๋๋ถ๋ถ์ ์ฑ์ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ๋ฆฌํ์ง๋ง, React ์ฑ์ ์ฒ์๋ถํฐ ์ง์ ๊ตฌ์ถํด์ผ ํ๋ ํ๋นํ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ๊ธฐ์ค์ผ๋ก, ๋ง์ฝ ์ฑ์์ ๋ผ์ฐํ ์ด ํ์ํ๋ค๋ฉด ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
Svelte์๋ SvelteKit, Vue์๋ Nuxt ๊ทธ๋ฆฌ๊ณ Solid์๋ SolidStart๊ฐ ์๋ฏ์ด, React๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ผ์ฐํ ์ ํฌํจํ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ, ์ฝ๋ ๋ถํ ๋ฑ์ ๊ธฐ๋ฅ์ ํตํฉํ ํ๋ ์์ํฌ ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ณต์กํ ์ค์ ์ ์ง์ ๊ตฌ์ฑํ๊ฑฐ๋, ์ฌ์ค์ ์์ฒด ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ ๋ถ๋ด์ ํผํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ฌ์ ํ Vite, Parcel, Rsbuild ๊ฐ์ ๋น๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด React ์ฑ์ ์ฒ์๋ถํฐ ์ง์ ๊ตฌ์ถํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
๋น๋ ๋๊ตฌ์ ํ๊ณ์ ํ๋ ์์ํฌ๋ฅผ ๊ถ์ฅํ๋ ์ด์ ์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด ๊ณ์ ์ฝ์ด๋ณด์ธ์.
Create React App๊ณผ ๊ฐ์ ๋น๋ ๋๊ตฌ๋ React ์ฑ์ ์์ํ๋ ๊ฒ์ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. npx create-react-app my-app์ ์คํํ๋ฉด ๊ฐ๋ฐ ์๋ฒ, Linting, ํ๋ก๋์
๋น๋๊ฐ ์์ ํ ์ค์ ๋ React ์ฑ์ ์ป์ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋ด๋ถ ๊ด๋ฆฌ์ ๋๊ตฌ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒฝ์ฐ ๋๋ฉ ํ์ด์ง๋ถํฐ ์์ํ ์ ์์ต๋๋ค.
export default function App() {
return (
<div>
<h1>Welcome to the Admin Tool!</h1>
</div>
)
}์ด๋ฅผ ํตํด JSX, ๊ธฐ๋ณธ Lint ๊ท์น, ๊ฐ๋ฐ ๋ฐ ํ๋ก๋์ ์์ ๋ชจ๋ ์คํํ ๋ฒ๋ค๋ฌ์ ํจ๊ป ๋ฐ๋ก React ์ฝ๋ฉ์ ์์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ค์ ์๋ ์ค์ ํ๋ก๋์ ์ฑ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์ํ ๋๊ตฌ๊ฐ ๋น ์ ธ ์์ต๋๋ค.
๋๋ถ๋ถ์ ํ๋ก๋์ ์ฑ์ ๋ผ์ฐํ , ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ, ์ฝ๋ ๋ถํ ๊ณผ ๊ฐ์ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ํ์ํฉ๋๋ค.
Create React App์๋ ํน์ ๋ผ์ฐํ
์๋ฃจ์
์ด ํฌํจ๋์ด ์์ง ์์ต๋๋ค. ์ฒ์ ์์ํ ๋๋ useState๋ฅผ ์ฌ์ฉํ์ฌ ๋ผ์ฐํ
๊ฐ ์ ํ์ ํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ๋งํฌ๊ฐ ๋์ผํ ํ์ด์ง๋ก ์ด๋ํ๊ฒ ๋๋ฉฐ, ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ฑ ๊ตฌ์กฐํ๊ฐ ์ด๋ ค์์ง๋ฉด์ ์ฑ์ ๋งํฌ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค.
import {useState} from 'react';
import Home from './Home';
import Dashboard from './Dashboard';
export default function App() {
// โ ๋ผ์ฐํ
์ State ๋ด์์ URL์ ์์ฑํ์ง ์์ต๋๋ค.
const [route, setRoute] = useState('home');
return (
<div>
{route === 'home' && <Home />}
{route === 'dashboard' && <Dashboard />}
</div>
)
}์ด๋ฌํ ์ด์ ๋ก Create React App์ ์ฌ์ฉํ๋ ๋๋ถ๋ถ์ ์ฑ์ React Router๋ Tanstack Router์ ๊ฐ์ ๋ผ์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐ๋ก ์ฌ์ฉํฉ๋๋ค. ๋ผ์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฑ์ ์ถ๊ฐ์ ์ธ ๋ผ์ฐํธ๋ฅผ ์ ์ํ ์ ์์ผ๋ฉฐ, ์ฑ ๊ตฌ์กฐ์ ๋ํ ์๊ฒฌ์ ์ ๊ณตํ๋ฉฐ ๋ผ์ฐํธ์ ๋ํ ๋งํฌ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด React Router๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ผ์ฐํธ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
import {RouterProvider, createBrowserRouter} from 'react-router';
import Home from './Home';
import Dashboard from './Dashboard';
// โ
๊ฐ๊ฐ์ ๋ผ์ฐํธ๋ ์์ ๋ง์ URL์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
const router = createBrowserRouter([
{path: '/', element: <Home />},
{path: '/dashboard', element: <Dashboard />}
]);
export default function App() {
return (
<RouterProvider value={router} />
)
}์ด ๋ณ๊ฒฝ์ผ๋ก ์ธํด /dashboard๋ก ๋งํฌ๋ฅผ ๊ณต์ ํ ์ ์๊ณ , ์ฑ์ด ๋์๋ณด๋ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค. ๋ผ์ฐํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ค์ฒฉ ๋ผ์ฐํธ, ๋ผ์ฐํธ ๋ณดํธ, ๋ผ์ฐํธ ์ ํ ๋ฑ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
๋ผ์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฑ์ ๋ณต์ก์ฑ์ ๋ํด์ฃผ์ง๋ง, ์ฑ ์์ด๋ ๊ตฌํํ๊ธฐ ์ด๋ ค์ด ๊ธฐ๋ฅ๋ ์ถ๊ฐํ๋ Trade-Off๊ฐ ์กด์ฌํฉ๋๋ค.
Create React App์ ๋ ๋ค๋ฅธ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์
๋๋ค. Create React App์ ํน์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์๋ฃจ์
์ ํฌํจํ์ง ์์ต๋๋ค. ์ฒ์ ์์ํ๋ค๋ฉด, ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ธฐ ์ํด Effect ๋ด์์ fetch๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ํ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ฏ๋ก, ๋คํธ์ํฌ ํญํฌ์Network Waterfalls ํ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋คํธ์ํฌ ํญํฌ์ ํ์์ ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํ๋ ๋์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๋ ๋์ , ์ฑ์ ๋ ๋๋งํ ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ฉด์ ๋ฐ์ํฉ๋๋ค.
export default function Dashboard() {
const [data, setData] = useState(null);
// โ ์ปดํฌ๋ํธ ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ฉด ๋คํธ์ํฌ ํญํฌ์ ํ์์ ์ผ์ผํต๋๋ค.
useEffect(() => {
fetch('/api/data')
.then(response => response.json())
.then(data => setData(data));
}, []);
return (
<div>
{data.map(item => <div key={item.id}>{item.name}</div>)}
</div>
)
}<<<<<<< HEAD Effect์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๊ฒ์, ๋ฐ์ดํฐ๋ฅผ ๋ ์ผ์ฐ ๊ฐ์ ธ์ฌ ์ ์์์์๋ ๋ถ๊ตฌํ๊ณ , ์ฌ์ฉ์๊ฐ ์ฝํ ์ธ ๋ฅผ ๋ณด๊ธฐ ์ํด ๋ ์ค๋ ๊ธฐ๋ค๋ ค์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๊ธฐ ์ ์ ์์ฒญ์ ์์ํ ์ ์๋๋ก ๋ฐ์ดํฐ ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ค๊ธฐ ์ต์ ์ ์ ๊ณตํ๋ React Query, SWR, Apollo ๋๋ Relay์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Fetching in an effect means the user has to wait longer to see the content, even though the data could have been fetched earlier. To solve this, you can use a data fetching library like TanStack Query, SWR, Apollo, or Relay which provide options to prefetch data so the request is started before the component renders.
bd87c394dc1daf0e54759126f847fcfa927e5a75
์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ผ์ฐํธ ์์ค์์ ๋ฐ์ดํฐ ์์กด์ฑ์ ์ง์ ํ ์ ์๋ ๋ผ์ฐํ "๋ก๋" ํจํด๊ณผ ํตํฉ๋ ๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ผ๋ก ์๋ํ๋ฉฐ, ์ด๋ฅผ ํตํด ๋ผ์ฐํฐ๊ฐ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค.
export async function loader() {
const response = await fetch(`/api/data`);
const data = await response.json();
return data;
}
// โ
์ฝ๋๋ฅผ ๋ค์ด๋ก๋ ํ ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๋ ฌ๋ก ๊ฐ์ ธ์ต๋๋ค.
export default function Dashboard({loaderData}) {
return (
<div>
{loaderData.map(item => <div key={item.id}>{item.name}</div>)}
</div>
)
}์ด๊ธฐ ๋ก๋ ์, ๋ผ์ฐํฐ๋ ๋ผ์ฐํธ๊ฐ ๋ ๋๋ง๋๊ธฐ ์ ์ ์ฆ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์ฑ ๋ด์์ ์ด๋ํ ๋, ๋ผ์ฐํฐ๋ ๋ฐ์ดํฐ์ ๋ผ์ฐํธ๋ฅผ ๋์์ ๋ณ๋ ฌ์ ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ด๋ ํ๋ฉด์ ์ฝํ ์ธ ๊ฐ ํ์๋๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ค์ด๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฅผ ์ํด์๋ ์ฑ์์ ๋ก๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑํด์ผ ํ๋ฉฐ, ์ฑ๋ฅ์ ์ํด ๋ณต์ก์ฑ์ ๊ฐ์ํด์ผ ํฉ๋๋ค.
Create React App์ ๋ ๋ค๋ฅธ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ ์ฝ๋ ๋ถํ ์ ๋๋ค. Create React App์ ํน์ ์ฝ๋ ๋ถํ ์๋ฃจ์ ์ ํฌํจํ์ง ์์ต๋๋ค. ์ฒ์ ์์ํ๋ค๋ฉด, ์ฝ๋ ๋ถํ ์ ์ ํ ๊ณ ๋ คํ์ง ์์ ์๋ ์์ต๋๋ค.
์ด๋ ์ฑ์ด ํ๋์ ๋ฒ๋ค๋ก ์ ๊ณต๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- bundle.js 75kbํ์ง๋ง ์ต์ ์ ์ฑ๋ฅ์ ์ํด์๋ ์ฝ๋๋ฅผ ๊ฐ๋ณ ๋ฒ๋ค๋ก "๋ถํ "ํ์ฌ ์ฌ์ฉ์๊ฐ ํ์ํ ๊ฒ๋ง ๋ค์ด๋ก๋ํ๋๋ก ํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์๊ฐ ํ์ฌ ๋ณด๊ณ ์๋ ํ์ด์ง์ ํ์ํ ์ฝ๋๋ง ๋ค์ด๋ก๋ํ๋ฏ๋ก ์ฑ ๋ก๋ฉ ์๊ฐ์ ์ค์ผ ์ ์์ต๋๋ค.
- core.js 25kb
- home.js 25kb
- dashboard.js 25kb์ฝ๋ ๋ถํ ์ ๊ตฌํํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ React.lazy๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ๋๊น์ง ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค์ง ๋ชปํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก ๋คํธ์ํฌ ํญํฌ์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ ์ต์ ํ๋ ํด๊ฒฐ์ฑ
์ ์ฝ๋๊ฐ ๋ค์ด๋ก๋๋๋ ๋์ ๋ณ๋ ฌ๋ก ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค๋ ๋ผ์ฐํฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, React Router๋ ๋ผ์ฐํธ๋ฅผ ์ฝ๋ ๋ถํ ์ ํด์ผ ํ๋ฉฐ ๋ก๋ ์์ ์ ์ต์ ํํด์ผ ํจ์ ์ง์ ํ๋ lazy ์ต์
์ ์ ๊ณตํฉ๋๋ค.
import Home from './Home';
import Dashboard from './Dashboard';
// โ
๋ผ์ฐํฐ๋ ๋ ๋๋ง๋๊ธฐ ์ ์ ๋ค์ด๋ก๋ ๋ฉ๋๋ค.
const router = createBrowserRouter([
{path: '/', lazy: () => import('./Home')},
{path: '/dashboard', lazy: () => import('Dashboard')}
]);์ต์ ํ๋ ์ฝ๋ ๋ถํ ์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๊ธฐ ๊น๋ค๋กญ๊ณ , ์ฌ์ฉ์๊ฐ ํ์ ์ด์์ ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํ๊ฒ ๋ง๋๋ ์ค์๋ฅผ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค. ์ด๋ ์บ์ฑ์ ์ต๋ํํ๊ณ , ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๋ณ๋ ฌํํ๋ฉฐ, "์ํธ์์ฉ ์ ๊ฐ์ ธ์ค๊ธฐ" ํจํด์ ์ง์ํ๊ธฐ ์ํด ๋ผ์ฐํฐ ๋ฐ ๋ฐ์ดํฐ ๋ก๋ฉ ์๋ฃจ์ ๊ณผ ํตํฉ๋ ๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ผ๋ก ์๋ํฉ๋๋ค.
์ด๊ฒ๋ค์ Create React App์ ๋ช ๊ฐ์ง ์ ํ ์ฌํญ ์์์ ๋ถ๊ณผํฉ๋๋ค.
๋ผ์ฐํ , ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ, ์ฝ๋ ๋ถํ ์ ํตํฉํ ํ์๋ ๋ณด๋ฅ ์ค์ธ ์ํ, ๋ด๋น๊ฒ์ด์ ์ค๋จ, ์ฌ์ฉ์์๊ฒ ๋ณด๋ด๋ ์ค๋ฅ ๋ฉ์์ง, ๋ฐ์ดํฐ ์ฌ๊ฒ์ฆ๋ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ํด๊ฒฐํด์ผ ํ ๋ฌธ์ ์ ์ ์ฒด ๋ฒ์ฃผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ ๊ทผ์ฑ
- ์์ฐ ๋ก๋ฉ
- ์ธ์ฆ
- ์บ์ฑ
- ์ค๋ฅ ์ฒ๋ฆฌ
- ๋ฐ์ดํฐ ๋ณ๊ฒฝ
- ํ์
- ๋๊ด์ ์ ๋ฐ์ดํธ
- ์ ์ง์ ํฅ์
- ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง
- ์ ์ ์ฌ์ดํธ ์์ฑ
- ์คํธ๋ฆฌ๋ฐ
์ด ๋ชจ๋ ๊ฒ๋ค์ด ํจ๊ป ์๋ํ์ฌ ๊ฐ์ฅ ์ต์ ํ๋ ๋ก๋ฉ ์์๋ฅผ ๋ง๋ญ๋๋ค.
Create React App์์ ์ด๋ฌํ ๋ฌธ์ ๋ค์ ๊ฐ๋ณ์ ์ผ๋ก ํด๊ฒฐํ๋ ๊ฒ์ ๊ฐ ๋ฌธ์ ๊ฐ ์๋ก ์ฐ๊ฒฐ๋์ด ์๊ณ ์ฌ์ฉ์๊ฐ ์ต์ํ์ง ์์ ๋ฌธ์ ์์ญ์ ๋ํ ๊น์ ์ ๋ฌธ ์ง์์ด ํ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉ์๋ค์ ๊ฒฐ๊ตญ Create React App ์์ ์์ ๋ง์ ๋ง์ถคํ ์๋ฃจ์ ์ ๊ตฌ์ถํ๊ฒ ๋๋๋ฐ, ์ด๋ Create React App์ด ์๋ ํด๊ฒฐํ๋ ค๊ณ ํ๋ ๋ฌธ์ ์ ๋๋ค.
Create React App, Vite, Parcel๊ณผ ๊ฐ์ ๋น๋ ๋๊ตฌ์์ ๋ชจ๋ ์์๋ฅผ ์ง์ ํด๊ฒฐํ ์ ์์ง๋ง, ์ด๋ฅผ ์ ์ํ ํ๊ธฐ์๋ ์ด๋ ต์ต๋๋ค. Create React App ์์ฒด๊ฐ ์ฌ๋ฌ ๋น๋ ๋๊ตฌ๋ฅผ ํตํฉํ๋ ๊ฒ์ฒ๋ผ, ์ด์ ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ํตํฉํ์ฌ ์ฌ์ฉ์์๊ฒ ์ต์์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์๋ ๋๊ตฌ๊ฐ ํ์ํฉ๋๋ค.
๋น๋ ๋๊ตฌ, ๋ ๋๋ง, ๋ผ์ฐํ , ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ์ฝ๋ ๋ถํ ์ ํตํฉํ๋ ์ด๋ฌํ ์ข ๋ฅ์ ๋๊ตฌ๋ค์ "ํ๋ ์์ํฌ"๋ผ๊ณ ํฉ๋๋ค. ๋๋ React ์์ฒด๋ฅผ ํ๋ ์์ํฌ๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ์ง๋ง, ์ด๋ค์ "๋ฉํํ๋ ์์ํฌ"๋ผ๊ณ ๋ถ๋ฅผ ์๋ ์์ต๋๋ค.
ํ๋ ์์ํฌ๋ ๋น๋ ๋๊ตฌ๊ฐ ๋๊ตฌ ์ฌ์ฉ์ ์ฝ๊ฒ ํ๊ธฐ ์ํด ์ผ๋ถ ์๊ฒฌ์ ๊ฐ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก, ํจ์ฌ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด ์ฑ ๊ตฌ์กฐํ์ ๋ํ ์ผ๋ถ ์๊ฒฌ์ ๊ฐ์ ํฉ๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ ํ๋ก์ ํธ์ Next.js, React Router ๋ฐ Expo์ ๊ฐ์ ํ๋ ์์ํฌ๋ฅผ ๊ถ์ฅํ๊ธฐ ์์ํ ์ด์ ์ ๋๋ค.
ํ๋ ์์ํฌ๋ Create React App๊ณผ ๋์ผํ ์์ ๊ฒฝํ์ ์ ๊ณตํ์ง๋ง, ์ฌ์ฉ์๊ฐ ์ค์ ํ๋ก๋์ ์ฑ์์ ๊ฒฐ๊ตญ์๋ ํด๊ฒฐํด์ผ๋ง ํ๋ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ๋ ์ ๊ณตํฉ๋๋ค.
์ ํฌ๊ฐ ์ถ์ฒํ๋ ํ๋ ์์ํฌ๋ค์ ๋ชจ๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง(CSR) ์ฑ์ ๋ง๋ค ์ ์๋ ์ต์ ์ ์ ๊ณตํฉ๋๋ค.
๊ฒฝ์ฐ์ ๋ฐ๋ผ CSR์ด ํ์ด์ง์ ์ ํฉํ ์ ํ์ผ ์ ์์ง๋ง, ๋๋ถ๋ถ์ ๊ทธ๋ ์ง ์์ต๋๋ค. ์ฑ์ ๋๋ถ๋ถ์ด ํด๋ผ์ด์ธํธ ์ฌ์ด๋๋ผ ํ๋๋ผ๋, ์ด์ฉ์ฝ๊ด ํ์ด์ง๋ ๋ฌธ์์ ๊ฐ์ด ์ ์ ์ฌ์ดํธ ์์ฑ(SSG) ๋๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR)๊ณผ ๊ฐ์ ์๋ฒ ๋ ๋๋ง ๊ธฐ๋ฅ์ ํํ์ ๋ฐ์ ์ ์๋ ๊ฐ๋ณ ํ์ด์ง๋ค์ด ๋ง์ด ์์ต๋๋ค.
์๋ฒ ๋ ๋๋ง์ ์ผ๋ฐ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์ ๋ ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ ์กํ๊ณ , ์์ ํ HTML ๋ฌธ์๋ฅผ ์ ๊ณตํ์ฌ ์ด ์ฐจ๋จ ์๊ฐ(TBT)์ ์ค์์ผ๋ก์จ ๋ ๋น ๋ฅธ ์ต์ด ์ฝํ ์ธ ํ์ธํธ(FCP)๋ฅผ ์์ฑํ๋ฉฐ, ์ด๋ ์ํธ์์ฉ์์ ๋ค์ ํ์ธํธ๊น์ง(INP)๋ ๋ฎ์ถ ์ ์์ต๋๋ค. ์ด๊ฒ์ด Chrome ํ์ด ๊ฐ๋ฐ์๋ค์๊ฒ ์ต์์ ์ฑ๋ฅ์ ๋ฌ์ฑํ๊ธฐ ์ํด ์์ ํ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์ ๊ทผ ๋ฐฉ์๋ณด๋ค ์ ์ ๋๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ๊ณ ๋ คํ ๊ฒ์ ๊ถ์ฅํ๋ ์ด์ ์ ๋๋ค.
์๋ฒ๋ฅผ ์ฌ์ฉํ๋ ๋ฐ๋ ํธ๋ ์ด๋ ์คํ๊ฐ ์์ผ๋ฉฐ, ๋ชจ๋ ํ์ด์ง์ ํญ์ ์ต์ ์ ์ ํ์ธ ๊ฒ์ ์๋๋๋ค. ์๋ฒ์์ ํ์ด์ง๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ถ๊ฐ ๋น์ฉ์ด ๋ฐ์ํ๊ณ ์์ฑํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฏ๋ก ์ต์ด ๋ฐ์ดํธ๊น์ง์ ์๊ฐ(TTFB)์ด ์ฆ๊ฐํ ์ ์์ต๋๋ค. ๊ฐ์ฅ ์ฑ๋ฅ์ด ์ข์ ์ฑ์ ๊ฐ ์ ๋ต์ ํธ๋ ์ด๋์คํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ด์ง๋ณ๋ก ์ ์ ํ ๋ ๋๋ง ์ ๋ต์ ์ ํํ ์ ์์ต๋๋ค.
ํ๋ ์์ํฌ๋ ์ํ๋ ๊ฒฝ์ฐ ๋ชจ๋ ํ์ด์ง์์ ์๋ฒ๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ต์ ์ ์ ๊ณตํ์ง๋ง, ์๋ฒ ์ฌ์ฉ์ ๊ฐ์ ํ์ง๋ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฑ์ ๊ฐ ํ์ด์ง์ ๋ง๋ ๋ ๋๋ง ์ ๋ต์ ์ ํํ ์ ์์ต๋๋ค.
์ ํฌ๊ฐ ์ถ์ฒํ๋ ํ๋ ์์ํฌ๋ React ์๋ฒ ์ปดํฌ๋ํธ๋ ์ง์ํฉ๋๋ค.
์๋ฒ ์ปดํฌ๋ํธ๋ ๋ผ์ฐํ ๊ณผ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์๋ฒ๋ก ์ด๋์ํค๊ณ , ๋ ๋๋ง๋๋ ๊ฒฝ๋ก๊ฐ ์๋ ๋ ๋๋งํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ๋ํ ์ฝ๋ ๋ถํ ์ด ๊ฐ๋ฅํ๊ฒ ํจ์ผ๋ก์จ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ ์ฃผ๋ฉฐ, ์ต์์ ๋ก๋ฉ ์ํ์ค๋ฅผ ์ํด ์ ์ก๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ ์ค์ ๋๋ค.
์๋ฒ ์ปดํฌ๋ํธ๋ ์๋ฒ๋ฅผ ํ์๋ก ํ์ง ์์ต๋๋ค. CI ์๋ฒ์์ ๋น๋ ์์ ์ ์คํํ์ฌ ์ ์ ์ฌ์ดํธ ์์ฑ(SSG) ์ฑ์ ๋ง๋ค๊ฑฐ๋, ์น ์๋ฒ์์ ๋ฐํ์์ ์คํํ์ฌ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR) ์ฑ์ ๋ง๋ค ์ ์์ต๋๋ค.
์์ธํ ๋ด์ฉ์ ์ ๋ก ๋ฒ๋ค ์ฌ์ด์ฆ React ์๋ฒ ์ปดํฌ๋ํธ ์๊ฐ ๋ฐ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
์๋ฒ ๋ ๋๋ง์ด SEO๋ง์ ์ํ ๊ฒ์ด๋ผ๋ ๊ฒ์ ํํ ์คํด์ ๋๋ค.
์๋ฒ ๋ ๋๋ง์ SEO๋ฅผ ๊ฐ์ ํ ์ ์์ง๋ง, ์ฌ์ฉ์๊ฐ ํ๋ฉด์์ ์ฝํ ์ธ ๋ฅผ ๋ณด๊ธฐ ์ ์ ๋ค์ด๋ก๋ํ๊ณ ํ์ฑํด์ผ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์์ ์ค์์ผ๋ก์จ ์ฑ๋ฅ๋ ํฅ์์ํต๋๋ค.
์ด๊ฒ์ด Chrome ํ์ด ๊ฐ๋ฐ์๋ค์๊ฒ ์ต์์ ์ฑ๋ฅ์ ๋ฌ์ฑํ๊ธฐ ์ํด ์์ ํ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์ ๊ทผ ๋ฐฉ์๋ณด๋ค ์ ์ ๋๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ๊ณ ๋ คํ ๊ฒ์ ๊ถ์ฅํ๋ ์ด์ ์ ๋๋ค.
Dan Abramov์๊ฒ Create React App์ ๋ง๋ค์ด์ค์ ๊ฐ์ฌํ๋ฉฐ, Joe Haddad, Ian Schmitz, Brody McKee, ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ธ ๋ง์ ๋ถ๋ค๊ป ์ค๋ ๊ธฐ๊ฐ Create React App์ ์ ์ง๋ณด์ํด ์ฃผ์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ํ, Brooks Lybrand, Dan Abramov, Devon Govett, Eli White, Jack Herrington, Joe Savona, Lauren Tan, Lee Robinson, Mark Erikson, Ryan Florence, Sophie Alpert, Tanner Linsley, ๊ทธ๋ฆฌ๊ณ Theo Browne์๊ฒ ์ด ๊ธ์ ๊ฒํ ํ๊ณ ํผ๋๋ฐฑ์ ์ ๊ณตํด ์ฃผ์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.