Next.js 13에서 소개된 App Router는 기존의 Pages Router를 대체하는 새로운 라우팅 시스템입니다. 이 글에서는 App Router의 주요 기능과 사용 방법에 대해 알아보겠습니다.
App Router 소개
App Router는 React 18의 새로운 기능들을 활용하여 더 효율적인 라우팅 시스템을 제공합니다. 특히 React Server Components를 기본적으로 지원하여 서버 사이드 렌더링과 클라이언트 사이드 렌더링을 더 효과적으로 조합할 수 있게 해줍니다.
폴더 기반 라우팅
App Router는 폴더 기반 라우팅 시스템을 사용합니다. 'app' 디렉토리 내에 폴더를 생성하면 해당 폴더 이름이 URL 경로가 됩니다.
app/
page.tsx // '/' 경로
about/
page.tsx // '/about' 경로
blog/
page.tsx // '/blog' 경로
[slug]/
page.tsx // '/blog/:slug' 경로
레이아웃
App Router에서는 레이아웃을 쉽게 구현할 수 있습니다. 'layout.tsx' 파일을 생성하면 해당 폴더와 그 하위 폴더의 모든 페이지에 레이아웃이 적용됩니다.
// app/layout.tsx
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en">
<body>
<header>헤더</header>
{children}
<footer>푸터</footer>
</body>
</html>
)
}
서버 컴포넌트
App Router에서는 모든 컴포넌트가 기본적으로 서버 컴포넌트입니다. 서버 컴포넌트는 서버에서 렌더링되어 클라이언트로 전송되므로, 클라이언트 측 JavaScript 번들 크기를 줄일 수 있습니다.
// 서버 컴포넌트 예시
export default async function Page() {
const data = await fetchData(); // 서버에서 직접 데이터를 가져올 수 있습니다.
return (
<div>
<h1>{data.title}</h1>
<p>{data.content}</p>
</div>
);
}
클라이언트 컴포넌트
클라이언트에서 실행되어야 하는 컴포넌트는 파일 상단에 'use client' 지시어를 추가하여 클라이언트 컴포넌트로 만들 수 있습니다.
'use client'
import { useState } from 'react';
export default function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}
데이터 페칭
App Router에서는 서버 컴포넌트에서 직접 데이터를 가져올 수 있습니다. 이를 통해 클라이언트 측 데이터 페칭의 복잡성을 줄일 수 있습니다.
// 서버 컴포넌트에서 데이터 페칭
export default async function Page() {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return (
<div>
<h1>{data.title}</h1>
<p>{data.content}</p>
</div>
);
}
로딩 상태와 에러 처리
App Router에서는 'loading.tsx'와 'error.tsx' 파일을 사용하여 로딩 상태와 에러 처리를 쉽게 구현할 수 있습니다.
// app/blog/loading.tsx
export default function Loading() {
return <div>로딩 중...</div>;
}
// app/blog/error.tsx
'use client'
export default function Error({
error,
reset,
}: {
error: Error;
reset: () => void;
}) {
return (
<div>
<h2>에러가 발생했습니다.</h2>
<p>{error.message}</p>
<button onClick={reset}>다시 시도</button>
</div>
);
}
결론
Next.js App Router는 React 18의 새로운 기능들을 활용하여 더 효율적인 라우팅 시스템을 제공합니다. 서버 컴포넌트, 레이아웃, 로딩 상태, 에러 처리 등 다양한 기능들을 통해 더 나은 사용자 경험을 제공할 수 있습니다. 이러한 기능들을 적극적으로 활용하여 더 나은 웹 애플리케이션을 만들어 보세요!