다들 react router는 한번쯤 사용해보셨을텐데요. 전 주로 BrowserRouter 를 사용해왔습니다.
react router v6.4 업데이트에서 다음과 같은 새로운 router가 추가되었습니다.
- createBrowserRouter
- createMemoryRouter
- createHashRouter
- createStaticRouter
그 중 CreateBrowserRouter
라는 새로운 라우팅 방식을 조사해봤습니다.
먼저 기존 방식 BrowserRouter 를 사용한 라우팅 방식입니다.
import { BrowserRouter } from "react-router-dom";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<BrowserRouter>
{" "}
// 최상단 root에서 BrowserRouter로 감싸기
<App />
</BrowserRouter>
);
import { Route, Routes } from "react-router-dom";
const App = () => {
return (
<Routes>
<Route path="/" element={<Layout />}>
// outlet을 이용한 중첩라우팅
<Route index element={<Main />} />
<Route path="/pageA" element={<PageA />} />
<Route path="/pageB" element={<PageB />} />
<Route path="/pageC" element={<PageC />} />
</Route>
</Routes>
);
};
1. CreateBrowserRouter 사용법
개요
-
Router.js : 각 path에 맞는 element를 매칭하여 내보내는 역할.
-
react-router-dom에서 createBrowserRouter를 import합니다.
-
각 페이지에서 보여줄 path와 element, 중첩라우팅을 위한 children을 적습니다.
-
배열안에 담긴 객체형태로 담아서 export합니다. (가장 상단의 페이지가 부모, children으로 들어오는 페이지가 자식페이지 입니다. 부모 -> 자식은 path가 이어진다고 생각하면 편합니다. ) ex> 부모 /movie, 자식 /movie/detail, /movie/video ....)
router.jsx
기존 방식과는 다르게 router라는 새로운 컴포넌트를 만들어서 route 링크 들만 따로 분리를 시켜서 관리하도록 했습니다. 기존 구성에서 중첩 되어있는 경로는 children을 이용해서 중첩을 사용할 수 있습니다.
//router.jsx
import { createBrowserRouter } from "react-router-dom";
// App.js를 Root.js로 만들 수 있다.
// import Root from "./routes/root";
import App from "./App";
import NotFound from "./pages/NotFound";
import MainPage from "./pages/MainPage/MainPage";
import DetailPage from "./pages/DetailPage/DetailPage";
import SearchPage from "./pages/SearchPage/SearchPage";
export const router = createBrowserRouter([
{
path: "/",
element: <App />,
errorElement: <NotFound />,
children: [
{
index: true,
// index: true, 대신 path: "", 도 가능
element: <MainPage />,
},
{
path: ":movieId",
element: <DetailPage />,
},
{
path: "search",
element: <SearchPage />,
},
],
},
]);
디테일 설명
-
src의 하위파일로 Router.js를 생성합니다.
-
createBrowserRouter를 import합니다.
import { createBrowserRouter } from "react-router-dom";
-
전체 컴포넌트의 root가 될 최상위 컴포넌트를 import합니다.
import App from "./App";
-
라우팅 하고 싶은 각각의 페이지들을 모두 import합니다.
(위 예시에서는 NotFound, MainPage, DetailPage, SearchPage)
-
router라는 이름의 변수를 선언하고 export합니다.
-
router는 createBrowserRouser()안에 라우팅할 각 페이지를 담습니다.
-
최상위 역할을 할 컴포넌트를 가장 상단에 적고 하위 컴포넌트들을 children안에 적는다. (path에 따라서 매칭되는 element에 적힌 컴포넌트가 화면에 렌더링될 것입니다.)
-
children을 통해서 중첩라우팅을 할 수 있습니다. (부모로 부터 path가 이어집니다.)
🔔참고. 시작페이지를 지정할때는 index: true를 적어도 되고 path를 ""로 적어도 됩니다.
index: true,
element: <MainPage />,
//혹은
path: "",
element: <MainPage />,
index.js
-
src의 하위폴더로 index.js를 생성합니다. (이미 존재하면 별도로 만들지 않아도 됩니다. )
-
React, ReactDOM을 각각 import합니다.
-
react-router-dom에서 RouteProvider를 import합니다.
-
router를 Router.js에서 import합니다.
-
ReactDOM.createRoot(...).render를 통해 router를 provider안에 넣습니다.
-
즉 RouterProvider를 이용해서 구성요소들을 전달하고 활성화 합니다.
import React from "react";
import ReactDOM from "react-dom/client";
import { RouterProvider } from "react-router-dom";
import { router } from "./Router";
ReactDOM.createRoot(document.getElementById("root")).render(
<RouterProvider router={router} />
);
3줄 요약
- react-router v6.4 은 4가지 라우팅 방법이 있다.
- 현재 BrowserRouter 보다 사용률이 높기에 적극활용을 권장한다.
- 프로젝트 구조에 따라 적합한 라우팅 방법을 사용하면 된다.