데이터 변형을 위한 서버 동작
'use server' 함수를 정의해 양식 변형을 처리하고 revalidatePath로 캐시를 무효화합니다.
데이터 변형을 위한 서버 동작은(는) CoddyKit의 무료 React Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 React Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. React Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
Server Action이란 무엇인가요
Server Action은 'use server'로 표시되어 서버에서만 실행되는 비동기 함수입니다. API 경로 처리기를 직접 작성하지 않고도 폼 제출과 데이터 변경 작업을 처리할 수 있습니다.
Server Action 정의하기
함수의 맨 위에 'use server'를 추가하거나 파일의 맨 위에 추가하면 Server Action을 만들 수 있습니다. Server Component 또는 전용 actions.ts 파일에서만 정의할 수 있습니다.
// app/actions.ts
'use server';
import { revalidatePath } from 'next/cache';
import { redirect } from 'next/navigation';
export async function createPost(formData: FormData) {
const title = formData.get('title') as string;
await db.post.create({ data: { title } });
revalidatePath('/blog');
redirect('/blog');
}폼에서 Action 사용하기
Action 함수를 폼의 action 속성에 전달하시면 됩니다. onSubmit이나 이벤트 처리기가 필요하지 않습니다. Next.js가 폼을 직렬화하고 서버에서 Action을 호출합니다.
import { createPost } from './actions';
export default function NewPostForm() {
return (
<form action={createPost}>
<input name="title" placeholder="Post title" required />
<button type="submit">Create</button>
</form>
);
}useActionState 훅
useActionState(React 19)는 Action을 감싸서 보류 상태를 추적하고 Action의 반환값을 컴포넌트에서 받을 수 있게 합니다.
'use client';
import { useActionState } from 'react';
import { createPost } from './actions';
const initialState = { error: null };
export function PostForm() {
const [state, action, isPending] = useActionState(createPost, initialState);
return (
<form action={action}>
{state.error && <p className="error">{state.error}</p>}
<input name="title" />
<button disabled={isPending}>{isPending ? 'Creating...' : 'Create'}</button>
</form>
);
}검증 오류 반환하기
오류를 발생시키는 대신 Action에서 객체를 반환하면 useActionState를 통해 검증 오류를 폼으로 전달할 수 있습니다.
export async function createPost(prevState: any, formData: FormData) {
'use server';
const title = formData.get('title') as string;
if (!title || title.length < 3) {
return { error: 'Title must be at least 3 characters' };
}
await db.post.create({ data: { title } });
revalidatePath('/blog');
redirect('/blog');
}이벤트 처리기에서 Server Action 사용하기
폼 Action뿐 아니라 클라이언트 컴포넌트의 이벤트 처리기에서도 Server Action을 직접 가져와 호출할 수 있습니다.
'use client';
import { deletePost } from './actions';
export function DeleteButton({ id }: { id: string }) {
return (
<button onClick={() => deletePost(id)}>
Delete
</button>
);
}인라인 Server Action
Server Component 내부에서 함수 안에 'use server'를 넣어 Server Action을 인라인으로 정의할 수 있습니다. 변경 작업 로직을 사용하는 위치 가까이에 함께 둘 때 유용합니다.
export default function PostPage({ post }) {
async function updatePost(formData: FormData) {
'use server';
await db.post.update({ where: { id: post.id }, data: { title: formData.get('title') as string } });
revalidatePath(`/blog/${post.id}`);
}
return (
<form action={updatePost}>
<input name="title" defaultValue={post.title} />
<button type="submit">Save</button>
</form>
);
}Server Action과 useOptimistic 사용하기
Server Action과 useOptimistic을 함께 사용하면 Action이 백그라운드에서 실행되는 동안 사용자 인터페이스를 즉시 업데이트할 수 있습니다.
'use client';
import { useOptimistic } from 'react';
import { addItem } from './actions';
export function TodoList({ items }) {
const [optimisticItems, addOptimistic] = useOptimistic(items, (state, newItem) => [...state, newItem]);
return (
<form action={async (formData) => {
addOptimistic({ id: 'temp', text: formData.get('text') });
await addItem(formData);
}}>
<ul>{optimisticItems.map(i => <li key={i.id}>{i.text}</li>)}</ul>
<input name="text" /><button>Add</button>
</form>
);
}보안 고려 사항
Server Action은 내부적으로 POST 엔드포인트입니다. 항상 서버에서 입력을 검증하고 정제하며, 인증을 확인하고, CSRF 보호를 사용하셔야 합니다. 동일 출처 요청에 대해서는 Next.js가 이를 자동으로 처리합니다.
변경 작업 후 재검증하기
변경 작업 후 revalidatePath()나 revalidateTag()를 호출하면 관련 캐시가 지워져 다음 페이지 로드에 변경 사항이 반영됩니다.
빠른 확인
Next.js 앱 라우터에서 Server Action을 폼에 어떻게 전달합니까?
복습
Server Action은 서버에서 변경 작업을 처리하는 'use server' 비동기 함수입니다. action 속성을 통해 폼에 연결하고, useActionState로 상태를 추적하며, 검증에서는 오류를 발생시키는 대신 반환하고, 변경 작업 후에는 캐시를 재검증하시면 됩니다.
자주 묻는 질문
“데이터 변형을 위한 서버 동작” 강의는 무료인가요?
네 — “데이터 변형을 위한 서버 동작” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 React Academy 강의 전체를 잠금 해제할 수 있습니다. React Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“데이터 변형을 위한 서버 동작”에서 뭘 배우나요?
'use server' 함수를 정의해 양식 변형을 처리하고 revalidatePath로 캐시를 무효화합니다. 브라우저에서 직접 실행하는 실습 코드로 React Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
React Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 React Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“데이터 변형을 위한 서버 동작” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 React Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 React Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.