본문 바로가기
React

React에서 폼 처리하기

by 굿센스굿 2024. 12. 11.
반응형

 

React에서 폼을 처리하는 것은 웹 애플리케이션 개발의 중요한 부분입니다. 폼을 통해 사용자 입력을 수집하고 이를 처리하여 서버에 전송하거나 화면에 반영하는 등의 작업이 필요하기 때문입니다. 이번 글에서는 React에서 폼을 처리하는 방법을 기초부터 고급까지 단계별로 알아보겠습니다.

1. 기본적인 폼 처리

가장 기본적인 폼 처리 방법은 HTML 폼 요소를 사용하고, React의 상태 관리 기능을 이용해 폼 데이터를 처리하는 것입니다.

1.1 HTML 폼 요소와 React 상태 관리

먼저, HTML 폼 요소를 사용하여 입력 필드를 만듭니다. 그리고 React의 useState 훅을 사용하여 입력된 값을 상태로 관리합니다.

import React, { useState } from 'react';

function BasicForm() {
  const [name, setName] = useState('');

  const handleChange = (event) => {
    setName(event.target.value);
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    alert(`Submitted name: ${name}`);
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        Name:
        <input type="text" value={name} onChange={handleChange} />
      </label>
      <button type="submit">Submit</button>
    </form>
  );
}

export default BasicForm;

이 예제에서는 name이라는 상태를 관리하고, 입력 필드의 값이 변경될 때마다 handleChange 함수가 호출되어 상태를 업데이트합니다. 폼이 제출되면 handleSubmit 함수가 호출되어 경고창을 통해 제출된 값을 표시합니다.

2. 여러 입력 필드 처리

폼이 커지면서 여러 입력 필드를 처리해야 할 때가 있습니다. 이 경우 각 입력 필드의 값을 별도의 상태로 관리할 수 있지만, 하나의 상태 객체로 관리하는 것이 더 효율적일 수 있습니다.

import React, { useState } from 'react';

function MultipleFieldsForm() {
  const [formData, setFormData] = useState({
    name: '',
    email: '',
    age: ''
  });

  const handleChange = (event) => {
    const { name, value } = event.target;
    setFormData((prevData) => ({
      ...prevData,
      [name]: value
    }));
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    alert(`Submitted data: ${JSON.stringify(formData)}`);
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        Name:
        <input type="text" name="name" value={formData.name} onChange={handleChange} />
      </label>
      <br />
      <label>
        Email:
        <input type="email" name="email" value={formData.email} onChange={handleChange} />
      </label>
      <br />
      <label>
        Age:
        <input type="number" name="age" value={formData.age} onChange={handleChange} />
      </label>
      <br />
      <button type="submit">Submit</button>
    </form>
  );
}

export default MultipleFieldsForm;

이 예제에서는 formData라는 객체 상태를 사용하여 여러 입력 필드의 값을 관리합니다. 각 입력 필드에서 name 속성을 사용하여 어떤 필드가 변경되었는지 식별하고, setFormData를 통해 해당 필드의 값을 업데이트합니다.

3. 커스텀 훅을 사용한 폼 처리

폼 처리를 더 깔끔하게 하기 위해 커스텀 훅을 사용할 수 있습니다. 커스텀 훅을 사용하면 폼 로직을 재사용할 수 있어 코드의 재사용성과 가독성이 높아집니다.

import React, { useState } from 'react';

// 커스텀 훅 정의
function useForm(initialValues) {
  const [values, setValues] = useState(initialValues);

  const handleChange = (event) => {
    const { name, value } = event.target;
    setValues((prevValues) => ({
      ...prevValues,
      [name]: value
    }));
  };

  const resetForm = () => {
    setValues(initialValues);
  };

  return [values, handleChange, resetForm];
}

function CustomHookForm() {
  const [formData, handleChange, resetForm] = useForm({
    username: '',
    password: ''
  });

  const handleSubmit = (event) => {
    event.preventDefault();
    alert(`Submitted data: ${JSON.stringify(formData)}`);
    resetForm();
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        Username:
        <input type="text" name="username" value={formData.username} onChange={handleChange} />
      </label>
      <br />
      <label>
        Password:
        <input type="password" name="password" value={formData.password} onChange={handleChange} />
      </label>
      <br />
      <button type="submit">Submit</button>
    </form>
  );
}

