App Router 타입과 서버·클라이언트 컴포넌트
App Router의 기본값(서버 컴포넌트)을 이해하고, 클라이언트 컴포넌트를 선택해야 하는 경우와 경로 처리기의 타입을 지정하는 방법을 배웁니다.
App Router 타입과 서버·클라이언트 컴포넌트은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 3개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 3개의 강의가 포함되어 있습니다.
소개
목표: 앱 라우터를 TypeScript와 함께 자신 있게 사용합니다. 기본값인 서버 컴포넌트를 살펴보고, 필요할 때 클라이언트 컴포넌트를 선택하며, API 엔드포인트용 라우트 핸들러에 타입을 지정합니다.
- 서버와 클라이언트의 기능 차이
- 둘 사이에 타입이 지정된 속성 전달하기
- 타입이 지정된 NextRequest/NextResponse
서버 컴포넌트
app/ 아래의 파일은 기본적으로 서버 컴포넌트입니다. 서버 전용 코드를 실행하고 렌더링 전에 데이터를 가져올 수 있습니다.
// app/page.tsx (server component by default)
export default async function Page() {
// Server code: read env, fetch data, call DB (conceptually)
const data: { message: string } = { message: "Hello from server component" }
return (
<main style={{ display: "grid", gap: 8 }}>
<h1>Home</h1>
<p>{data.message}</p>
</main>
)
}클라이언트 컴포넌트
상단에 "use client" 지시문을 추가하면 훅과 이벤트 핸들러를 사용할 수 있습니다. 클라이언트 컴포넌트는 브라우저에서 실행됩니다.
"use client"
import { useState } from "react"
// app/components/Counter.tsx (client component)
export default function Counter() {
const [n, setN] = useState(0)
return (
<div style={{ display: "flex", gap: 8, alignItems: "center" }}>
<button onClick={() => setN(n - 1)}>-</button>
<span>{n}</span>
<button onClick={() => setN(n + 1)}>+</button>
</div>
)
}서버 → 클라이언트 속성
서버에서 데이터를 계산한 뒤 타입이 지정된 속성으로 클라이언트 컴포넌트에 전달하십시오. 서버 전용 로직은 클라이언트에서 실행되지 않도록 하십시오.
// app/page.tsx (server) + client import
import Counter from "./components/Counter"
export default async function Page() {
const initial = 5 // fetched or computed on the server
return (
<main style={{ display: "grid", gap: 12 }}>
<h2>Dashboard</h2>
<CounterWithStart start={initial} />
</main>
)
}
// app/components/CounterWithStart.tsx
"use client"
import { useState } from "react"
export default function CounterWithStart({ start }: { start: number }) {
const [n, setN] = useState(start)
return (
<div style={{ display: "flex", gap: 8, alignItems: "center" }}>
<button onClick={() => setN(n - 1)}>-</button>
<span>{n}</span>
<button onClick={() => setN(n + 1)}>+</button>
</div>
)
}라우트 핸들러
app/api/*/route.ts 아래의 타입이 지정된 핸들러에는 NextRequest/NextResponse를 사용하십시오. 상태 코드와 함께 JSON을 반환하십시오.
// app/api/hello/route.ts (App Router API)
import { NextRequest, NextResponse } from "next/server"
export async function GET(req: NextRequest) {
const name = req.nextUrl.searchParams.get("name") ?? "world"
const body: { message: string } = { message: `Hello, ${name}!` }
return NextResponse.json(body, { status: 200 })
}
export async function POST(req: NextRequest) {
const payload = (await req.json()) as { name?: string }
const body = { created: true, name: payload.name ?? "anon" }
return NextResponse.json(body, { status: 201 })
}팁
팁:
- 상호작용이 필요한 경우에만 클라이언트를 선택하고, 기본값으로 서버 컴포넌트를 사용하십시오.
- 서버와 클라이언트 사이에 전달하는 속성은 작고 직렬화할 수 있는 형태로 유지하십시오.
- 타입이 지정된
NextResponse.json형식을 일관되게 사용하십시오.
앱 라우터 클라이언트 확인
빠른 확인: 앱 라우터의 컴포넌트 파일에서 훅을 활성화하려면 어떻게 해야 합니까?
요약
요약: 앱 라우터는 기본적으로 서버 컴포넌트를 사용합니다. 상호작용을 위해 "use client"를 추가하고, 경계를 넘어 타입이 지정된 속성을 전달하며, NextRequest/NextResponse로 라우트 핸들러에 타입을 지정하십시오.
자주 묻는 질문
“App Router 타입과 서버·클라이언트 컴포넌트” 강의는 무료인가요?
네 — “App Router 타입과 서버·클라이언트 컴포넌트” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 3개의 강의가 포함되어 있습니다.
“App Router 타입과 서버·클라이언트 컴포넌트”에서 뭘 배우나요?
App Router의 기본값(서버 컴포넌트)을 이해하고, 클라이언트 컴포넌트를 선택해야 하는 경우와 경로 처리기의 타입을 지정하는 방법을 배웁니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 3개 중 1번째 강의입니다.
“App Router 타입과 서버·클라이언트 컴포넌트” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- App Router 타입과 서버·클라이언트 컴포넌트
- 데이터 가져오기와 액션 타이핑
- 환경 변수 타이핑과 구성