Ultimate Next.js Course 강의와 Next.js 공식문서를 보면서 작성한 글입니다.
next.js 14버전에서 둘 다 지원
App Router | Page Router | |
---|---|---|
폴더 구조 | /app | /pages |
라우팅 방식/선언 | 동적/layout.js파일 | 정적/컴포넌트 파일 |
API 라우팅 | /app/api | /pages/api |
/blog/:id
파일 이름을 대괄호로 묶어주는 걸 약속으로 한다. 대괄호 안에 지정한 이름을 Page 컴포넌트의 인자로 받을 수 있다.
// app/blog/[id]/page.tsx
export default function Page({ params }: { params: {id: string} }){
return <div>My Post: { params.id}</div>
}
라우팅 계층을 중첩 라우트로 나누어, 동일한 URL 경로 내에서 여러 컴포넌트를 병렬로 렌더링하는 기능. 특히 레이아웃이 중첩된 복잡한 페이지에서 페이지의 각 부분이 독립적으로 데이터를 로드하고 렌더링할 수 있도록 도와준다.
/app
├── layout.tsx # 레이아웃 파일
├── [route1]
│ ├── layout.tsx # 특정 경로의 레이아웃 파일
│ ├── sidebar
│ │ └── page.tsx # 병렬 경로의 첫 번째 컴포넌트
│ └── content
│ └── page.tsx # 병렬 경로의 두 번째 컴포넌트
└── page.tsx # 기본 페이지
next/image 컴포넌트를 통해 이미지 최적화 기능을 제공함. 자동으로 이미지 크기 조정, 포맷 변경, Lazy Loading 등을 적용할 수 있어 성능을 향상시킴
import Image from 'next/image';
function HomePage() {
return (
<div>
<Image
src="/home.png"
alt="homepage-main-image"
width={500}
height={500}
/>
</div>
);
}
export default HomePage;
미들웨어는 middleware.js 파일에 정의하며, 페이지 또는 API 경로에 적용되고, 요청이 처리되기 전에 코드를 실행할 수 있다. 인증, 로깅, 리디렉션 등의 작업을 수행할 수 있음.
// middleware.js
import { NextResponse } from 'next/server';
export function middleware(req) {
if (req.nextUrl.pathname.startsWith('/admin')) {
// 인증 로직 추가
const authenticated = checkAuth(req);
if (!authenticated) {
return NextResponse.redirect('/login');
}
}
return NextResponse.next();
}
function checkAuth(req) {
// 인증 검증 로직
return true;
}
export const revalidate = 5; // 5초마다 바뀜(prod 모드)
export default async function Home() {
return (
<main>
<div>{Date.now()}</div>
</main>
}
export const dynamic = "force-dynamic"
import {cookies } from 'next/headers'
export default async function Home() {
cookies();
return (
<main>
<div>{Date.now()}</div>
</main>
}