Next.js App Router를 처음 배우면 use client를 언제 사용해야 하는지 헷갈릴 수 있습니다.
결론부터 말하면, 브라우저에서 동작해야 하는 기능이 있을 때만 use client를 사용합니다.
Next.js App Router에서는 기본적으로 컴포넌트가 Server Component로 동작합니다. 따라서 모든 파일에 use client를 붙일 필요는 없습니다.
use client란?
use client는 파일 최상단에 작성합니다.
'use client';
export default function Button() {
return <button>클릭</button>;
}
이 코드는 Next.js에게 다음과 같이 알려줍니다.
이 컴포넌트는 브라우저에서 실행되어야 합니다.
즉, use client는 Server Component와 Client Component를 구분하는 기준입니다.
기본은 Server Component다
Next.js App Router에서는 use client를 붙이지 않으면 기본적으로 Server Component입니다.
export default function Page() {
return (
<main>
<h1>상품 상세 페이지</h1>
<p>상품 정보를 보여줍니다.</p>
</main>
);
}
이 컴포넌트는 단순히 화면만 보여줍니다.
상태 관리나 클릭 이벤트가 없기 때문에 use client가 필요하지 않습니다.
서버에서 데이터를 가져와 화면에 보여주는 경우도 보통 Server Component가 적합합니다.
export default async function PostsPage() {
const res = await fetch('https://example.com/api/posts');
const posts = await res.json();
return (
<main>
<h1>게시글 목록</h1>
{posts.map((post: any) => (
<p key={post.id}>{post.title}</p>
))}
</main>
);
}
use client가 필요한 경우
다음 기능을 사용한다면 use client가 필요합니다.
- useState
- useEffect
- onClick, onChange 같은 이벤트
- window, document, localStorage
- 브라우저에서만 동작하는 라이브러리
- 모달, 탭, 드롭다운, 슬라이더 같은 인터랙션 UI
예를 들어 클릭할 때 숫자가 증가하는 버튼은 Client Component로 만들어야 합니다.
'use client';
import { useState } from 'react';
export default function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
클릭 수: {count}
</button>
);
}
useState와 onClick은 브라우저에서 동작해야 하므로 use client가 필요합니다.
