React와 Next.js에서 동적 라우트(Dynamic Route Segments)를 활용하면 유연한 페이지 구조를 만들 수 있습니다.
동적 경로 세그먼트
동적 경로(Dynamic Route)는 URL의 일부가 변수처럼 동적으로 변하는 구조를 의미합니다.
예를 들어, 블로그에서 개별 게시글을 가져오는 URL이 있다고 가정하면 다음과 같은 구조가 가능합니다.
/posts/1 → 1번 게시글
/posts/2 → 2번 게시글
위와 같이 특정한 숫자(또는 ID)에 따라 콘텐츠가 달라지는 경우, 동적 경로 세그먼트를 활용하면 효율적으로 페이지를 구성할 수 있습니다.
Next.js에서 동적 라우트 설정
기본 동적 라우트 [id]
Next.js에서는 폴더 기반의 라우팅 시스템을 활용하여 동적 라우트를 설정할 수 있습니다.
예를 들어, pages/posts/[id].tsx 파일을 생성하면 /posts/1, /posts/2와 같은 URL을 처리할 수 있습니다.
동적 라우트 예제
// pages/posts/[id].tsx
import { useRouter } from 'next/router';
const PostDetail = () => {
const router = useRouter();
const { id } = router.query; // URL의 id 값을 가져옴
return (
<div>
<h1>게시글 상세 페이지</h1>
<p>게시글 ID: {id}</p>
</div>
);
};
export default PostDetail;
- 위 코드에서 useRouter의 router.query.id를 통해 URL의 동적 값을 가져올 수 있습니다.
다중 동적 경로 [...slug]
Next.js에서는 다중 동적 경로를 설정할 수도 있습니다.
예를 들어, pages/posts/[...slug].tsx 파일을 만들면 /posts/category/react, /posts/2024/02/react-hooks 같은 URL을 처리할 수 있습니다.
// pages/posts/[...slug].tsx
import { useRouter } from 'next/router';
const DynamicPost = () => {
const router = useRouter();
const { slug } = router.query; // 배열 형태로 값이 들어옴
return (
<div>
<h1>동적 게시글</h1>
<p>경로: {JSON.stringify(slug)}</p>
</div>
);
};
export default DynamicPost;
- slug는 배열로 값이 들어오기 때문에, URL에 따라 다른 데이터를 가져오도록 처리할 수 있습니다.
React Router에서 동적 라우트 설정
Next.js 외에도 React Router를 사용하는 프로젝트에서도 동적 라우팅을 설정할 수 있습니다.
:id를 사용한 동적 라우트 설정
React Router에서는 :id와 같은 형식으로 동적 경로를 정의할 수 있습니다.
// App.tsx
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import PostDetail from './PostDetail';
function App() {
return (
<Router>
<Routes>
<Route path="/posts/:id" element={<PostDetail />} />
</Routes>
</Router>
);
}
export default App;
그리고 useParams를 이용해서 id 값을 가져올 수 있습니다.
// PostDetail.tsx
import { useParams } from 'react-router-dom';
const PostDetail = () => {
const { id } = useParams();
return (
<div>
<h1>게시글 상세</h1>
<p>게시글 ID: {id}</p>
</div>
);
};
export default PostDetail;
- 이렇게 하면 /posts/1로 접근했을 때 id 값이 1로 인식됩니다.
다중 동적 경로 :category/:id
React Router에서는 다중 동적 경로도 설정할 수 있습니다.
// App.tsx
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import CategoryPostDetail from './CategoryPostDetail';
function App() {
return (
<Router>
<Routes>
<Route path="/posts/:category/:id" element={<CategoryPostDetail />} />
</Routes>
</Router>
);
}
export default App;
// CategoryPostDetail.tsx
import { useParams } from 'react-router-dom';
const CategoryPostDetail = () => {
const { category, id } = useParams();
return (
<div>
<h1>카테고리별 게시글</h1>
<p>카테고리: {category}</p>
<p>게시글 ID: {id}</p>
</div>
);
};
export default CategoryPostDetail;
- 이렇게 하면 /posts/react/1 경로로 접근했을 때, category 값은 react, id 값은 1로 추출됩니다.
4. SEO 및 성능 고려 사항
동적 라우트를 사용할 때 SEO 및 성능 최적화도 고려해야 합니다.
- Next.js의 getStaticPaths와 getServerSideProps 활용: 정적 생성(SSG)과 서버 사이드 렌더링(SSR) 방식을 선택하여 성능을 최적화할 수 있습니다.
- React Router에서 데이터 프리페칭 적용: React Query 같은 라이브러리를 활용하여 미리 데이터를 불러올 수 있습니다.
'개발 공부 > React' 카테고리의 다른 글
| NextAuth.js의 보안 시크릿 키 (0) | 2025.03.07 |
|---|---|
| React useActionState (0) | 2025.03.06 |
| Next.js revalidatePath, redirect (0) | 2025.02.26 |
| React Streaming, Suspense (0) | 2025.02.25 |
| Static과 Dynamic Rendering (0) | 2025.02.23 |