티스토리 뷰

300x250

React로 화면을 만들기 시작하면 금방 부딪히는 주제가 바로 페이지 이동입니다.

처음에는 컴포넌트 하나만 띄우면 되지만, 조금만 기능이 늘어나도 아래처럼 궁금해집니다.

  • 홈 화면에서 상세 페이지로 어떻게 이동하는가?
  • URL이 바뀌어도 새로고침 없이 화면이 바뀌는 이유는 무엇인가?
  • React에서 페이지 이동은 a 태그로 하면 안 되는가?
  • React Router는 어떻게 설치하고 적용하는가?

이번 글에서는 React 입문자가 가장 많이 찾는 React Router 사용법을 기준으로, 기본 라우팅 설정 → 페이지 이동 → Link 사용법 → useNavigate 활용까지 한 번에 정리하겠습니다.

핵심만 먼저 보면
React Router는 React 앱에서 URL에 따라 다른 화면을 보여주는 라우팅 라이브러리입니다.
Link는 클릭으로 이동할 때 자주 쓰고, useNavigate는 코드로 이동할 때 자주 씁니다.
기본 라우팅은 BrowserRouter, Routes, Route 구조부터 이해하면 시작할 수 있습니다.
728x90
React Router란 무엇인가?
React 앱에서 페이지 이동처럼 보이는 화면 전환을 관리하는 핵심 도구입니다.

React는 기본적으로 하나의 페이지 안에서 컴포넌트를 바꾸며 동작하는 경우가 많습니다. 이때 URL 경로에 따라 다른 화면을 보여주고 싶다면 라우팅이 필요합니다.

React Router는 이 라우팅을 담당하는 대표 라이브러리입니다.

예를 들어 아래처럼 생각하면 쉽습니다.

  • / → 홈 화면
  • /about → 소개 화면
  • /products → 상품 목록 화면
  • /products/1 → 상품 상세 화면

즉, React Router는 URL 경로와 컴포넌트를 연결해 주는 도구라고 보면 됩니다.

React Router의 핵심은 “페이지를 새로 여는 것”보다 경로에 따라 어떤 컴포넌트를 보여줄지 관리하는 것입니다.
왜 React에서 a 태그보다 React Router를 쓸까?
입문자가 가장 자주 헷갈리는 포인트입니다.

일반 HTML에서는 페이지 이동에 <a> 태그를 사용합니다. 하지만 React 앱에서는 <a> 태그를 그대로 쓰면 보통 전체 페이지가 다시 로드될 수 있습니다.

반면 React Router의 Link를 사용하면 필요한 화면만 자연스럽게 바뀌고, 싱글 페이지 애플리케이션(SPA) 흐름도 유지할 수 있습니다.

방식 차이
a 태그 전체 문서를 다시 요청하는 이동에 가깝습니다.
React Router Link SPA 흐름을 유지하면서 경로에 맞는 화면을 전환합니다.
쉽게 기억하기
React Router는 웹사이트 전체를 새로 여는 이동보다는, 앱 안에서 화면을 바꾸는 이동에 더 가깝습니다.
React Router 설치 방법
가장 먼저 패키지를 설치해야 합니다.

보통 React Router는 아래 명령어로 설치합니다.

npm install react-router-dom

설치가 끝나면 프로젝트에서 BrowserRouter, Routes, Route, Link, useNavigate 같은 기능을 사용할 수 있습니다.

처음엔 이 3개부터 기억하면 됩니다
BrowserRouter = 라우팅 전체를 감싸는 기본 컨테이너
Routes = 여러 Route를 묶는 영역
Route = 특정 경로에 어떤 컴포넌트를 보여줄지 연결
React Router 기본 라우팅 적용 방법
입문자는 이 구조를 한 번 정확히 보면 전체 흐름이 잡힙니다.

가장 기본적인 라우팅 코드는 아래처럼 구성할 수 있습니다.

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

function Home() {
  return <h2>홈 페이지</h2>;
}

function About() {
  return <h2>소개 페이지</h2>;
}

function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </BrowserRouter>
  );
}

export default App;

이 코드는 아래처럼 동작합니다.

  • / 경로로 들어오면 Home 컴포넌트를 보여주고
  • /about 경로로 들어오면 About 컴포넌트를 보여줍니다.

즉, Route경로(path)와 화면(element)을 연결하는 규칙입니다.

