Next.js 14 - Server Action

2025. 9. 17. 13:25·♣️ Next.js 14

Next.js 14

 

✅ Server Action이란?


Next.js App Router에서 도입된 기능

클라이언트 이벤트(폼 제출, 버튼 클릭 등)로 트리거되지만 실제 실행은 서버에서 처리되는 함수

 

기존에는 클라이언트 → API Route → 서버 로직 호출 → 응답 → 클라이언트 반영 순서를 거쳐야 했는데, Server Action 덕분에 API Route를 별도로 만들지 않고도 서버 로직을 직접 함수 형태로 작성할 수 있게 됨.

 

export default function LogIn() {
  const handleForm = async (formData: FormData) => {
    "use server";
    console.log(formData.get("email"), formData.get("password"));
    console.log("i run in the server baby!!!");
  };

 

이렇게 inline으로도 server action을 만들 수 있지만, 해당 inline server action이 "use client"가 포함 되어 있는 파일에 같이 존재할 수 없다. ("use client"가 적혀있으면 해당 파일에 "use server"가 또 존재할 수 없다.)

 

그래서 밑처럼 별도의 파일로 분리하여 import해서 사용하면 된다.

 

Example


 

app/login/actions.ts

"use server";

export const handleForm = async (prevState: any, formData: FormData) => {
  console.log(prevState);
  await new Promise((resolve) => setTimeout(resolve, 5000));
  return {
    errors: ["wrong password", "password too short"],
  };
};

 

app/login/page.tsx

"use client";

import FormButton from "@/components/form-btn";
import FormInput from "@/components/form-input";
import SocialLogin from "@/components/social-login";
import { useFormState } from "react-dom";
import { handleForm } from "./actions";

export default function LogIn() {
  const [state, action] = useFormState(handleForm, null);
  return (
    <div className="flex flex-col gap-10 px-6 py-8">
      <div className="flex flex-col gap-2 *:font-medium">
        <h1 className="text-2xl">안녕하세요!</h1>
        <h2 className="text-xl">Log in with email and password.</h2>
      </div>
      <form action={action} className="flex flex-col gap-3">
        <FormInput
          name="email"
          type="email"
          placeholder="Email"
          required
          errors={[]}
        />
        <FormInput
          name="password"
          type="password"
          placeholder="Password"
          required
          errors={state?.errors ?? []}
        />
        <FormButton text="Log in" />
      </form>
      <SocialLogin />
    </div>
  );
}

 

Next.js 12나 단순 React.js는 input의 name에 신경 쓰지 않았다.

onChange나 onSubmit을 사용하였기 때문

 

Server Action에서는 input 요소의 name이 굉장히 중요하다. (name 속성이 있어야 데이터를 받을 수 있기 때문)

const handleForm = async(formData: FormData) => {
	"use server";
    console.log(formData.get("email"), formData.get("password"));
};

 

(email과 password라는 name 속성을 가진 input의 데이터를 가져옴)

'♣️ Next.js 14' 카테고리의 다른 글

Next.js 14 - Middleware, Matcher  (0) 2025.12.03
Next.js 14 - useFormState(useActionState)  (0) 2025.09.17
Next.js 14 - useFormStatus  (0) 2025.09.17
Next.js 14 - api route  (0) 2025.09.17
Next.js 14 - 시작하기  (0) 2025.09.02
'♣️ Next.js 14' 카테고리의 다른 글
  • Next.js 14 - useFormState(useActionState)
  • Next.js 14 - useFormStatus
  • Next.js 14 - api route
  • Next.js 14 - 시작하기
j2yonghwa
j2yonghwa
Trying to be a fullstack developer 🚀
  • j2yonghwa
    j2yonghwa
    j2yonghwa
  • 전체
    오늘
    어제
    • 분류 전체보기 (156)
      • ⏰ Daily WakaTime (1)
      • 🏖️ 노마드코더 (2)
      • 🍺 Dev Setup (3)
      • 🔭 Tech Info (1)
      • 🚫 Error (1)
      • 📂 라이브러리 (23)
      • ♣️ Next.js 14 (10)
      • ♠️ Next.js 12 (20)
      • 🛸 React Native (12)
      • 🦋 TypeScript (1)
      • 🐍 Python (2)
      • 🌊 TailwindCSS (4)
      • 🧩 SQL (25)
      • 💎 Prisma (5)
      • 🌱 MongoDB (4)
      • 🎯 Redis (1)
      • 🧬 GraphQL (2)
      • 🔥 Firebase (7)
      • 💸 Third-Party Services (2)
      • 🕸️ Web (1)
      • 🏆 코딩테스트 (23)
      • 📙 모딥다 (5)
      • 📗 코테 합격자 되기 -JS- (0)
      • 📘 클린코드 (0)
      • 🍯 꿀팁 🐝 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃헙
  • 공지사항

  • 인기 글

  • 태그

    mongoDB
    MySQL
    Prisma
    next.js 12
    SQL
    React Native
    Python
    react router
    Firebase
    next.js 14
    모딥다
    라이브러리
    0레벨
    자바스크립트
    코딩테스트 입문
    PostgreSQL
    dev setup
    tailwindcss
    Next.js
    API
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
j2yonghwa
Next.js 14 - Server Action
상단으로

티스토리툴바