React는 웹 사이트의 전체 페이지를 하나의 페이지에 담아 동적으로 화면을 바꿔가며 표현하는 SPA(Single Page Application) 이다.
React-router-dom은 SPA에서 화면 전환을 위해 사용하는 모듈!
즉, 리액트를 사용하며 페이지를 이동할 때 필요한 라이브러리이다.
npm i react-router-dom
<Link> 태그를 통해 to 속성에 이동할 경로를 추가하여 이동시킨다.
주로 동적인 페이지에서 사용된다.
BrowserRouter는 Link 태그를 사용하여 URL을 이동하며 페이지를 불러오는 것이 아닌, 단순히 주소만 바꿔주며 컴포넌트들을 렌더링하는 역할을 한다.
그렇기에 새로고침을 하게 되면 해당 페이지를 찾지 못하기 때문에 에러가 발생할 수 있다.
예시
-- Router.tsx
import { Link, BrowserRouter, Routes, Route } from "react-router-dom";
<BrowserRouter>
<Header />
<Routes> // → 구) Switch
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</BrowserRouter>
-- App.tsx
function App() {
return (
<div>
<Router />
</div>
);
}
-- index.tsx
.
.
.
root.render(
<App />
);
-- Router.tsx
import { LcreateBrowserRouter } from "react-router-dom";
import Root from "./Root";
const router = createBrowserRouter([
{
path:"/", // → 부모 path
element: <Root />,
children: [
{
path:"", // → 자식 path
element: <Home />,
},
{
path:"about", // → 자식 path
element: <About />,
},
],
},
])
export default router;
-- Root.tsx (구_App.tsx)
function Root() {
return (
<div>
<Header />
<Outlet /> // → 중첩 라우터를 불러옴
</div>
);
}
-- index.tsx
import router from "./Router";
.
.
.
root.render(
<RouterProvider router={router}/>
);
router 가 실행되면서, 부모 path 의 element 인 <Root /> 가 읽힌다.(렌더링 됨)Root() 함수 안에 있는 <Outlet /> 을 <About /> 으로 대체한다.<About /> 이 렌더링되며 "/about" 페이지가 띄워진다.<Outlet /> 이 내가 render 하고자하는 route 로 바꿔주는 것
<Header /> 컴포넌트와, <Home /> 컴포넌트 
<Header /> 컴포넌트와, <About /> 컴포넌트경로에 대한 일반 렌더링 경로() 대신
loader,action또는 컴포넌트 렌더링에서 예외가 발생하면
오류 경로가 렌더링되고, 오류는useRouteError로 사용한다.
※ 이 기능은createBrowserRouter와 같은 데이터 라우터를 사용하는 경우에만 작동한다.
errorElement 를 렌더링하고, 정상적인 path 들은 문제 없이 컴포넌트를 렌더링해 화면에 보여준다. {
path: "",
element: < Home />,
errorElement: < ErrorComponent />,
},
-- ErrorComponent.tsx
function ErrorComponent() {
return <h1> 404 Not Found.<h1>
}
export default ErrorComponent;

Link 는 클릭 시 특정 주소로 유저를 이동해주는 태그였다면,
Navigate 는 특정 행동을 했을 때 해당 주소로 이동해줄 수 있게 만들어준다.
유저가 특정 페이지로 이동하였으나 접근 권한이 없을 때 등등에 사용된다.
function Header() {
const navigate = useNavigate();
const onAboutClick = () => {
navigate("/about");
};
return (
.
.
.
<button onClick={onAboutClick}> About </button>