SPA는 HTML 한 장에서 여러 화면을 바꿔 보여 줘. 라우터를 붙이면 전체 페이지를 다시 불러오지 않고도 URL, 화면, 뒤로가기를 함께 관리할 수 있어.
라우터가 필요한 이유
Vite SPA는 브라우저가 index.html을 받고 main.tsx에서 앱을 마운트하면서 시작해. 일반 링크로 /conversations/abc에 이동하면 브라우저가 문서를 다시 받아 React 상태도 처음부터 만들어야 해.
클라이언트 라우터는 앱 안의 링크 클릭을 받아 history.pushState()로 URL만 바꾸고, 그 경로에 맞는 컴포넌트를 React가 렌더링하게 해. 문서를 다시 불러오지 않으므로 상태가 유지되고 브라우저의 뒤로가기도 정상적으로 동작해.
React Router의 핵심 도구
<BrowserRouter>는 앱에 라우터 Context를 제공해.<Routes>와<Route>는 URL과 컴포넌트의 대응을 선언해.<Link>는 문서를 다시 받지 않고 URL을 바꾸는 앵커를 렌더링해.useParams()는 현재 경로의 동적 세그먼트를 읽어.useNavigate()는 폼 제출 뒤 이동처럼 코드에서 경로를 바꿀 때 사용해.
중첩 라우트와 현재 링크
중첩 라우트에서는 부모 컴포넌트를 레이아웃으로 두고 자식 화면이 들어갈 자리에 <Outlet />을 렌더링해. 그러면 cwkPippa의 사이드바처럼 화면 전환 뒤에도 남아 있어야 하는 UI를 유지할 수 있어. NavLink는 현재 URL과 일치하는지 알려 주므로 선택된 메뉴를 표시하기 편해.
직접 URL을 열 때는 호스트 설정이 필요해
배포된 SPA에서 /conversations/abc를 바로 열면 먼저 정적 호스트가 그 경로를 받아. 실제 파일이 없으면 404가 되므로, 정적 asset이 아닌 경로는 /index.html로 재작성하도록 설정해야 React Router가 이어받을 수 있어. Vercel, Cloudflare Pages, Netlify는 각각 이 규칙을 지원하고, 서버가 없는 Tauri 앱에는 필요하지 않아.
다른 선택지
TanStack Router는 타입 안전한 라우트와 검색 파라미터가 강점이고, Wouter는 작은 번들에 집중해. 일반적인 SPA에는 React Router가 무난해. 라우트 타입 추론이 핵심이면 TanStack Router를, 번들 크기를 아주 작게 유지해야 하면 Wouter를 검토해.