
👉 Next.js 13+에서 추가된 핵심 기능으로,
👉 클라이언트 → 서버 데이터 변경(Mutation)을 단순하게 처리할 수 있다.
기존에는 데이터 변경을 위해 API Route를 따로 만들어야 했지만,
Server Actions를 사용하면 컴포넌트에서 직접 서버 로직을 실행할 수 있다.
Server Action은 서버에서 실행되는 함수로,
주로 데이터 생성 / 수정 / 삭제 (Mutation) 작업을 담당한다.
정리하면 다음과 같이 역할이 나뉜다.
👉 즉, Server Action은 Next.js에서 Mutation을 담당하는 표준 방식이라고 볼 수 있다.
기존 방식:
Server Actions:
👉 API 없이 서버 함수 직접 실행
이 구조 덕분에
👉 결과적으로, 구현해야 할 구조 자체가 단순해진다.
'use server';
export async function createPost(formData: FormData) {
const title = formData.get('title');
await db.post.create({
data: { title },
});
}
import { createPost } from './actions';
export default function Page() {
return (
<form action={createPost}>
<input name="title" />
<button type="submit">Submit</button>
</form>
);
}
action에 함수 직접 연결👉 기존 fetch + API 구조보다 훨씬 직관적이다.
Client Component에서도 Server Action을 사용할 수 있다.
'use client';
import { createPost } from './actions';
export default function Button() {
return (
<button onClick={() => createPost()}>
생성하기
</button>
);
}
👉 단순 함수 호출처럼 보여도 실제로는 서버 통신이다.
Mutation 이후에는 기존 데이터가 stale 상태가 되기 때문에
캐시를 갱신해야 한다.
'use server';
import { revalidatePath } from 'next/cache';
export async function createPost(formData: FormData) {
await db.post.create({
data: { title: formData.get('title') },
});
revalidatePath('/posts');
}
👉 이걸 놓치면 "데이터는 바뀌었는데 화면은 안 바뀌는" 문제가 생긴다.
| 구분 | 기존 방식 | Server Actions |
|---|---|---|
| 데이터 변경 | API Route 필요 | 필요 없음 |
| 코드 구조 | 클라이언트 + API 분리 | 한 곳에서 처리 |
| 복잡도 | 상대적으로 높음 | 단순함 |
복잡한 비즈니스 로직은 여전히 분리하는 것이 좋다
서버 로직이 컴포넌트와 가까워지면서 구조가 섞일 수 있다
→ 규모가 커지면 레이어 분리가 필요하다
내부적으로는 네트워크 요청이 발생한다
👉 즉, Server Action은 편리하지만 모든 상황에서 사용하는 것이 아니라
단순한 Mutation이나 빠른 구현이 필요한 경우에 더 적합하다.
Server Action은 Next.js에서 데이터 변경(Mutation) 흐름을 단순화해주는 기능이며,
API 없이도 서버 로직을 직접 처리할 수 있게 해준다.