Router : URL에 따른 페이지 이동
React-Router : React에서 URL에 따른 페이지 이동
React : Client UI Library
React-Router : Client-Side-Routing Library
Cleint Side Rendering(CSR)
Server Side Rendering(SSR)
** Rendering == HTML을 만든다
React : Rendering하는JS UI Libarary
-> Brower에서 동작
-> Client-Side에서 Rendering하는 UI Library
-> Client에서 페이지를 구성하여 URL에 따른 페이지 구성 = Client Side Routing
만약 React로 구성하되 SSR하고 싶다면 ?
브라우저에서 하는 것 처럼 React 실행을 서버에서 한 번 해주면 됨
이를 지원하는 라이브러리 혹은 함수 존재
** 장단점을 생각하여 요구사항에 맞게 Trade-Off 하기
npm create vite@latest my-react-router -- --template react
npm install react-router-dom localforage match-sorter sort-by

import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
server: {
proxy: {
"/api": "http://localhost:3000",
},
},
resolve: {
alias: [
//절대 경로로 접근하기
{ find: "~/components", replacement: "/src/components" },
{ find: "~/lib", replacement: "/src/lib" },
{ find: "~/routers", replacement: "/src/routers" },
{ find: "~/routes", replacement: "/src/routes" },
],
},
});
npm install react-bootstrap bootstrap react-bootstrap-icons
routes/page.jsimport React from "react";
export default function MainPage() {
return (
<div>
<h1>This is my MainPage</h1>
<p>MainPage 입니다.</p>
</div>
);
}
routers/main-router.jsimport React from "react";
import { createBrowserRouter } from "react-router-dom";
import MainPage from "~/routes/page";
const mainRouter = createBrowserRouter([
{
path: "/",
element: <MainPage />,
index: true,
},
]);
export default mainRouter;
App.jsimport "./App.css";
import { RouterProvider } from "react-router-dom";
import mainRouter from "./routes/main-router";
function App() {
return <RouterProvider router={mainRouter} />;
}
export default App;

routes/board/page.jsimport React from "react";
export default function BoardListPage() {
return (
<div>
<h1>BoardList</h1>
<p>This is BoardListPAge</p>
</div>
);
}
routers/main-router.jsimport React from "react";
import { createBrowserRouter } from "react-router-dom";
import MainPage from "~/routes/page";
import BoardListPage from "./board/page";
const mainRouter = createBrowserRouter([
{
path: "/",
element: <MainPage />,
index: true,
},
{
path: "/board",
element: <BoardListPage />,
index: true,
},
]);
export default mainRouter;
src/components/MyNavbar/MyNavbar.js
https://react-bootstrap.netlify.app/docs/components/navbar
참고하여 Naber 생성
src/components/MyFooter/MyFooter.js
https://getbootstrap.com/docs/5.3/examples/
참고하여 Footer 생성
src/routes/board/page.js


board 작성, 상세, 수정에서도 레이아웃이 반복 (nav - contents - footer)
-> 재사용 필요
광범위하게 쓰이지만 해당 페이지가 다른 컴포넌트에 비교적 강하게 의존
src/components/BoardLayout.js

src/routes/board/page.js

특정 url 경로를 기반으로 컴포넌트 재사용
src/routes/board/layout.jsimport React from "react";
import MyNavbar from "~/components/MyNavbar/MyNavbar";
import { Container } from "react-bootstrap";
import MyFooter from "~/components/MyFooter/MyFooter";
import { Outlet } from "react-router-dom";
export default function BoardListLayout() {
return (
<>
<MyNavbar brandTitle="My-React-Board" />
<Container className="min-vh-100">
<Outlet />
</Container>
<MyFooter brandTitle="My-React-Board" />
</>
);
}
src/routes/board/page.jsimport React from "react";
export default function BoardListPage() {
return (
<>
<h1>My Board</h1>
</>
);
}
src/routers/main-router.jsconst mainRouter = createBrowserRouter([
{
path: "/",
element: <MainPage />,
index: true,
},
{
path: "/board",
element: <BoardListLayout />,
children: [
{
path: "",
index: true,
element: <BoardListPage />,
},
{
path: "write",
index: true,
element: <BoardWritePage />,
},
],
},
]);
export default mainRouter;
index: true 없으면 통과children 에 path를 추가하여 해당하는 레이아웃 그대로 사용 가능






