Next.js/렌더링/Lesson 06
Server Actions — API 라우트 없이 mutation 직접 처리
40분·theory
이 챕터
3/5
TypeScript
Server Actions — API 라우트 없이 mutation 직접 처리
💡 왜 배워야 할까요? — '폼 제출 = API 라우트 + fetch + useState' 시대의 종말
🎯
Pages Router 시절 폼 한 개 만들기: `pages/api/posts.ts` 만들고, 클라이언트에서 `fetch('/api/posts', {method:'POST', body})` 하고, useState 로 로딩·에러 관리, 성공 시 router.refresh.
💼
Server Actions: 함수 1개 만들고 `
⚡
함수 내부에서 DB 직접 접근 OK (Server 코드라). 끝나면 `revalidatePath` 한 줄로 캐시 무효화.
🔗
JS 가 안 켜진 환경에서도 동작 — 그냥 표준 HTML form 으로 fallback 됨. Progressive Enhancement.
📈
React 19 의 `useActionState`·`useFormStatus` 가 폼 UX(로딩 표시·에러 표시) 를 hook 하나로 끝냄.
🏢 실무에서는
글 작성·댓글·좋아요·삭제 — 모든 mutation 이 Server Action 으로 단순해집니다. 이제 'POST API 라우트 만들기 → 클라이언트에서 fetch 호출 → loading state 관리 → optimistic update → revalidate' 라는 6단계가 '함수 하나 + form action' 으로 줄어듭니다.
'use server' · formAction · revalidatePath · useActionState
1. 'use server' 의 두 가지 위치
인라인은 짧을 때만. 보통 별도 파일로 분리.
2.
💡 💡 Server Actions 실전 5
1. mutation 후 무조건 revalidate
빼먹으면 "새 글 썼는데 안 보임" 1등 버그.
2. 인자 바인딩으로 id 전달
첫 인자에 id, 두 번째에 formData. hidden input 안 써도 됨.
3. useActionState 가 React 19 의 표준 (구 useFormState 대체)
구 useFormState (react-dom) 는 deprecated.
4. Server Action 안에서 redirect() 호출 OK
throw 처럼 흐름 종료 — 그 아래 코드 실행 안 됨.
5. 보안 — Server Action 도 입력 검증 필수
클라이언트에서 폼 검증해도 누군가 직접 POST 요청 보낼 수 있음. action 안에서 zod 같은 검증 한 번 더:
⚡ 직접 실행해보기 — Server Action 흐름 시뮬레이션
Server Action 의 폼 제출 → mutation → 캐시 무효화 흐름을 시뮬레이션합니다.
✏️ JS 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
⚠️ 브라우저 샌드박스에서 실행 — console.log()만 지원, alert/fetch 불가
확인 퀴즈
Server Action 안에서 mutation 후 `revalidatePath('/posts')` 를 호출하지 않으면?
먼저 읽으면 좋은 개념: 데이터 페칭 — fetch 캐시 정책 4가지