Ch.16 Next.js 입문 — 풀스택 React 프레임워크
페이지와 라우팅
URL마다 페이지를 만들려면 파일을 어디에?
블로그를 만들고 있습니다. 글이 100개면 페이지 파일도 100개 만들어야 할까요? 동적 URL은 어떻게 처리할까요?
/blog/1, /blog/2... 무한한 URL을 어떻게?
동적 라우팅 — [id] 폴더 하나로 모든 동적 URL을 처리합니다.
핵심 내용
폴더 구조가 곧 URL입니다 page.tsx가 있는 폴더 = 접근 가능한 페이지
규칙 정리 page.tsx가 없는 폴더는 URL로 접근할 수 없습니다. 폴더는 경로 세그먼트를 만들고, page.tsx가 그 경로를 공개합니다.
[대괄호] 폴더 = 동적 경로 URL의 일부를 변수로 받습니다
// app/blog/[id]/page.tsx
// /blog/1, /blog/2, /blog/abc 모두 이 파일이 처리
interface Props {
params: { id: string };
}
export default function BlogPost({ params }: Props) {
return (
<article>
<h1>블로그 글 #{params.id}</h1>
<p>id는 URL에서 가져온 값입니다.</p>
</article>
);
}
// /blog/42 접속 → params.id = "42"// 실전: DB에서 데이터 가져오기
// app/blog/[id]/page.tsx
interface Props {
params: { id: string };
}
export default async function BlogPost({ params }: Props) {
// 서버에서 직접 DB 조회 가능!
const post = await db.post.findUnique({
where: { id: Number(params.id) },
});
if (!post) return <div>글을 찾을 수 없습니다</div>;
return (
<article>
<h1>{post.title}</h1>
<p>{post.content}</p>
</article>
);
}async 컴포넌트! 서버 컴포넌트에서는 async/await를 바로 사용할 수 있습니다. useEffect + useState 패턴이 필요 없습니다.
페이지 이동은 Link 컴포넌트로 새로고침 없이 빠르게 전환됩니다
// 프로그래밍 방식 네비게이션
"use client";
import { useRouter } from "next/navigation";
function LoginButton() {
const router = useRouter();
async function handleLogin() {
const result = await login();
if (result.success) {
router.push("/dashboard"); // 페이지 이동
}
}
return <button onClick={handleLogin}>로그인</button>;
}`app/products/[id]/page.tsx`에서 `/products/42` 접속 시 `params.id`의 값은?
Next.js에서 <a> 태그 대신 <Link> 컴포넌트를 사용하면 페이지 전체가 새로고침된다.
useRouter를 사용하려면 어떤 지시어가 필요한가요?
page.tsx가 없는 폴더도 URL로 접근할 수 있다.
핵심 용어
<Link>
선언적 이동 — 일반 링크에 사용
router.push()
프로그래밍 이동 — 로직 후 이동에 사용
router.replace()
히스토리 교체 — 뒤로가기 방지
router.back()
뒤로 가기 — 브라우저 뒤로가기와 동일
정리 노트
Next.js 페이지와 라우팅 정리
핵심 개념
- 파일 기반 라우팅
- app/about/page.tsx → /about 경로로 자동 매핑
- 동적 라우팅
- [id] 폴더명으로 동적 URL 파라미터 처리
- Link 컴포넌트
- <Link href>로 페이지 이동 — a 태그 대신 사용
- page.tsx 필수
- page.tsx가 없는 폴더는 URL로 접근 불가
폴더 구조가 곧 URL 구조 — 직관적이고 관리하기 쉽습니다.
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작