React를 공부하면서 React Router 사용을 기본적으로 하게 되는데 프로젝트를 하면서 Outlet을 사용하는 방법 등 라우터의 기능을 다양하게 사용할 수 있는 부분들을 알게 되었다. React Router에 대해서 다시 한번 정리하는 시간을 가져보려고 한다.
예전의 웹사이트들은 사용자가 웹사이트 내의 다른 페이지로 이동시, 페이지 전체를 매번 불러와야 했다. 웹사이트가 이전보다 복잡해지면서, 사용자와 서비스 사이에 많은 상호작용이 일어나게 되었고 중복되는 요소들을 매번 불러오는 것은 서버와의 불필요한 트래픽을 발생시켜 느린 반응성을 보여주면서 사용자 경험을 저하시키게 되었다. SPA는 Menu나 Footer 같은 중복되는 부분은 새로 불러오지 않고 업데이트가 필요한 부분만 새로 불러온다. 즉, 서버로부터 새로운 페이지를 불러오는 것이 아니라, 화면을 업데이트 하기 위해 필요한 데이터만 받아서 브라우저에서 해당하는 부분만 업데이트하는 방식으로 작동한다.
SPA 장점
SPA 단점
React Router를 사용하여 다른 주소에 따라 다른 뷰를 보여줄 수 있다.
아래와 같이 입력하면 설치할 수 있으며 package.json파일의 dependencies 항목에서 설치된 것을 확인할 수 있다.
npm install react-router-dom
App.js
BrowserRouter, Routes, Route를 react-router-dom을 설치하여 세팅한다. 그리고 라우팅을 하기 위한 컴포넌트들도 세팅한다.
import { BrowserRouter, Routes, Route} from 'react-router-dom"
import Header from './components/Header';
import Home from './pages/Home';
import MyPage from './pages/MyPage';
import Posts from './pages/Posts';
export default function App() {
return (
<BrowserRouter>
<Header />
<Routes>
<Route path="/" element={<Home />} />
<Route path="/mypage" element={<MyPage />} />
<Route path="/posts" element={<Posts />} />
</Routes>
</BrowserRouter>
);
}
Header.jsx
import { Link } from 'react-router-dom';
export default function Header() {
return (
<Nav>
<Link to="/">
Home
</Link>
<Link to="/posts">
Posts
</Link>
<Link to="/mypage">
MyPage
</Link>
</Nav>
);
}
useNavigate는 특정 행동을 했을 때 해당 주소로 이동시켜주는 역할을 하며 Link와는 달리 함수 호출을 통해 특정 조건에 따라 페이지를 이동할 수 있다.
import { useNavigate } from "react-router-dom";
function Mypage() {
let navigate = useNavigate();
function handleClick() {
if(로그인 한 상태) {
navigate('/mypage');
} else {
navigate('/login');
}
}
return <button onClick={handleClick}>마이페이지</button>;
}
react-router-dom을 위에서 적용시켜준 방법과 다르게 작성할 수 있는 방법이 있다. Outlet을 사용하면 하위 경로가 렌더링될 때 중첩된 UI가 표시될 수 있다.
index.js 파일이나 App.js파일에서 createBrowserRouter로 router에 대한 내용들을 정의한다. RouterProvider로 router를 전달해준 다음에 App.js파일에서 Outlet으로 children 컴포넌트들이 보여지게 설정하였다.
index.js
import React from "react";
import ReactDOM from "react-dom/client";
import { createBrowserRouter, RouterProvider } from "react-router-dom";
import "./index.css";
import App from "./App";
import NotFound from "./pages/NotFound";
import Home from "./pages/Home";
import MyPage from "./pages/MyPage";
import Posts from "./pages/Posts";
const router = createBrowserRouter([
{
path: "/",
element: <App />,
errorElement: <NotFound />,
children: [
{ index: true, path: "/", element: <Home /> },
{ path: "/mypage", element: <MyPage /> },
{ path: "/posts", element: <Posts /> },
],
},
]);
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<React.StrictMode>
<RouterProvider router={router} />
</React.StrictMode>
);
App.js
import { Outlet } from "react-router-dom";
import Header from "./components/Header";
function App() {
return (
<>
<Header />
<Outlet />
</>
);
}
export default App;
react-router-dom은 팀원들과 하는 프로젝트나 개인으로 하는 작은 프로젝트에서도 사용하지 않은 적이 없을만큼 거의 사용했던 거 같아서 한번 더 정리하는 시간을 가져봤다. React를 처음 배울때는 급하게 여러가지를 배워서 정신이 없었는데 시간적인 여유를 가지고 한번씩 정리해보니 내용이 기억에 잘 남을 거 같다