React 애플리케이션을 개발하다 보면, 단순한 페이지 전환을 넘어 사용자에게 더 개인화되고 반응적인 경험을 제공하고 싶다는 욕구가 생기기 마련입니다. 이때 빛을 발하는 기능이 바로 React Router의 동적 라우팅입니다. 동적 라우팅은 URL의 매개변수를 활용해 콘텐츠를 실시간으로 동적으로 생성하고 변경할 수 있게 해주며, API 응답이나 사용자 입력에 따라 애플리케이션이 유연하게 변신합니다. 이 포스트에서는 동적 라우팅의 기본 개념부터 실전 예시, 그리고 베스트 프랙티스까지 자세히 탐구하며, 여러분의 React 개발 스킬을 한 단계 업그레이드할 실질적인 인사이트를 공유하겠습니다. 초보자부터 중급 개발자까지, 함께 따라오세요!
동적 라우팅이란 무엇인가?
동적 라우팅은 고정된 경로가 아닌, 동적 매개변수(파라미터) 를 기반으로 URL을 생성하고 처리하는 React Router의 강력한 기능입니다. 이는 사용자 입력(예: 검색어)이나 서버 응답(예: 데이터 ID)에 따라 페이지 콘텐츠가 자동으로 변하는 '반응형' 애플리케이션을 만들 수 있게 합니다. 예를 들어, 블로그 앱에서 특정 게시물 ID를 URL에 넣으면 해당 게시물만 로드되는 식이죠.
이 기능의 매력은 사용자 경험(UX) 향상에 있습니다. 하드코딩된 경로 대신 동적 경로를 사용하면 앱이 더 직관적이고, SEO(검색 엔진 최적화)에도 유리하며, 코드 유지보수성도 크게 높아집니다. 이제 핵심 개념을 하나씩 파헤쳐 보겠습니다.
동적 라우팅의 핵심 개념
동적 라우팅을 마스터하려면 몇 가지 필수 개념을 익혀야 합니다. 아래에서 각 개념을 간단한 예시와 함께 설명하겠습니다.
1. 경로 매개변수 (Path Parameters)
경로 매개변수는 URL 내에서 특정 값을 '캡처'하는 자리 표시자입니다. :paramName 형태로 정의되며, 이는 동적 데이터를 처리하는 데 핵심입니다. 블로그 앱에서 게시물 ID를 기반으로 콘텐츠를 로드하는 예시를 보죠.
import { Route } from 'react-router-dom';
<Route path="/posts/:postId" component={Post} />
- URL
/posts/123에 접근하면:postId는123으로 매핑됩니다. - 컴포넌트 내에서
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 업데이트).exact는path="/"에 내장됨.
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 앱의 가능성을 확장하세요
동적 라우팅은 컴포넌트에 경로를 하드코딩하지 않고도 애플리케이션의 다양한 부분을 원활하게 탐색할 수 있도록 해주는 게임 체인저입니다. 경로 매개변수부터 프로그래밍 탐색까지, 이 기능들을 활용하면 사용자 중심의 반응형 앱을 구축할 수 있으며, 결과적으로 참여도와 만족도가 높아집니다.
'프로그래밍 > ReactJS' 카테고리의 다른 글
| React Router: 리다이렉트와 인증으로 사용자 경험과 보안을 강화하는 방법 (0) | 2025.10.19 |
|---|---|
| React Router 중첩 라우트: 복잡한 애플리케이션 내비게이션을 위한 핵심 전략 (0) | 2025.10.19 |
| React Router: 경로 일치의 마법을 파헤치다 – 동적 라우팅으로 앱을 스마트하게! (0) | 2025.10.19 |
| React 컴포넌트 테스트, Enzyme으로 마스터하기: 견고한 애플리케이션 구축의 핵심 (0) | 2025.10.19 |
| React Testing Library: 사용자 경험 중심의 테스트가 왜 중요한가? (0) | 2025.10.19 |