Learning
레슨 7 / 9·20분

React Router

React Router 기본

React Router는 SPA(Single Page Application)에서 URL에 따라 다른 컴포넌트를 보여주는 라우팅 라이브러리입니다. 페이지 전환 없이 URL이 변경되는 클라이언트 사이드 라우팅을 구현합니다.

tsx
import {
  BrowserRouter, Routes, Route, Link, NavLink
} from 'react-router-dom';

function App() {
  return (
    <BrowserRouter>
      <nav>
        {/* NavLink: 현재 경로와 일치하면 active 클래스 */}
        <NavLink to="/" className={({ isActive }) =>
          isActive ? "font-bold" : ""
        }>홈</NavLink>
        <NavLink to="/about">소개</NavLink>
        <NavLink to="/users">사용자</NavLink>
      </nav>

      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/users" element={<UserList />} />
        <Route path="/users/:id" element={<UserDetail />} />
        <Route path="*" element={<NotFound />} />
      </Routes>
    </BrowserRouter>
  );
}

동적 라우팅과 Params

:id처럼 경로에 변수를 포함시키면 동적 라우팅이 됩니다. useParams로 URL 파라미터를 읽고, useNavigate로 프로그래밍 방식의 이동을 합니다.

tsx
import { useParams, useNavigate, useSearchParams } from 'react-router-dom';

function UserDetail() {
  const { id } = useParams<{ id: string }>();
  const navigate = useNavigate();
  const [searchParams] = useSearchParams();

  const tab = searchParams.get("tab") || "profile";

  return (
    <div>
      <h2>사용자 #{id}</h2>
      <p>현재 탭: {tab}</p>

      <button onClick={() => navigate("/users")}>
        목록으로 돌아가기
      </button>
      <button onClick={() => navigate(-1)}>
        뒤로가기
      </button>
    </div>
  );
}

// 중첩 라우트
function Dashboard() {
  return (
    <div>
      <h1>대시보드</h1>
      <nav>
        <Link to="stats">통계</Link>
        <Link to="settings">설정</Link>
      </nav>
      {/* 중첩된 Route가 여기에 렌더링됨 */}
      <Outlet />
    </div>
  );
}

// App에서
<Route path="/dashboard" element={<Dashboard />}>
  <Route path="stats" element={<Stats />} />
  <Route path="settings" element={<Settings />} />
</Route>

보호된 라우트

인증이 필요한 페이지는 보호된 라우트(Protected Route) 패턴으로 구현합니다. 로그인하지 않은 사용자를 로그인 페이지로 리다이렉트합니다.

tsx
import { Navigate, Outlet } from 'react-router-dom';

// 인증 상태를 확인하는 래퍼 컴포넌트
function ProtectedRoute() {
  const { user } = useAuth(); // 커스텀 인증 Hook

  if (!user) {
    // 로그인 페이지로 리다이렉트
    return <Navigate to="/login" replace />;
  }

  return <Outlet />;
}

// 사용
<Routes>
  <Route path="/login" element={<Login />} />

  {/* 보호된 영역 */}
  <Route element={<ProtectedRoute />}>
    <Route path="/dashboard" element={<Dashboard />} />
    <Route path="/profile" element={<Profile />} />
    <Route path="/settings" element={<Settings />} />
  </Route>
</Routes>
💡

Next.js를 사용하면 파일 시스템 기반 라우팅이 자동으로 제공됩니다. app/about/page.tsx 파일을 만들면 /about 경로가 자동 생성되므로, React Router 설정이 필요 없습니다.