- Published on
3단계: 페이지 라우팅과 동적 URL 처리
페이지 라우팅과 동적 URL 처리
Next.js는 파일 이름만으로 URL 라우팅을 자동으로 구성해줍니다.
여기에 동적 세그먼트를 적용하면 매우 강력한 URL 설계가 가능해집니다.
3-1. 기본 라우팅 (정적 페이지)
pages/
index.js → /
about.js → /about
contact.js → /contact
// pages/about.js
export default function About() {
return <h1>소개 페이지입니다</h1>;
}
링크는 next/link
컴포넌트를 사용합니다.
import Link from 'next/link';
<Link href="/about">About</Link>
3-2. 동적 라우팅
파일 이름에 대괄호 [param]
을 사용하면 URL 파라미터로 인식됩니다.
pages/post/[id].js → /post/123, /post/hello
// pages/post/[id].js
import { useRouter } from 'next/router';
export default function Post() {
const router = useRouter();
const { id } = router.query;
return <h1>포스트 ID: {id}</h1>;
}
3-3. 다중 파라미터 라우팅
pages/category/[category]/[id].js
// pages/category/[category]/[id].js
import { useRouter } from 'next/router';
export default function Page() {
const router = useRouter();
const { category, id } = router.query;
return (
<div>
<h1>카테고리: {category}</h1>
<h2>ID: {id}</h2>
</div>
);
}
3-4. 404 페이지 만들기
404 전용 페이지는 pages/404.js
로 생성합니다.
// pages/404.js
export default function NotFound() {
return <h1>페이지를 찾을 수 없습니다.</h1>;
}
- 존재하지 않는 경로에 접근하면 자동으로 이 페이지가 보여집니다.
3-5. 커스텀 에러 페이지 (500 등)
// pages/_error.js
function Error({ statusCode }) {
return (
<p>
{statusCode
? `${statusCode} 서버 오류가 발생했습니다.`
: '클라이언트 오류가 발생했습니다.'}
</p>
);
}
Error.getInitialProps = ({ res, err }) => {
const statusCode = res?.statusCode || err?.statusCode || 404;
return { statusCode };
};
export default Error;
- Next.js에서
_error.js
를 이용해 커스텀 에러 메시지를 구성할 수 있습니다.
요약
- 파일 이름이 곧 URL이 되는 구조로 라우팅이 매우 직관적입니다.
[param].js
형식으로 동적 라우팅을 구현할 수 있습니다.useRouter()
를 통해 URL 정보를 받아올 수 있습니다.- 다중 파라미터 라우팅, 404/500 페이지 구성도 간단합니다.
심화학습
Q1. React Router에서 사용하는 방식과 비교했을 때 Next.js의 동적 라우팅이 가지는 이점은 무엇일까?
A: React Router는 라우팅 설정이 필요하지만, Next.js는 파일 이름만으로 라우팅이 자동 구성됩니다. 이는 유지보수성과 개발 속도에 매우 유리합니다.
Q2. 다중 파라미터 URL에서 SEO 최적화를 고려한 구성은 어떻게 설계해야 할까?
A: URL 구조를 명확하게 설계하고, 의미 있는 키워드를 포함시켜 검색엔진이 인식하기 좋게 만듭니다. 동적 페이지도 getStaticProps
등을 통해 정적으로 제공하면 SEO에 도움이 됩니다.
Q3. 동적 라우팅이 많아졌을 때 폴더 구조는 어떻게 관리하는 게 좋을까?
A: 기능 또는 도메인 단위로 디렉토리를 나누고, 각 하위에 라우팅 구조를 반영하면 유지보수가 쉽습니다. 예: /product/[category]/[id].js