Next.js/レンダリング/Lesson 04
Server Component — DB 直接アクセス、0KB クライアントバンドル
40分·theory
このチャプター
1/5
TypeScript
Server Component — DB 直接アクセス、0KB クライアントバンドル
💡 なぜ学ぶ必要があるのか? — 「サーバーで完結して HTML だけ送る」がデフォルト
🎯
Server Component の関数自体は**クライアントバンドルに含まれません** — レンダリングされた HTML のみが送信されます。ページの重さが劇的に削減されます。
💼
DB・ファイルシステム・環境変数に直接アクセスできます。ブラウザには一切漏れないため、API キーやシークレットを安全に使用できます。
⚡
同一レンダリング内の `fetch` は自動的に重複排除・キャッシュされます — 同じ URL が複数回呼ばれても、実際のネットワークリクエストは 1 回だけです。
🔗
Pages Router の `getServerSideProps`・`getStaticProps`・`SWR` といったデータ取得の抽象化がすべて不要になります。シンプルに `await fetch()` を使うだけです。
📈
デメリット: `useState`・`onClick`・`useEffect` などのブラウザフックは使用できません。それらは Client Component の領域です。
🏢 실무에서는
codemaster40 の `src/app/study/[category]/page.tsx` も Server Component である可能性が高いです。学習データの JSON をサーバーで読み込んでそのまま HTML としてレンダリングするため初期ロードが速く、クライアントに送られる JS はインタラクティブな部分(`useState` を持つコンポーネント)のみです。
Server vs Client — 境界とルール
1. デフォルトは Server Component
ファイルの先頭に 'use client' がなければ、自動的に Server Component になります。
2. Server Component の機能
3. fetch の自動重複排除 + キャッシング
同じレンダリング内で複数のコンポーネントが同じ URL を呼び出しても、実際の fetch は一度だけ実行されます:
キャッシュポリシー:
4. Server → Client の境界
- ▸Server が Client を import して組み込むのは OK。
- ▸Client が Server を import して直接組み込むのは ❌ (ブラウザから DB を呼び出せないため)。
- ▸ただし、Server Component を
childrenとして Client Component に渡すのは OK (コンポジション)。
💡 💡 Server Component 実践 Tips 5 選
1. async コンポーネントは Server のみClient に async を付けるとビルドエラーになります。データ取得は Server で行い、結果を props として Client に渡してください。
2. 「use client」は上位に伝染しないServer が Client を import しても、親は依然として Server のままです。境界は明確です。
3. Client → Server の import は不可Client Component が Server Component を import して直接組み込むとビルドエラーになります。代わりに children で渡してください:
4. fetch キャッシュモード 4 種類
5. 環境変数 — Server はすべて参照可、Client は NEXT_PUBLIC_ のみ
Server Component に埋め込んだシークレットはブラウザに漏れません。
⚡ 実際に試してみよう — Server/Client 境界シミュレーション
各コンポーネントがどこで実行されるか、fetch がどこで発生するかをシミュレーションします。
✏️ JS 코드
📟 コンソール出力
▶ 実行ボタンを押してください
⚠️ ブラウザのサンドボックスで実行 — console.log()のみ対応、alert/fetchは不可
確認クイズ
App Router において、Client Component が Server Component を直接 `import` して JSX として組み込むとどうなりますか?
先に読むとよい概念: ファイル規約 — loading / error / not-found
次のおすすめ: データフェッチ — fetch キャッシュポリシー4種