TechBridge

Server Component vs Client Component — 경계 이해가 전부다

← 목록으로

📋 실습 안내

✏️ CODE EDITOR (JSX)
▶ 실행 버튼을 눌러 코드를 테스트하세요.
👁️ 내 미리보기 내 코드 실행 결과
🎯 완성 미리보기 목표
위 에디터 코드를 수정해서 이 결과물과 똑같이 만들어보세요!
💡 TODO 주석을 채워서 위 결과물처럼 동작하게 만들어보세요
🤖 AI 선생님에게 질문하기 이번 강의 전용
  선생님이 답변 중이에요...
⚠️ 학습 관련 질문만 답변합니다. 관련 없는 질문은 자동으로 학습으로 유도됩니다.
Q1. Next.js App Router에서 컴포넌트의 기본 타입은?
💡 Next.js App Router에서는 `'use client'` 지시어가 없는 모든 컴포넌트가 기본적으로 Server Component입니다. 이는 기존 React(CRA)와 가장 큰 차이점입니다. Server Component는 서버에서 실행되어 HTML로 스트리밍되며, JavaScript 번들에 포함되지 않아 클라이언트로 전송되는 코드 양을 줄일 수 있습니다.
Q2. 다음 중 Server Component에서만 가능한 작업은?
💡 Server Component는 서버에서 실행되므로 데이터베이스에 직접 접근하거나 비밀 API 키를 사용해도 클라이언트에 노출되지 않습니다. 반면 이벤트 핸들러(onClick), React 훅(useState), 브라우저 API(localStorage, window)는 모두 브라우저에서만 실행 가능하므로 Client Component에서만 사용 가능합니다.
Q3. `'use client'` 지시어를 파일 최상단에 추가했을 때의 의미는?
💡 `'use client'`는 "이 파일부터 클라이언트 경계가 시작된다"는 의미입니다. 해당 컴포넌트뿐만 아니라 그 자식 컴포넌트들도 모두 클라이언트에서 실행됩니다. 이 경계 이하의 모든 코드는 JavaScript 번들에 포함되어 브라우저로 전송됩니다. 따라서 `'use client'`는 최대한 트리의 아래쪽(leaf 컴포넌트)에 배치하는 것이 성능에 유리합니다.
Q4. Client Component 안에 Server Component를 포함하고 싶을 때 올바른 패턴은?
💡 Client Component 안에 Server Component를 직접 import하면 그 Server Component가 Client Component로 변환됩니다. 이를 방지하려면 Composition 패턴을 사용합니다: Server Component를 `children` prop으로 Client Component에 전달합니다. `<ClientWrapper><ServerComponent /></ClientWrapper>` 형태로 사용하면, ClientWrapper는 Client이지만 그 children(Server Component)은 서버에서 렌더링됩니다.
Q5. 다음 코드에서 문제점은? `'use client'; import { db } from '@/lib/db'; export function UserList() { const users = db.users.findMany(); ... }`
💡 `'use client'`가 붙은 컴포넌트는 브라우저에서 실행되므로 서버 전용 모듈(Prisma, DB 연결 등)에 접근할 수 없습니다. 이 코드는 빌드 에러 또는 런타임 에러를 발생시킵니다. 올바른 방법은 데이터 패칭을 Server Component에서 처리한 후, 결과를 props로 Client Component에 전달하는 것입니다. `server-only` 패키지를 사용하면 클라이언트에서 실수로 import할 경우 명시적 에러를 발생시킬 수 있습니다.
🎉

퀴즈 통과!

점수: 0점 — 수고하셨습니다!

다음 강의로 →
😅

아쉽네요!

점수: 0점 — 70점 이상이 되어야 통과합니다.