Next.js 동적 라우팅 설정하기: 복잡한 네비게이션 처리
Next.js 동적 라우팅 설정하기: 복잡한 네비게이션 처리
Next.js는 React 기반의 프레임워크로, 서버 사이드 렌더링과 정적 사이트 생성이 매우 간편합니다. Next.js의 가장 큰 장점 중 하나는 파일 기반의 라우팅 시스템입니다. 이 시스템을 사용하면 특정 파일 구조를 만들기만 해도 자동으로 라우팅이 설정됩니다. 그러나 앱이 커지면서 더 복잡한 네비게이션이 필요한 경우, 동적 라우팅이 필수적입니다. 이번 글에서는 Next.js에서 동적 라우팅을 설정하고 복잡한 네비게이션을 처리하는 방법에 대해 알아보겠습니다.
동적 라우팅을 위한 파일 및 폴더 구조
Next.js에서 동적 라우팅을 구현하려면, 우선 파일과 폴더 구조를 잘 이해해야 합니다. 동적 라우팅을 설정하기 위해서는 대괄호([]
)를 사용합니다.
예를 들어, 특정 사용자의 프로필 페이지를 라우팅하려면 다음과 같은 구조를 가질 수 있습니다:
/pages
/users
[id].js
이렇게 하면 /users/1
, /users/2
같은 URL들이 자동으로 [id].js
파일로 라우팅됩니다.
getStaticPaths 사용하기
동적 라우팅을 위한 파일 구조를 설정한 뒤에는 데이터를 가져와야 합니다. 이는 getStaticPaths
함수를 사용하여 이루어집니다. getStaticPaths
는 반환된 경로들에 대한 정적 페이지를 생성합니다. 다음은 getStaticPaths
를 사용하는 예제입니다:
javascript// /pages/users/[id].js import { useRouter } from 'next/router'; export async function getStaticPaths() { // API 등을 통해 얻은 사용자 목록 데이터입니다. const users = await fetch('https://api.example.com/users').then(res => res.json()); const paths = users.map(user => ({ params: { id: user.id.toString() }})); return { paths, fallback: false }; } export async function getStaticProps({ params }) { const user = await fetch(`https://api.example.com/users/${params.id}`).then(res => res.json()); return { props: { user } }; } const UserProfile = ({ user }) => { return ( <div> <h1>{user.name}</h1> <p>{user.bio}</p> </div> ); }; export default UserProfile;
이 예제에서 getStaticPaths
함수는 API에서 사용자 목록을 가져와 각 사용자 별 경로를 반환합니다. getStaticProps
함수는 개별 사용자의 데이터를 가져와 컴포넌트에 props로 전달합니다.
getServerSideProps 사용하기
동적 데이터를 서버 사이드에서 바로 가져오는 또 다른 방법으로 getServerSideProps
를 사용할 수도 있습니다. 이 함수는 요청이 들어올 때마다 실행되며, SSR(Server-Side Rendering)을 가능하게 합니다.
javascript// /pages/users/[id].js import { useRouter } from 'next/router'; export async function getServerSideProps({ params }) { const user = await fetch(`https://api.example.com/users/${params.id}`).then(res => res.json()); return { props: { user } }; } const UserProfile = ({ user }) => { return ( <div> <h1>{user.name}</h1> <p>{user.bio}</p> </div> ); }; export default UserProfile;
위 예제에서는 getServerSideProps
함수를 사용하여 매 요청마다 데이터를 가져옵니다. 이는 데이터를 항상 최신 상태로 유지해야 할 때 유용합니다.
복잡한 네비게이션 처리하기
동적 라우팅을 통해 다양한 경로의 페이지를 생성할 수 있지만, 복잡한 네비게이션을 처리하기 위해서는 추가적인 고려사항이 필요합니다.
중첩된 동적 라우팅
중첩된 동적 라우팅을 설정하려면 더 많은 폴더와 파일 구조가 필요합니다. 예를 들어, 특정 사용자의 특정 게시물에 대한 경로는 다음과 같이 설정할 수 있습니다:
/pages
/users
[id]
/posts
[postId].js
이를 통해 /users/1/posts/10
같은 URL들이 동적으로 라우팅됩니다.
동적 URL 처리
Next.js에서는 useRouter
훅을 사용하여 현재 라우터의 정보를 가져올 수 있습니다. 이를 통해 동적 URL의 파라미터를 처리할 수 있습니다.
javascriptimport { useRouter } from 'next/router'; const PostPage = () => { const router = useRouter(); const { id, postId } = router.query; return ( <div> <h1>Post {postId} by User {id}</h1> </div> ); }; export default PostPage;
위 코드에서는 useRouter
를 사용하여 URL에서 동적 파라미터 id
와 postId
를 추출합니다.
결론
Next.js의 동적 라우팅을 사용하면 파일 기반 라우팅 시스템을 벗어나 더 복잡하고 역동적인 네비게이션을 구현할 수 있습니다. getStaticPaths
, getServerSideProps
함수를 통해 데이터를 가져오는 방법과 여러 동적 라우팅 설정을 통해 다양한 요구 사항을 충족할 수 있습니다. 네비게이션이 복잡해질수록 이러한 기술을 잘 활용하여 효율적인 라우팅과 데이터 관리를 할 수 있습니다.