구성 요소 역할
BrowserRouter 브라우저 주소 기반 라우팅을 활성화합니다.
Routes 여러 Route를 감싸고 조건에 맞는 하나를 선택합니다.
Route 경로에 맞는 컴포넌트를 보여줍니다.
React Router Link 사용법
클릭으로 페이지 이동할 때 가장 자주 쓰는 방식입니다.

사용자가 메뉴를 클릭해서 이동하도록 만들려면 Link를 많이 씁니다.

import { Link } from 'react-router-dom';

function Menu() {
  return (
    <nav>
      <Link to="/">홈</Link>
      <Link to="/about">소개</Link>
    </nav>
  );
}

여기서 중요한 점은 href가 아니라 to 속성을 사용한다는 것입니다.

  • <a href="/about">가 아니라
  • <Link to="/about">를 사용합니다.

이 패턴은 헤더 메뉴, 사이드바, 목록 페이지 이동 등 거의 모든 기본 이동에서 자주 쓰입니다.

useNavigate 사용법
코드로 페이지를 이동시키고 싶을 때 사용합니다.

클릭 링크가 아니라, 특정 로직 이후 자동으로 이동시키고 싶을 때는 useNavigate를 많이 씁니다.

예를 들어 로그인 성공 후 메인 페이지로 보내는 경우가 대표적입니다.

import { useNavigate } from 'react-router-dom';

function LoginButton() {
  const navigate = useNavigate();

  const handleLogin = () => {
    // 로그인 처리
    navigate('/');
  };

  return <button onClick={handleLogin}>로그인</button>;
}

이 코드는 버튼을 누른 뒤 navigate('/')를 실행해 홈 화면으로 이동합니다.

즉, useNavigate이벤트 처리나 조건 처리 후 코드로 이동시킬 때 유용합니다.

상황 주로 쓰는 방식
메뉴 클릭 이동 Link
로그인 후 이동 useNavigate
폼 제출 후 이동 useNavigate
React Router 기본 예제 한 번에 보기
설치부터 이동까지 이어지는 가장 간단한 형태입니다.
import { BrowserRouter, Routes, Route, Link, useNavigate } from 'react-router-dom';

function Home() {
  return <h2>홈 화면</h2>;
}

function About() {
  return <h2>소개 화면</h2>;
}

function Login() {
  const navigate = useNavigate();

  const handleLogin = () => {
    navigate('/');
  };

  return <button onClick={handleLogin}>로그인 후 홈으로 이동</button>;
}

function App() {
  return (
    <BrowserRouter>
      <nav>
        <Link to="/">홈</Link>
        <Link to="/about">소개</Link>
        <Link to="/login">로그인</Link>
      </nav>

      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/login" element={<Login />} />
      </Routes>
    </BrowserRouter>
  );
}

export default App;

이 코드 하나만 이해해도 React Router 입문 흐름은 꽤 잘 잡힙니다.

꼭 봐야 할 포인트
처음에는 페이지가 여러 개 있다고 느껴지지만, React Router 관점에서는 하나의 앱 안에서 경로에 맞는 컴포넌트를 바꾸는 구조라고 이해하는 편이 더 정확합니다.
React Router에서 자주 헷갈리는 포인트
처음 배울 때 아래 부분에서 많이 막힙니다.
  • BrowserRouter로 전체를 감싸지 않으면 라우팅이 동작하지 않을 수 있습니다.
  • Linkhref가 아니라 to를 사용합니다.
  • Routecomponent가 아니라 element 형태로 넣는 버전을 많이 사용합니다.
  • 내부 이동은 Link, 코드 이동은 useNavigate로 구분하면 이해가 쉽습니다.
실무에서 특히 중요한 점
라우팅이 늘어날수록 핵심은 단순 이동보다 페이지 구조를 어떻게 나누고, 공통 레이아웃과 이동 흐름을 어떻게 설계할지입니다. 입문 단계에서는 우선 기본 이동 패턴부터 정확히 익히는 것이 좋습니다.
실무에서는 라우트 구조를 어떻게 나눌까?
페이지 수가 늘어나면 라우트 정의를 한 파일에만 몰아두지 않는 경우가 많습니다.

입문 예제에서는 App.jsx 안에 모든 라우트를 작성해도 괜찮지만, 실제 프로젝트에서는 화면이 늘어나면서 구조 분리가 중요해집니다.

