[React] 왜 React에서는 form submit을 기본으로 두면 안 될까?

2025. 4. 29. 11:03·Programming/React
728x90
반응형

 

이 글은 Udemy의 【한글자막】 React 완벽 가이드 2025 with React Router & Redux 를 수강하고 정리한 내용입니다.

 

HTML에서 <form> 태그는 원래 서버로 데이터를 보내기 위한 용도다

HTML에서 <form> 태그는 **서버로 데이터를 제출(submit)**하고, 새로운 페이지를 받아오기 위한 구조로 설계됐다. 폼 안에서 버튼을 누르면 브라우저는 기본적으로 다음과 같은 흐름으로 동작한다:

🔁 브라우저 기본 동작

  1. 버튼 클릭 → 폼 제출 (submit 이벤트 발생)
  2. 입력값을 포함해서 서버로 HTTP 요청 전송
  3. 서버가 요청을 처리하고 새로운 HTML 페이지를 응답
  4. 전체 페이지가 새로고침되면서 새 화면이 열린다

🎈 왜 이렇게 설계됐을까? (→ SSR 기반 구조)

이 흐름은 웹 초창기부터 사용되던 전통적인 방식이다.

즉, SSR(Server-Side Rendering) 구조에 최적화되어 있었다.

✅ SSR(Server-Side Rendering) 방식이란?

  • 모든 HTML 페이지를 서버에서 렌더링해서 생성하고
  • 사용자의 요청마다 서버가 새 페이지를 보내주는 구조
  • 폼 제출도 서버로 요청 → 서버가 새 HTML을 만들어서 응답 → 전체 페이지 교체

👉 그래서 폼 제출 시 전체 페이지 새로고침은 자연스러운 동작이었다.


⚠️ 그런데, 리액트에서는 문제가 된다 (→ CSR과 충돌)

리액트 같은 프론트엔드 프레임워크는 대부분 CSR(Client-Side Rendering) 방식을 사용한다.

✅ CSR(Client-Side Rendering) 방식이란?

  • 처음 로딩 시 HTML 한 번만 받아오고, 이후부터는
  • 브라우저 안에서 자바스크립트가 동적으로 화면을 그린다
  • 페이지 전환이나 상태 변경이 새로고침 없이 빠르게 이루어진다

그런데 <form> 제출 시 브라우저 기본 동작을 막지 않으면?

  • 전체 페이지가 새로고침되고
  • 리액트가 관리하던 모든 상태(state)가 초기화된다
  • 예상하지 않은 서버 요청이 발생해서 의도한 흐름이 깨질 수 있다

👉 CSR의 장점이 완전히 사라져버린다.


🛠️ React에서 폼 제출 시 주의할 점

CSR 기반 앱에서는 폼 제출의 기본 동작을 제어해야 한다.

주로 아래 3가지 방법을 사용한다.

1️⃣ 버튼에 type="button"을 명시하기

HTML에서는 <button>의 기본 type이 submit이다.

따라서 폼 안의 버튼은 기본적으로 폼 제출을 유발한다.

만약 단순한 클릭 이벤트만 처리하고 싶다면,

type="button"을 명시해서 제출을 막아야 한다.

<form>
  <button type="button">로그인</button> {/* 이 버튼은 form 제출 안 함 */}
</form>

참고: type="button"은 "폼 제출이 아닌 버튼"임을 명시하는 것이지, 이미 발생한 submit 이벤트를 막는 것은 아니다.

 


2️⃣ onSubmit 핸들러에서 preventDefault() 호출하기

폼 제출을 직접 다룰 경우에는,

onSubmit 이벤트 핸들러를 등록하고 preventDefault()를 호출해야 한다.

function handleSubmit(e) {
  e.preventDefault(); // ✅ HTTP 요청과 새로고침 방지
  // 여기에 로그인 처리 로직 작성
}

<form onSubmit={handleSubmit}>
  <button type="submit">로그인</button>
</form>

이 방법은, 폼 자체를 유지하면서 제출 흐름만 제어하고 싶을 때 유용하다.

(예: 로그인, 회원가입 API 요청 보내기 등)


3️⃣ (React 19 이상) formAction 속성 사용하기

React 19부터는 폼 제출을 더 선언적으로 처리할 수 있는

formAction 속성이 새롭게 도입되었다.

<form>
  <button formAction={handleLogin}>로그인</button>