export default CustomHookForm;

useForm 커스텀 훅은 폼의 초기 값을 받아 상태를 관리하고, 입력 값이 변경될 때 이를 업데이트하는 로직을 포함하고 있습니다. CustomHookForm 컴포넌트에서는 이 훅을 사용하여 폼을 처리하고 있습니다.

4. 고급 폼 처리: 라이브러리 사용

복잡한 폼 처리를 위해 Formik이나 React Hook Form 같은 라이브러리를 사용할 수 있습니다. 이러한 라이브러리는 폼 상태 관리, 검증, 제출 등을 더 간편하게 처리할 수 있도록 도와줍니다.

4.1 Formik

Formik은 강력한 폼 라이브러리로, 폼 상태 관리와 검증을 쉽게 할 수 있습니다.

import React from 'react';
import { Formik, Form, Field, ErrorMessage } from 'formik';
import * as Yup from 'yup';

const SignupForm = () => {
  const initialValues = {
    name: '',
    email: '',
    password: ''
  };

  const validationSchema = Yup.object({
    name: Yup.string().required('Required'),
    email: Yup.string().email('Invalid email address').required('Required'),
    password: Yup.string().min(6, 'Password must be at least 6 characters').required('Required')
  });

  const handleSubmit = (values) => {
    alert(`Submitted data: ${JSON.stringify(values)}`);
  };

  return (
    <Formik initialValues={initialValues} validationSchema={validationSchema} onSubmit={handleSubmit}>
      <Form>
        <div>
          <label>Name</label>
          <Field type="text" name="name" />
          <ErrorMessage name="name" component="div" />
        </div>
        <div>
          <label>Email</label>
          <Field type="email" name="email" />
          <ErrorMessage name="email" component="div" />
        </div>
        <div>
          <label>Password</label>
          <Field type="password" name="password" />
          <ErrorMessage name="password" component="div" />
        </div>
        <button type="submit">Submit</button>
      </Form>
    </Formik>
  );
};

export default SignupForm;

이 예제에서는 Formik을 사용하여 폼 상태와 검증을 처리합니다. Yup을 이용하여 검증 스키마를 정의하고, 각 필드에 대한 에러 메시지를 쉽게 표시할 수 있습니다.

4.2 React Hook Form

React Hook Form은 또 다른 인기 있는 폼 라이브러리로, 훅을 사용하여 폼 상태를 관리합니다.

import React from 'react';
import { useForm } from 'react-hook-form';

const HookForm = () => {
  const { register, handleSubmit, formState: { errors } } = useForm();

  const onSubmit = (data) => {
    alert(`Submitted data: ${JSON.stringify(data)}`);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <div>
        <label>Name</label>
        <input {...register('name', { required: 'Name is required' })} />
        {errors.name && <p>{errors.name.message}</p>}
      </div>
      <div>
        <label>Email</label>
        <input {...register('email', { required: 'Email is required', pattern: { value: /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/, message: 'Invalid email address' } })} />
        {errors.email && <p>{errors.email.message}</p>}
      </div>
      <div>
        <label>Password</label>
        <input {...register('password', { required: 'Password is required', minLength: { value: 6, message: 'Password must be at least 6 characters' } })} />
        {errors.password && <p>{errors.password.message}</p>}
      </div>
      <button type="submit">Submit</button>
    </form

); };

export default HookForm;

이 예제에서는 `React Hook Form`을 사용하여 폼 상태와 검증을 처리합니다. `register` 함수를 사용하여 입력 필드를 등록하고, `handleSubmit` 함수를 통해 폼 제출을 처리합니다. 오류 메시지는 `errors` 객체를 통해 쉽게 관리할 수 있습니다.

### 결론

React에서 폼을 처리하는 방법은 다양합니다. 기본적인 상태 관리를 이용한 방법부터 커스텀 훅을 사용한 방법, 그리고 `Formik`이나 `React Hook Form` 같은 라이브러리를 이용한 고급 방법까지 살펴보았습니다. 각 방법은 상황에 따라 적절하게 선택하여 사용할 수 있으며, 복잡한 폼 처리가 필요할 때는 라이브러리를 활용하는 것이 좋습니다. React에서의 폼 처리를 통해 사용자 경험을 향상시키고, 보다 효율적인 웹 애플리케이션을 개발해 보세요.
반응형