예를 들어 아래처럼 나누는 방식이 많이 쓰입니다.

src/
├─ pages/
│  ├─ Home.jsx
│  ├─ About.jsx
│  ├─ Login.jsx
│  └─ ProductDetail.jsx
├─ layouts/
│  └─ MainLayout.jsx
├─ router/
│  └─ index.jsx
└─ App.jsx

이 구조의 핵심은 아래와 같습니다.

  • pages = 실제 라우트로 연결되는 화면 단위
  • layouts = 공통 헤더, 사이드바, 푸터 같은 골격
  • router = 경로 정의를 한곳에서 관리
구조 실무에서 좋은 이유
페이지 분리 각 화면 책임이 명확해져 수정 범위를 파악하기 쉽습니다.
레이아웃 분리 헤더·사이드바·공통 네비게이션을 중복 없이 재사용할 수 있습니다.
라우터 파일 분리 URL 구조와 페이지 관계를 한곳에서 관리하기 쉬워집니다.
Outlet과 레이아웃 라우트는 왜 많이 쓸까?
실무에서 공통 레이아웃을 깔끔하게 유지할 때 자주 쓰는 구조입니다.

페이지마다 헤더와 푸터를 반복해서 넣기보다, 공통 레이아웃 하나를 만들고 그 안에 각 페이지를 끼워 넣는 방식이 더 실용적입니다. 이때 자주 사용하는 것이 Outlet입니다.

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

function MainLayout() {
  return (
    <div>
      <header>
        <Link to="/">홈</Link>
        <Link to="/about">소개</Link>
      </header>

      <main>
        <Outlet />
      </main>
    </div>
  );
}

그리고 라우터는 아래처럼 구성할 수 있습니다.

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

function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<MainLayout />}>
          <Route index element={<Home />} />
          <Route path="about" element={<About />} />
        </Route>
      </Routes>
    </BrowserRouter>
  );
}

이 구조에서는 MainLayout이 공통 골격이 되고, Outlet 위치에 Home이나 About이 들어갑니다.

실무에서는 단순 라우트 나열보다 공통 레이아웃 + Outlet 구조가 훨씬 많이 쓰입니다.
중첩 라우팅은 언제 필요할까?
관리자 페이지나 마이페이지처럼 섹션이 많은 화면에서 자주 등장합니다.

예를 들어 마이페이지 아래에 주문내역, 회원정보, 찜 목록이 있다고 가정해보겠습니다.

<Route path="/mypage" element={<MyPageLayout />}>
  <Route index element={<MyPageHome />} />
  <Route path="orders" element={<OrderList />} />
  <Route path="profile" element={<Profile />} />
</Route>

이런 구조를 쓰면 /mypage, /mypage/orders, /mypage/profile처럼 하위 경로를 자연스럽게 연결할 수 있습니다.

즉, 중첩 라우팅은 단순히 복잡한 문법이 아니라 관련 있는 페이지를 한 구조 안에서 묶는 방식입니다.

중첩 라우팅을 잘 쓰면 좋은 점
상위 화면의 공통 구조는 유지하면서, 내부 콘텐츠만 바뀌게 만들 수 있어 유지보수와 확장성이 좋아집니다.
URL 파라미터 useParams는 왜 중요할까?
목록 → 상세 페이지 흐름에서 거의 빠지지 않는 핵심 패턴입니다.

실무에서는 상품 목록, 게시글 목록, 회원 목록처럼 리스트에서 상세 페이지로 넘어가는 흐름이 많습니다. 이때 자주 쓰는 것이 URL 파라미터입니다.

import { useParams } from 'react-router-dom';

function ProductDetail() {
  const { productId } = useParams();

  return <div>상품 상세 ID: {productId}</div>;
}

라우트는 아래처럼 연결합니다.

<Route path="/products/:productId" element={<ProductDetail />} />

예를 들어 /products/10으로 들어가면 productId10으로 읽힙니다.

이 패턴은 아래처럼 정말 자주 쓰입니다.

  • 게시글 상세 보기
  • 상품 상세 페이지
  • 유저 프로필 페이지
  • 주문 상세 페이지
보호 라우트는 어떻게 생각하면 될까?
로그인한 사용자만 접근 가능한 페이지를 만들 때 자주 쓰는 방식입니다.

