Next.js에서 언제 어떤 컴포넌트를 서버/클라이언트로 사용해야 하는지 이해하는 게 중요하다.
기본적으로 Next.js는 서버 컴포넌트 기반으로 동작한다.
하지만 useState
, useEffect
, usePathname
같은 React 훅을 사용하는 순간,
해당 컴포넌트는 클라이언트 컴포넌트로 전환되어야 하며, 이때는 use client
지시어를 지정해야 한다.
❗️ 문제는 ? 서버 컴포넌트 안에서 훅 하나 때문에 전체가 클라이언트 컴포넌트로 변하면, 서버 렌더링의 장점이 사라진다.
그래서 정말 필요한 부분만 클라이언트 컴포넌트로 분리해서 아웃소싱하는 것이 좋다.
<NavLink href="/news">News</NavLink>
// components/NavLink.js
'use client';
import Link from "next/link";
import { usePathname } from "next/navigation";
export default function NavLink({ href, children }) {
const path = usePathname();
return (
<Link
href={href}
className={path.startsWith(href) ? "active" : undefined}
>
{children}
</Link>
);
}
이렇게 NavLink
만 클라이언트로 분리해서 서버 컴포넌트에서 가져다 쓰면,
전체 서버 렌더링 구조는 유지하면서도 동적인 UI만 클라이언트로 처리할 수 있다.
app/error.js
는 서버에서 발생한 에러뿐 아니라 클라이언트 상호작용 중 발생한 에러까지 처리해야 하므로 클라이너트 컴포넌트로 만들어야 한다.
use client
로 분리하자.