프로그래밍/ReactJS

React Router 동적 라우팅 마스터하기: 사용자 경험을 혁신하는 방법

shimdh 2025. 10. 19. 00:48
728x90

React 애플리케이션을 개발하다 보면, 단순한 페이지 전환을 넘어 사용자에게 더 개인화되고 반응적인 경험을 제공하고 싶다는 욕구가 생기기 마련입니다. 이때 빛을 발하는 기능이 바로 React Router의 동적 라우팅입니다. 동적 라우팅은 URL의 매개변수를 활용해 콘텐츠를 실시간으로 동적으로 생성하고 변경할 수 있게 해주며, API 응답이나 사용자 입력에 따라 애플리케이션이 유연하게 변신합니다. 이 포스트에서는 동적 라우팅의 기본 개념부터 실전 예시, 그리고 베스트 프랙티스까지 자세히 탐구하며, 여러분의 React 개발 스킬을 한 단계 업그레이드할 실질적인 인사이트를 공유하겠습니다. 초보자부터 중급 개발자까지, 함께 따라오세요!

동적 라우팅이란 무엇인가?

동적 라우팅은 고정된 경로가 아닌, 동적 매개변수(파라미터) 를 기반으로 URL을 생성하고 처리하는 React Router의 강력한 기능입니다. 이는 사용자 입력(예: 검색어)이나 서버 응답(예: 데이터 ID)에 따라 페이지 콘텐츠가 자동으로 변하는 '반응형' 애플리케이션을 만들 수 있게 합니다. 예를 들어, 블로그 앱에서 특정 게시물 ID를 URL에 넣으면 해당 게시물만 로드되는 식이죠.

이 기능의 매력은 사용자 경험(UX) 향상에 있습니다. 하드코딩된 경로 대신 동적 경로를 사용하면 앱이 더 직관적이고, SEO(검색 엔진 최적화)에도 유리하며, 코드 유지보수성도 크게 높아집니다. 이제 핵심 개념을 하나씩 파헤쳐 보겠습니다.

728x90

동적 라우팅의 핵심 개념

동적 라우팅을 마스터하려면 몇 가지 필수 개념을 익혀야 합니다. 아래에서 각 개념을 간단한 예시와 함께 설명하겠습니다.

1. 경로 매개변수 (Path Parameters)

경로 매개변수는 URL 내에서 특정 값을 '캡처'하는 자리 표시자입니다. :paramName 형태로 정의되며, 이는 동적 데이터를 처리하는 데 핵심입니다. 블로그 앱에서 게시물 ID를 기반으로 콘텐츠를 로드하는 예시를 보죠.

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

<Route path="/posts/:postId" component={Post} />
  • URL /posts/123에 접근하면 :postId123으로 매핑됩니다.
  • 컴포넌트 내에서 useParams() 훅으로 이 값을 추출: const { postId } = useParams();
  • 활용 팁: API 호출 시 fetch(/api/posts/${postId})처럼 사용해 특정 데이터를 가져오세요.

이 기능 덕분에 하나의 컴포넌트로 수천 개의 페이지를 처리할 수 있습니다.

2. 중첩 경로 (Nested Routes)

중첩 경로는 부모 경로 아래에 자식 경로를 배치하는 방식으로, 앱 구조를 계층적으로 만듭니다. 사용자 프로필 페이지처럼 복잡한 섹션에 이상적입니다.

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

<Route path="/users/:userId">
  <UserProfile />
  <Route path="settings" component={UserSettings} />
</Route>
  • /users/abc123으로 접근하면 UserProfile이 렌더링되고, /users/abc123/settings로 이동하면 UserSettings이 추가됩니다.
  • 장점: 코드 재사용성과 논리적 구조화. Outlet 컴포넌트를 사용해 부모-자식 간 콘텐츠를 자연스럽게 연결하세요.

3. 리다이렉션 (Redirection)

리다이렉션은 조건에 따라 사용자를 자동으로 다른 경로로 이동시키는 기능입니다. URL 변경 시 사용자 혼란을 최소화하는 데 유용합니다.

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

<Redirect from="/old-path" to="/new-path" />
  • 인증 미완료 시 로그인 페이지로 리다이렉트: if (!isLoggedIn) return <Redirect to="/login" />;
  • 팁: 서버 사이드 리다이렉트와 결합하면 SPA(Single Page Application)의 단점을 보완할 수 있습니다.

4. 프로그래밍 방식 탐색 (Programmatic Navigation)