</form>

  • formAction은 버튼 클릭 시 지정된 함수가 호출된다.
  • 특히 **서버 액션(Server Actions)**과 함께 사용할 때 강력하다.
  • 클라이언트 액션에서도 사용할 수 있지만,
  • 주로 React Server Components 환경에서 많이 활용된다.

참고: formAction은 React 19 이상에서만 사용할 수 있다.

아직은 전통적인 onSubmit + preventDefault() 패턴이 더 보편적이다.


🧩 참고: CSR vs SSR 한눈에 정리

구분 CSR (Client-Side Rendering) SSR (Server-Side Rendering)

렌더링 위치 브라우저(클라이언트) 서버
최초 로딩 속도 느릴 수 있음 (JS 다운로드 필요) 빠름 (HTML 바로 렌더링)
화면 전환 속도 빠름 (새로고침 없이 변경) 느림 (매번 서버 요청)
사용 예시 React, Vue, Next.js (CSR모드) 전통적인 서버 웹사이트, Next.js(SSR모드)

 

 

 

 


도움이 되셨다면 ❤️ 좋아요와 댓글로 피드백 주세요!

궁금한 점이 있다면 언제든지 질문 환영입니다 😄

지금까지 읽어주셔서 감사합니다!

반응형

'Programming > React' 카테고리의 다른 글

[React] React 19에서의 폼 처리 방식: Form Action, useActionState, useFormStatus, useOptimistic  (1) 2025.05.02
[React] React에서 폼(form) 다루기 :: 추출, 유효성검증, 초기화, 제출  (0) 2025.04.29
[React] 리액트 컴포넌트 스타일링  (1) 2025.04.23
[React] Tailwind 사용하여 스타일링 하기  (0) 2025.04.23
[React] Styled Components 사용하기  (0) 2025.04.23
'Programming/React' 카테고리의 다른 글
  • [React] React 19에서의 폼 처리 방식: Form Action, useActionState, useFormStatus, useOptimistic
  • [React] React에서 폼(form) 다루기 :: 추출, 유효성검증, 초기화, 제출
  • [React] 리액트 컴포넌트 스타일링
  • [React] Tailwind 사용하여 스타일링 하기
제가안난데여♪(´ε`*)
제가안난데여♪(´ε`*)
기억의 유한함을 기록의 무한함으로 ✍️ 예비 개발자가 꿈꾸는 공간 여기는 안나의 개발 블로그 💻
  • 제가안난데여♪(´ε`*)
    안나의 전두엽 어딘가 🧠
    제가안난데여♪(´ε`*)
    기억의 유한함을 기록의 무한함으로 ✍️ 예비 개발자가 꿈꾸는 공간 여기는 안나의 개발 블로그 💻
  • 전체
    오늘
    어제
    • 분류 전체보기 (128)
      • 간단하게 한스푼🥄 (1)
      • Programming (56)
        • Spring (16)
        • Vue.js (6)
        • Deep Learning (3)
        • DataBase (5)
        • React (26)
      • DevOps (21)
        • Docker (12)
        • Linux (4)
      • Algorithm (46)
        • 알고리즘 정리 (5)
        • 자료구조 (0)
        • PS - 백준 (28)
        • 99클럽 코테 스터디 (13)
      • Project (0)
        • CampFire (0)
      • 안나의 취뽀일기 (˵ •̀ ᴗ - ˵ ) ✧ (4)
        • SSAFY_9기 (2)
        • SW 부트캠프 (2)
  • 잔디 달력

    «   2025/05   »
    일 월 화 수 목 금 토
    1 2 3
    4 5 6 7 8 9 10
    11 12 13 14 15 16 17
    18 19 20 21 22 23 24
    25 26 27 28 29 30 31
  • 인기 글

  • 태그

    linux
    greedy
    stack
    java 백준
    til
    항해99
    docker
    99클럽
    백준
    자바 스택
    김영한
    java stack
    React
    Vue
    Vue.js
    도커
    도커컨테이너
    Spring
    코딩테스트 준비
    Vue.js 입문하기
    front-end
    개발자 취업
    topology sort
    백준 java
    리액트 상태
    백준 구현문제
    java
    알고리즘
    자바
    springboot
  • 05-12 19:25
    반응형
  • hELLO· Designed By정상우.v4.10.3
제가안난데여♪(´ε`*)
[React] 왜 React에서는 form submit을 기본으로 두면 안 될까?
상단으로

티스토리툴바