Next.js/レンダリング/Lesson 06
Server Actions — APIルートなしでmutationを直接処理する
40分·theory
このチャプター
3/5
TypeScript
Server Actions — APIルートなしでmutationを直接処理する
💡 なぜ学ぶのか? — 「フォーム送信 = APIルート + fetch + useState」時代の終焉
🎯
Pages Router 時代にフォームを一つ作る場合: `pages/api/posts.ts` を作成し、クライアントから `fetch('/api/posts', {method:'POST', body})` を呼び出し、useState でローディング・エラーを管理し、成功時に router.refresh を呼ぶ。
💼
Server Actions: 関数を一つ作って `
⚡
関数の内部から DB に直接アクセスできる(Server コードとして実行されるため)。完了後は `revalidatePath` の一行でキャッシュを無効化できる。
🔗
JavaScript が無効な環境でも動作する — 通常の HTML フォームとしてフォールバックされる。Progressive Enhancement。
📈
React 19 の `useActionState` と `useFormStatus` が、フォーム UX(ローディング表示・エラー表示)を一つのフックで完結させる。
🏢 실무에서는
記事の作成・コメント・いいね・削除 — あらゆる mutation が Server Action でシンプルになる。「POST API ルートを作る → クライアントから fetch を呼ぶ → loading state を管理する → optimistic update → revalidate」という 6 ステップが「関数一つ + form action」に集約される。
'use server' · formAction · revalidatePath · useActionState
1. 'use server' の2つの配置場所
インラインは短い場合のみ使用。通常は別ファイルに分離する。
2.
💡 💡 Server Actions 実践5選
1. mutation後は必ずrevalidateする
忘れると「投稿したのに表示されない」バグの第1位になります。
2. 引数バインディングでIDを渡す
第1引数にID、第2引数にformData。hidden inputは不要。
3. useActionStateはReact 19の標準(旧useFormStateの代替)
旧 useFormState(react-dom)はdeprecated。
4. Server Action内でredirect()を呼び出してもOK
throwのようにフローを終了させます — その後のコードは実行されません。
5. セキュリティ — Server Actionでも入力バリデーションは必須
クライアントでフォームをバリデーションしても、誰かが直接POSTリクエストを送れます。action内でzodなどを使って再度バリデーション:
⚡ 実際に試してみる — Server Actionフローのシミュレーション
Server Actionのフォーム送信 → mutation → キャッシュ無効化のフローをシミュレーションします。
✏️ JS 코드
📟 コンソール出力
▶ 実行ボタンを押してください
⚠️ ブラウザのサンドボックスで実行 — console.log()のみ対応、alert/fetchは不可
確認クイズ
Server Action内でmutationの後に `revalidatePath('/posts')` を呼び出さなかった場合、何が起きますか?
先に読むとよい概念: データフェッチ — fetch キャッシュポリシー4種