# Next.js 16 の Server Actions【2026】ミューテーション・リバリデーション・面接質問 > Next.js 16 の Server Actions がミューテーション、リバリデーション、pending 状態、楽観的 UI、セキュリティをどう扱うか、そして各概念を試す面接質問を解説します。 - Published: 2026-06-24 - Updated: 2026-07-06 - Author: SharpSkill - Tags: next.js, server-actions, react, mutations, revalidation, interview - Reading time: 11 min --- Next.js の Server Actions は、素朴な非同期関数をサーバーサイドのミューテーションエンドポイントへと変え、フォームから直接呼び出せるようにします。API ルートも、クライアント側の `fetch` も、手動の JSON シリアライズも不要です。Next.js 16 ではデータミューテーションを記述する標準的な手段となっており、2026 年のシニア React 面接ではほぼ確実に登場します。本記事では、Server Actions がどのように実行されるのか、リバリデーションがどのように最新データを UI へ伝播させるのか、pending 状態やエラー状態をどうモデル化するのか、そして多くの開発者がつまずくセキュリティのルールを詳しく掘り下げます。 > **一文での定義** > > Server Action とは、`"use server"` が付与された非同期関数であり、サーバー上でのみ実行されます。クライアントコンポーネントやフォームから、あたかもローカル関数であるかのように呼び出せる一方で、Next.js がネットワークリクエスト、引数のシリアライズ、そして CSRF 対策を自動的に処理します。 ## Server Actions は内部でどう実行されるのか Server Action は、コンパイラが生成したエンドポイントを介してネットワーク越しに呼び出される、サーバー専用の関数です。関数に `"use server"` ディレクティブが付いている場合、Next.js のコンパイラはその本体をブラウザへ送信しません。代わりに、関数を軽量な参照へ置き換えます。ハッシュ化されたアクション ID を、生成された POST ルートに対応付けるのです。クライアントからアクションを呼び出すと、そのルートへリクエストが送られ、実際の関数はサーバー上で実行され、シリアライズされた結果が呼び出し元へストリーミングされて戻ります。 この設計には、プロダクションコードでも面接でも覚えておく価値のある帰結が三つあります。第一に、引数と戻り値はシリアライズ可能でなければなりません。エンコードされたペイロードとしてネットワークを越えるからです。第二に、関数本体がクライアント向けにバンドルされることはないため、シークレットはサーバー上に留まります。第三に、`
` に紐付けられたアクションはハイドレーション前でも動作します。これがプログレッシブエンハンスメントを中核的な利点とする理由です。実行モデルの全体像は、[データ更新に関する Next.js の公式ガイド](https://nextjs.org/docs/app/getting-started/updating-data) に記載されています。 すべての Server Action は、`"use server"` が付いたファイルまたはブロックの中に存在します。単一のミューテーションは次のようになります。 ```typescript // app/posts/actions.ts "use server" import { revalidatePath } from "next/cache" import { redirect } from "next/navigation" import { PostService } from "@/lib/services/post-service" export async function createPost(formData: FormData) { // FormData values arrive as strings; cast explicitly const title = formData.get("title") as string const body = formData.get("body") as string // Run business logic through the service layer, never the ORM directly const post = await PostService.create({ title, body }) // Purge the cached list so the next request refetches it revalidatePath("/posts") // Send the user to the freshly created resource redirect(`/posts/${post.id}`) } ``` この関数は送信された `FormData` を読み取り、サービス層を通じて永続化し、キャッシュされた一覧を無効化してリダイレクトします。これらのどれ一つとしてクライアント側の JavaScript を必要としません。 ## クライアント JavaScript なしで Server Action をフォームへ接続する アクションをフォームの `action` プロパティに渡すのが最もシンプルな統合方法です。Next.js は送信内容を `FormData` へシリアライズし、サーバー上で関数を呼び出します。これはネイティブのフォーム送信の仕組みを使うため、JavaScript が無効でも機能し、ページがハイドレーションされるとシームレスにアップグレードされます。 ```tsx // app/posts/new-post-form.tsx import { createPost } from "./actions" export default function NewPostForm() { return (