์ ๋ฒ ๊ธ์์๋ ์ฝ๋ ์คํ์ผ์ ํด์ค Prettier, ๋ฆฐํธ๋ฅผ ํด์ค Eslint, ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ๋ฆฐํธํด์ค commitlint๊ฐ ๋ฌด์์ธ์ง ๊ทธ๋ฆฌ๊ณ ์ค์ ์ ๋ํด ์ดํด๋ณด๋ฉด์ ์ฝ๋๋ฅผ ์ง๊ธฐ ์ ์ ์ฌ์ ์ค๋น๋ ์๋ฃํ๋ค.
๐ฉ๐ป๐ป ์ค๋์ react router ์ค์ ์ ๋ํด ์ดํด๋ณด์.
ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ
๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ "ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ "์ ํด์ค๋ค.
์ ํต์ ์ธ ์น์ฌ์ดํธ์ ๋ธ๋ผ์ฐ์ ๋ ์น ์๋ฒ๋ก๋ถํฐ document ์์ฒญ์ ํ ํ,
์๋ต์ผ๋ก ๋ฐ์ css์ js asset๋ฑ์ ๋ค์ด๋ก๋ํ๊ณ ํ๊ฐํด์ HTML ๋๋๋ฅผ ํ๋ค.
์ฌ์ฉ์๊ฐ ๋งํฌ๋ฅผ ํด๋ฆญํ๋ฉด ์๋ก์ด ํ์ด์ง๋ฅผ ๊ทธ๋ ค์ฃผ๊ธฐ ์ํด ์ด ๊ณผ์ ์ ์์ฒญ์ ํ๋ ์ฒซ ๋จ๊ณ๋ถํฐ ๋ค์ ์์ํ๋ค.
๋ฐ๋ฉด ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ ์ ์๋ฒํํ document ์์ฒญ์ ํ ํ์ ์์ด,
๋ฐ๋ก ์๋ก์ด UI ์ผ๋ถ๋ฅผ ๋๋ํ๊ณ fetch๋ฅผ ํตํด์ ์ ํ์ด์ง์ ๋ํ ์ ๋ณด๋ก ์ ๋ฐ์ดํธํ ๋ฐ์ดํฐ ์์ฒญ์ ํ ์ ์๋๋ก ํ๋ค.
์ด๋ ๊ฒ ์์ ํ ์๋ก์ด document๋ฅผ ์์ฒญํ๊ฑฐ๋, css/js์ ๋ํ ์ฌ์ฐ์ฐ์ ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๋ค์ ๋ ๋น ๋ฅธ ์ ์ ๊ฒฝํ์ ํ ์ ์๊ฒ ๋๋ค.
ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ ์ Router๋ฅผ ์์ฑํ๊ณ Link์ <Form/>์ผ๋ก link/submitํด์ ํ์ฑํํ ์ ์๋ค.
์ค์น
yarn add react-router-dom
์ค์
- constants/url.ts : url๊ด๋ จ ์์๋ค์ ๋ชจ์๋ ํ์ผ. page์ ๊ดํ ๊ฒฝ๋ก๋ฅผ ์ด ํ์ผ์ ๋ชจ์๋์๋ค.
export const PAGE = {
MAIN: '/',
ERROR: '/error',
MYPAGE: '/mypage',
SEARCH: '/search',
MUSIC_INFO: '/music-info',
LOGGED_IN: '/me',
};
- routes/router.tsx : createBroswerRouter ์ค์ ์ ํด์ฃผ์.
import { PAGE } from '@/constants/url';
import { BaseLayout } from '@/layout/BaseLayout';
import ErrorPage from '@/pages/ErrorPage';
import MainPage from '@/pages/MainPage';
import MusicInfoPage from '@/pages/MusicInfoPage';
import NotFoundPage from '@/pages/NotFoundPage';
import SearchPage from '@/pages/SearchPage';
import { createBrowserRouter } from 'react-router-dom';
const router = createBrowserRouter([
{
element: <BaseLayout />,
children: [
{
path: PAGE.MAIN,
element: <MainPage />,
errorElement: <ErrorPage />,
},
{
path: PAGE.LOGGED_IN,
element: <MainPage />,
children: [{ path: PAGE.LOGGED_IN, element: <MainPage /> }],
errorElement: <ErrorPage />,
},
{
path: PAGE.MUSIC_INFO,
element: <MusicInfoPage />,
errorElement: <ErrorPage />,
},
{
path: PAGE.SEARCH,
element: <SearchPage />,
errorElement: <ErrorPage />,
},
{
path: '*', // ์์ ํ์ด์ง ์ด์ธ์ ๊ฒฝ์ฐ๋ notfound (404) ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ํ์.
element: <NotFoundPage />,
},
],
errorElement: <ErrorPage />,
},
]);
export default router;
- ์์ ์ค์ ๋ค์ ๋ณด๋ฉด
- element ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ธ์ค ๋ ์ด์์์ด๋ค.
- ๊ฐ children์ Outlet์ผ๋ก ๊ฐ route์ ํด๋นํ๋ ์ฝํ ์ธ ๋ฅผ ๋ณด์ฌ์ค๋ค.
- layout/BaseLayout.tsx
import { Outlet } from 'react-router-dom';
import Header from './Header';
export const BaseLayout = () => {
return (
<>
<Header />
<Outlet />
</>
);
};
- ๋ผ์ฐํฐ, tanstack query ๋ฑ์ ์ต์์์ ์ ๊ณตํด์ค ๊ธฐ๋ฅ๋ค์ provider์ ๋ชจ์๋ ์์ ์ด๋ค. ๋ค์๊ณผ ๊ฐ์ด ํ์ผ์ ์ถ๊ฐ๋ฅผ ํด์ฃผ์.
- providers/router.tsx
import router from '@/routes/router';
import { RouterProvider } from 'react-router-dom';
const Router = () => {
return <RouterProvider router={router} />;
};
export default Router;
- providers/index.tsx
import Router from './router';
const Providers = () => {
return (
<Router />
);
};
export default Providers;
- App.tsx
import './app.scss';
import Providers from './providers';
function App() {
return <Providers></Providers>;
}
export default App;
์ด์ ํ์ด์ง url์ ๋ฐ๋ผ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ค ์ ์๋ค.
๐ References
https://reactrouter.com/en/main