카테고리 없음

[Next.js] Next.js 15의 새로운 Form 컴포넌트 가이드

머지?는 병합입니다 2025. 1. 4. 23:51

 

기존 form 과의 주요 차이점 

 

로딩 UI의 프리페칭 가능 ( 화면 미리 불러오기 )
form 제출 시 부드럽게 페이지 전환 (깜빡임 없음) : 클라이언트 사이드 네비게이션

preventDefault()  기본 수행

쿼리 파라미터 를 name 속성에 맞춰 자동으로 붙여줌

 

 

기본 작성법

import Form from 'next/form'

function SearchForm() {
  return (
    <Form action="/search">
      <input 
        name="query" 
        placeholder="검색어를 입력하세요"
      />
      <button type="submit">검색</button>
    </Form>
  )
}

 

input name='query' 은 자동으로 쿼리 파라미터를 붙이는 기능입니다.

url이 이렇게 됩니다 ......./search?query='인풋에서 쓴 내용'

 


 

 

<Form> 컴포넌트의 동작은 액션 프로퍼티가 문자열인지 함수인지에 따라 달라집니다.

 

1.  액션이 문자열인 경우 <Form>은 GET 메서드를 사용하는 기본 HTML 양식처럼 동작합니다.

양식 데이터는 검색 매개변수로 URL에 인코딩되며, 양식이 제출되면 지정된 URL로 이동합니다.

 

  • 또한 Next.js: 양식이 표시될 때 경로를 미리 가져와 공유 UI(예: layout.js 및 loading.js)를
    미리 로드하여 탐색 속도를 높입니다.
  • 양식이 제출되면 전체 페이지를 다시 로드하는 대신 깜빡임 없는 부드럽게 페이지 전환 ( client-side navigation )
    을 하게 되며 공유 UI와 클라이언트 측 상태가 유지됩니다.

 

2.  액션이 함수(서버 액션)인 경우, <Form>은 폼이 제출될 때 액션을 실행하는 React 폼처럼 작동합니다.

 

 

 

 

action (string) Props

Prop 부가설명 Example Type Required
action ''  공란이면
지금화면 그대로
action="/search" string (URL or relative path) Yes
replace router puah 냐
replace 냐
replace={false} boolean -
scroll 화면 전환시 기존
스크롤 위치고정 여부
scroll={true} boolean -
prefetch ui 프리패치 여부 prefetch={true} boolean -

 

 

action (function) Props

Prop Example Type Required
action action={myAction} function (Server Action) Yes

 

액션이 함수인 경우 replace및 scroll props는 무시됩니다.

 

 

주의사항

 

1. formAction

// 예시 2: 게시글 작성 폼
<Form action="/posts/save">
  <input name="title" />
  <textarea name="content" />
  
  {/* 임시저장 */}
  <button type="submit" formAction="/posts/draft">
    임시저장
  </button>
  
  {/* 저장하기 */}
  <button type="submit">
    저장하기
  </button>
</Form>

 

  • <button> 또는 <input type="submit"> 에서 사용 가능
  • Form의 기본 action 속성을 개별적으로 덮어쓸 수 있음
  • 클라이언트 사이드 네비게이션은 지원하지만, 프리페칭(미리 데이터 가져오기)은 지원하지 않음
  • basePath를 사용할 경우 반드시 포함해야 함 (예: formAction="/base-path/search")

 

 

2. key

// ❌ 지원하지 않는 방식
<Form action="/search" key={searchId}>

// ✅ 대신 함수 action 사용 권장
<Form action={async () => {
  // 여기서 원하는 작업 수행
}}>

 

문자열 action에서는 key prop 지원하지 않음
재렌더링이나 데이터 변경이 필요한 경우 함수 action 사용 권장

 

 

3. onSubmit

// ⚠️ 주의: preventDefault() 사용 시
<Form 
  action="/search"
  onSubmit={(e) => {
    e.preventDefault() // Form의 클라이언트 사이드 네비게이션 기능이 작동하지 않게 됨
    // ...
  }}
>

 

폼 제출 시 로직을 추가할 수 있음
하지만 preventDefault()를 사용하면 Form 컴포넌트의 기본 네비게이션 기능이 작동하지 않으니 주의

( 페이지 전환이 발생하지 않음)


4. 지원하지 않는 속성들

// ❌ 지원하지 않는 속성들
<Form 
  method="POST"      // 지원 안됨
  encType="..."      // 지원 안됨
  target="_blank"    // 지원 안됨
>

// ✅ 이런 기능이 필요하다면 일반 HTML form 사용
<form method="POST" target="_blank">

 

 

5. 파일 입력

<Form action="/upload">
  <input type="file" name="document" />
  {/* 
    문자열 action 사용 시 파일 객체가 아닌 
    파일 이름만 전송됨
  */}
</Form>

 

공식 문서를 토대로 작성했습니다.

https://nextjs.org/docs/app/api-reference/components/form

 

Components: <Form> | Next.js

Learn how to use the `<Form>` component to handle form submissions and search params updates with client-side navigation.

nextjs.org