Server Actions

서버 액션 처리 흐름

서버 액션은 클라이언트 API route를 따로 만들지 않고도 mutation을 서버에서 처리하게 해 준다. 권한, 검증, revalidation을 같은 경계에 둬야 안전하다.

01

입력을 서버에서 다시 검증한다

클라이언트 검증은 UX일 뿐이고, 실제 권한과 schema 검사는 서버 액션 안에서 반복해야 한다.

02

변경과 무효화를 붙인다

DB update 뒤 관련 목록과 상세 캐시를 revalidatePath 또는 revalidateTag로 갱신한다.

03

결과 경험 설계

성공 후 redirect, toast, optimistic update 중 사용자가 기대하는 피드백을 정한다.

use server
서버 실행 선언 함수가 서버에서 실행되어 비밀 값과 DB 접근을 처리할 수 있다.
클라이언트 신뢰 금지.
FormData
폼 입력 HTML form과 잘 맞지만 타입 변환과 schema 검증이 필요하다.
빈 문자열과 누락값을 구분한다.
revalidate
화면 갱신 mutation 후 오래된 서버 캐시를 무효화한다.
관련 경로를 빠뜨리지 않는다.
pending
제출 중 상태 사용자가 중복 제출하지 않도록 버튼 상태와 피드백을 제공한다.
client helper가 필요할 수 있다.

권한 · 검증 · 무효화 점검

권한 서버 액션 안에서 현재 사용자의 권한을 다시 확인하는가.
검증 FormData를 그대로 DB에 넣지 않고 schema로 검증하는가.
무효화 변경된 데이터를 드러내는 모든 route/tag를 갱신하는가.

액션 골격

'use server';

export async function updatePost(formData: FormData) {
  const input = parsePost(formData);
  await savePost(input);
  revalidateTag('posts');
}