1. Server Components란?
1.1 Server Components 개요
**Server Components(서버 컴포넌트)**는 서버에서 렌더링되고, 클라이언트에서 실행되지 않는 React 컴포넌트입니다. 기존 SSR(Server-Side Rendering), SSG(Static Site Generation) 방식과는 다르게 동작하며, 클라이언트에서 불필요한 JavaScript 번들 크기를 줄일 수 있습니다.
1.2 Server Components vs Client Components
특징Server ComponentsClient Components
실행 위치 | 서버에서 실행 | 브라우저에서 실행 |
번들 크기 | 번들에 포함되지 않음 | 브라우저로 전송됨 |
상태(State) | 불가능 | 가능 (useState, useEffect 사용 가능) |
이벤트 핸들링 | 직접 처리 불가 | 가능 (onClick, onChange 등) |
데이터 패칭 | 서버에서 직접 실행 가능 | useEffect 등으로 API 호출 필요 |
1.3 Server Components의 장점
✅ 빠른 페이지 로딩 속도: 클라이언트에서 실행되지 않기 때문에 JavaScript 번들 크기가 줄어듦
✅ 서버에서 직접 데이터 패칭 가능: API 호출 없이 서버에서 데이터를 가져와 클라이언트에 전달
✅ 보안 강화: 데이터베이스 연결, API 키 노출 방지 가능
2. Server Components의 동작 방식
Server Components는 클라이언트에서 실행되지 않으며, 서버에서 렌더링된 후 HTML과 함께 전송됩니다. 기본적인 동작 방식은 다음과 같습니다.
- 요청이 들어오면 서버에서 Server Components를 렌더링
- HTML로 변환하여 클라이언트로 전송
- 클라이언트에서는 추가적인 JavaScript 실행 없이 그대로 표시
// Server Component (클라이언트에서 실행되지 않음)
export default async function ServerComponent() {
const data = await fetch("https://api.example.com/data").then(res => res.json());
return
;
}
위 코드는 클라이언트에서 실행되지 않고, 서버에서 실행된 후 HTML로 전달됩니다.
3. Next.js에서 Server Components 활용하기
3.1 Next.js에서 기본 설정
Next.js에서는 서버 컴포넌트가 기본적으로 활성화되어 있습니다. app 디렉토리 안에서 작성된 모든 컴포넌트는 기본적으로 Server Components입니다.
프로젝트 설정:
npx create-next-app@latest my-app --experimental-app
cd my-app
npm install
npm run dev
3.2 Server Components 예제 (Next.js 14 기준)
(1) 서버에서 데이터 패칭하는 Server Component
// app/components/UserList.tsx
export default async function UserList() {
const users = await fetch("https://jsonplaceholder.typicode.com/users").then(res => res.json());
return (
- {users.map(user => (
- {user.name} ))}
);
}
✅ 클라이언트에서 API 호출 없이 서버에서 직접 데이터 패칭
(2) Server Component에서 Client Component 포함하기
// app/components/Button.tsx (Client Component)
"use client";
export default function Button({ onClick }: { onClick: () => void }) {
return <button onClick={onClick}>Click me</button>;
}
// app/page.tsx (Server Component)
import Button from "./components/Button";
export default function Page() {
return (
<div>
<h1>Server Component</h1>
<Button onClick={() => alert("클릭됨!")} />
</div>
);
}
✅ Server Component 내부에서 Client Component 사용 가능 ("use client" 선언 필요)
(3) 서버에서 데이터 처리 후 클라이언트로 전달하기
// app/components/ProductList.tsx
import ProductCard from "./ProductCard";
export default async function ProductList() {
const products = await fetch("https://api.example.com/products").then(res => res.json());
return (
);
}
✅ 서버에서 데이터를 가져와 클라이언트 컴포넌트로 전달 가능
4. Server Components의 한계와 고려사항
✅ 서버에서 실행되므로 상태(State)를 가질 수 없음 → useState, useEffect 사용 불가
✅ 이벤트 핸들링이 불가능 → 클릭, 입력 이벤트 등은 클라이언트 컴포넌트에서 처리해야 함
✅ SSR과 다른 개념 → Server Components는 클라이언트 번들을 줄이는 것이 목적이며, 단순 SSR과 다름
5. Server Components의 실무 적용 사례
✅ 대규모 데이터 조회 → 서버에서 데이터를 직접 가져와 렌더링하여 성능 최적화
✅ SEO 최적화 → 클라이언트에서 불필요한 JavaScript 실행 없이 완전한 HTML 제공
✅ 보안 강화 → API 키, 데이터베이스 연결 정보 등을 서버에서 처리하고 클라이언트에 노출하지 않음
결론
- Server Components는 클라이언트에서 불필요한 JavaScript 실행을 줄이고, 서버에서 렌더링을 최적화하는 기능입니다.
- Next.js와 결합하면 더욱 강력한 성능을 발휘하며, 데이터 패칭을 서버에서 직접 처리하여 클라이언트 부하를 줄일 수 있습니다.
- 실무에서 활용하면 SEO, 성능 최적화, 보안 강화 등의 장점을 극대화할 수 있습니다.
'개발이야기' 카테고리의 다른 글
크롬 134와 135 업데이트: 당신이 몰랐던 혁신적인 변화들! (1) | 2025.03.10 |
---|---|
웹팩보다 10배 빠른 Rspack, 도대체 뭐길래? (1) | 2025.03.07 |
순수 자바스크립트로 리액티브한 변수 만들기 (0) | 2025.02.14 |
Redux vs MobX vs Jotai vs Zustand 비교 (동작 방식 & 원리 차이점) (0) | 2025.02.14 |
React의 renderToString 실행 여부 감지 방법 (0) | 2025.02.14 |