# Next.js 16 Server Actions 2026: 뮤테이션, 무효화 그리고 면접 질문 > Next.js 16 Server Action이 뮤테이션, 무효화, 대기 상태, 낙관적 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 Action은 평범한 async 함수를 폼이 직접 호출할 수 있는 서버 측 뮤테이션 엔드포인트로 바꿔 줍니다. API 라우트도, 클라이언트 `fetch`도, 수동 JSON 직렬화도 필요하지 않습니다. Next.js 16에서 Server Action은 데이터 뮤테이션을 작성하는 기본 방식이며, 2026년 시니어 React 면접에서는 거의 빠짐없이 등장합니다. 이 심층 분석에서는 Server Action이 어떻게 실행되는지, 무효화가 어떻게 최신 데이터를 UI로 전파하는지, 대기 및 오류 상태를 어떻게 모델링하는지, 그리고 대부분의 개발자가 걸려 넘어지는 보안 규칙까지 짚어 봅니다. > **한 문장 정의** > > Server Action은 `"use server"`로 표시된 async 함수로, 서버에서만 실행되며 클라이언트 컴포넌트나 폼에서 마치 로컬 함수처럼 호출할 수 있습니다. 그 사이 Next.js가 네트워크 요청, 인자 직렬화, CSRF 보호를 자동으로 처리합니다. ## Server Action이 내부적으로 실행되는 방식 Server Action은 컴파일러가 생성한 엔드포인트를 통해 네트워크로 호출되는 서버 전용 함수입니다. 함수에 `"use server"` 지시어가 붙으면 Next.js 컴파일러는 그 본문을 절대 브라우저로 보내지 않습니다. 대신 함수를 가벼운 참조로 대체합니다. 해시된 액션 ID가 생성된 POST 라우트에 매핑되는 방식입니다. 클라이언트에서 액션을 호출하면 해당 라우트로 요청이 전송되고, 실제 함수는 서버에서 실행되며, 직렬화된 결과가 호출자에게 다시 스트리밍됩니다. 이 설계에는 프로덕션 코드와 면접 양쪽에서 기억해 둘 만한 세 가지 결과가 따릅니다. 첫째, 인자와 반환값은 인코딩된 페이로드로 네트워크를 건너가므로 반드시 직렬화 가능해야 합니다. 둘째, 함수 본문은 클라이언트용으로 번들되지 않으므로 비밀 값은 서버에 남습니다. 셋째, `
`에 연결된 액션은 하이드레이션 이전에도 동작하며, 이것이 점진적 향상(progressive enhancement)이 핵심 강점으로 꼽히는 이유입니다. [데이터 업데이트에 관한 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` prop에 전달하는 것이 가장 단순한 연결 방식입니다. Next.js는 제출 내용을 `FormData`로 직렬화하여 서버에서 함수를 호출합니다. 이 방식은 네이티브 폼 제출 메커니즘을 사용하므로 JavaScript가 비활성화된 상태에서도 동작하고, 페이지가 하이드레이션되면 자연스럽게 향상됩니다. ```tsx // app/posts/new-post-form.tsx import { createPost } from "./actions" export default function NewPostForm() { return (