링크 클릭 없이 코드를 통해 탐색을 제어할 때 사용합니다. 양식 제출 후 성공 페이지로 이동하는 경우에 딱입니다. useNavigate 훅(React Router v6+)을 추천합니다.

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

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

  const handleSubmit = () => {
    // API 호출 등의 작업 수행...
    navigate('/success'); // 또는 navigate(-1)로 뒤로 가기
  };

  return (
    <form onSubmit={handleSubmit}>
      {/* 양식 요소 */}
      <button type="submit">제출</button>
    </form>
  );
}
  • v5 이하에서는 useHistory를 사용하세요. 이는 모달 닫기나 에러 핸들링에서 자주 쓰입니다.

5. 쿼리 문자열 사용 (Query String Usage)

동적 라우팅의 보조 도구로, URL 끝에 ?key=value 형태로 추가 정보를 전달합니다. 필터링이나 페이징에 적합합니다.

  • 예: /products?category=electronics&page=2
  • 접근: const { search } = useLocation(); 후 URLSearchParams로 파싱.
  • 팁: React Router의 useSearchParams 훅으로 더 쉽게 관리하세요.

실제 예시: 전자상거래 애플리케이션의 제품 상세 페이지

이론만으로는 부족하죠? 간단한 전자상거래 앱에서 동적 라우팅을 적용해 보겠습니다. 제품 목록에서 클릭 시 상세 페이지로 이동하는 플로우입니다. (React Router v6 기준으로 작성했습니다.)

App.js: 라우팅 설정

import React from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import ProductList from './ProductList';
import ProductDetail from './ProductDetail';

function App() {
  return (
    <Router>
      <Routes>
        {/* 홈: 모든 제품 목록 */}
        <Route path="/" element={<ProductList />} />
        {/* 동적: 개별 제품 상세 */}
        <Route path="/products/:productId" element={<ProductDetail />} />
      </Routes>
    </Router>
  );
}

export default App;
  • Switch 대신 Routes 사용 (v6 업데이트).
  • exactpath="/"에 내장됨.

ProductList.js: 제품 목록 컴포넌트

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

const ProductList = () => {
  const products = [
    { id: 1, name: 'Laptop', price: '$999' },
    { id: 2, name: 'Phone', price: '$699' },
  ];

  return (
    <>
      <h1>제품 목록</h1>
      {products.map((product) => (
        <Link
          key={product.id}
          to={`/products/${product.id}`}
          style={{ display: 'block', margin: '10px 0' }}
        >
          {product.name} - {product.price}
        </Link>
      ))}
    </>
  );
};

export default ProductList;
  • Link로 동적 URL 생성. 클릭 시 /products/1로 이동.

ProductDetail.js: 제품 상세 컴포넌트

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

const ProductDetail = () => {
  const { productId } = useParams(); // 동적 매개변수 추출

  const products = [
    { id: 1, name: 'Laptop', description: '강력한 성능의 노트북입니다.', price: '$999' },
    { id: 2, name: 'Phone', description: '최신 스마트폰입니다.', price: '$699' },
  ];

  const product = products.find((p) => p.id === parseInt(productId));

  if (!product) {
    return <h2>제품을 찾을 수 없습니다.</h2>;
  }

  return (
    <>
      <h1>제품 상세 정보</h1>
      <h3>{product.name}</h3>
      <p>ID: {productId}</p>
      <p>설명: {product.description}</p>
      <p>가격: {product.price}</p>
      <Link to="/">← 목록으로 돌아가기</Link>
    </>
  );
};

export default ProductDetail;
  • 실제 앱에서는 productId로 API 호출: useEffect(() => { fetch(/api/products/${productId}); }, [productId]);
  • 에러 핸들링 추가로 robustness 강화.

이 예시를 실행하면 목록에서 제품을 클릭할 때마다 URL이 동적으로 변하고, 해당 콘텐츠가 로드됩니다. 실제로 API와 결합하면 더 강력해집니다!

결론: 동적 라우팅으로 React 앱의 가능성을 확장하세요

동적 라우팅은 컴포넌트에 경로를 하드코딩하지 않고도 애플리케이션의 다양한 부분을 원활하게 탐색할 수 있도록 해주는 게임 체인저입니다. 경로 매개변수부터 프로그래밍 탐색까지, 이 기능들을 활용하면 사용자 중심의 반응형 앱을 구축할 수 있으며, 결과적으로 참여도와 만족도가 높아집니다.

728x90