서버 컴포넌트는 브라우저에 JS 코드가 전송되지 않고, 서버에서 실행된 결과(HTML)만 전달되는 컴포넌트
Page Router에서는 상호작용이 필요 없는 컴포넌트까지 JS 번들에 포함되기 때문에,
💡 이를 해결하기 위해서 나온것이 React Server Component입니다!
React Server Component는 서버에서 HTML로 렌더링되어 클라이언트에 전달되고, 클라이언트에는 상호작용이 필요한 컴포넌트만 JS 번들에 포함되어 전송됩니다.
React Hooks
나 이벤트 핸들러(onClick 등)
처럼 클라이언트에서 실행되어야 하는 코드는 사용할 수 없습니다.서버에서 실행될 때는 클라이언트 컴포넌트와 서버 컴포넌트 모두의 코드가 존재하지만, 브라우저에서 하이드레이션이 진행될 때는 클라이언트 컴포넌트의 코드만 존재하고, 서버 컴포넌트의 코드는 브라우저에 전달되지 않기 때문에 import할 수 없습니다.
즉, 브라우저 입장에서는 존재하지 않는 서버 컴포넌트를 불러오려는 셈이기 때문에 에러가 발생합니다.
이러한 문제를 방지하기 위해, Next.js는 클라이언트 컴포넌트에서 서버 컴포넌트를 import하면 자동으로 해당 서버 컴포넌트를 클라이언트 컴포넌트로 전환시켜 처리합니다.
💡 만약 정말 클라이언트 컴포넌트에서 서버 컴포넌트를 사용해야 한다면, 어떻게 해야 할까?
// 서버 컴포넌트 export default function ServerComponent() { console.log("서버컴포넌트!"); return <div></div>; }
// 클라이언트 컴포넌트 "use client"; import { ReactNode } from "react"; export default function ClientComponent({ children, }: { children: ReactNode; }) { console.log("클라이언트 컴포넌트!"); return <div>{children}</div>; }
// Home.tsx export default function Home() { return ( <div className={styles.page}> 인덱스 페이지 <ClientComponent> <ServerComponent /> </ClientComponent> </div> ); }
- 따라서, 이처럼 서버 컴포넌트를
children
으로 전달하면 문제 없이 사용할 수 있습니다.- 이 방식은 서버 컴포넌트 → 클라이언트 컴포넌트 흐름을 유지하면서 컴포넌트를 안전하게 구성하는 방법입니다.
💡 직렬화 (Serialization)
객체, 배열, 클래스 등의 복잡한 구조의 데이터를 네트워크 상으로 전송하기 위해 아주 단순한 형태(문자열, Byte)로 변환하는 것입니다.
함수는 직렬화가 불가능하기 때문에, 서버 컴포넌트에서 클라이언트 컴포넌트로 props로 전달할 수 없습니다.