관리자 페이지나 마이페이지는 로그인하지 않은 사용자가 접근하면 안 되는 경우가 많습니다. 이럴 때는 보호 라우트(Protected Route) 패턴을 많이 씁니다.

import { Navigate } from 'react-router-dom';

function ProtectedRoute({ isLogin, children }) {
  if (!isLogin) {
    return <Navigate to="/login" replace />;
  }

  return children;
}

사용 예시는 아래처럼 볼 수 있습니다.

<Route
  path="/mypage"
  element={
    <ProtectedRoute isLogin={isLogin}>
      <MyPage />
    </ProtectedRoute>
  }
/>

이 구조는 “조건이 맞지 않으면 다른 경로로 보내는 라우팅 제어”라는 점에서 실무 활용도가 높습니다.

실무 팁
보호 라우트는 단순히 로그인 여부만 보는 데서 끝나지 않고, 권한(role), 구독 상태, 조직 접근 권한 같은 조건으로도 확장되는 경우가 많습니다.
404 페이지 처리는 왜 넣는 게 좋을까?
실제 서비스에서는 없는 경로 처리도 꼭 필요합니다.

경로가 잘못 들어왔을 때 빈 화면이 나오면 사용자 경험이 좋지 않습니다. 그래서 실무에서는 보통 404 페이지를 같이 둡니다.

function NotFound() {
  return <h2>404 - 페이지를 찾을 수 없습니다.</h2>;
}

<Route path="*" element={<NotFound />} />

이렇게 해두면 정의되지 않은 경로로 접근했을 때 안내 화면을 보여줄 수 있습니다.

기초에서 심화로 이어질 때 핵심 기준
문법을 추가로 외우기보다 구조적 관점으로 보면 훨씬 이해가 쉽습니다.

React Router를 배울 때 흐름을 아래처럼 잡으면 기초와 심화가 자연스럽게 이어집니다.

  1. 기본 라우트 연결
  2. Link와 useNavigate로 이동 방식 이해
  3. 레이아웃 라우트와 Outlet 이해
  4. 중첩 라우팅으로 구조화
  5. useParams로 상세 페이지 연결
  6. Protected Route와 404 처리까지 확장

즉, 실무형 React Router는 단순히 페이지 이동만 되는 상태가 아니라 공통 레이아웃, 하위 구조, 상세 페이지, 접근 제어, 예외 처리까지 포함한 화면 구조 설계라고 보는 편이 맞습니다.

다음 단계로 이어지려면 무엇을 보면 좋을까?
기본 라우팅을 익혔다면 이후 흐름도 자연스럽게 연결됩니다.

기본 라우팅까지 이해했다면 다음으로는 아래 주제들이 자연스럽게 이어집니다.

  • 중첩 라우팅
  • 동적 URL 파라미터
  • 404 페이지 처리
  • 레이아웃 라우트
  • 인증 라우팅

즉, 이번 글은 React Router 입문의 출발점이면서, 실무 구조로 확장되는 연결 지점이라고 보면 됩니다.

마무리 정리
React Router는 React 앱에서 URL 경로에 따라 다른 화면을 보여주기 위한 대표 라우팅 도구입니다. 기본 구조만 정확히 이해하면 이후 중첩 라우트나 인증 라우팅으로도 자연스럽게 확장할 수 있습니다.
설치 = npm install react-router-dom
기본 구조 = BrowserRouter + Routes + Route
클릭 이동 = Link
코드 이동 = useNavigate
FAQ
  • Q. React에서 페이지 이동은 무조건 Link로 해야 하나요?
    → 클릭 메뉴 이동은 보통 Link를, 로그인 후 이동이나 조건 처리 뒤 이동은 useNavigate를 더 많이 씁니다.
  • Q. a 태그를 쓰면 왜 안 좋은가요?
    → 내부 이동에서 a 태그를 쓰면 SPA 흐름이 깨지고 전체 페이지가 다시 로드될 수 있습니다.
  • Q. React Router를 배우면 다음에 뭘 보면 좋나요?
    → 중첩 라우팅, Outlet, useParams, 보호 라우트, 404 처리 순서로 확장해가면 좋습니다.
React Router를 이해하면 이후 페이지 구조 설계, 인증 흐름, 레이아웃 분리까지 훨씬 자연스럽게 이어집니다.
728x90
댓글
반응형
최근에 올라온 글
글 보관함
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30