Coding/React & React-native

[React] React Hook Form과 yup을 사용한 유효성 검사

호밀이 2022. 11. 21. 03:41

React Hook Form이란?

React에서 form의 유효성검사를 도와주는 라이브러리이다.

React Hook Form 장점

공식문서에 따르면 아래와 같은 장점이 있다.

  • 기존의 유효성 검사보다 적은 코드를 사용할 수 있다.
  • 불필요한 재렌더링을 제거하고 검증 계산을 최소화하여 마운팅 속도를 높여 성능을 향상 시킨다.
  • 패키지의 종속성이 없어서 작은 라이브러리로 가볍다.

React Hook Form과 yup을 같이 사용한 이유

React Hook Form만으로도 충분히 좋은 퍼포먼스를 낼 수 있지만, yup과 같이 사용한다면 인라인으로 작성되는 코드를 분리하여 사용할 수 있어  가독성이 조금 더 좋기 때문에 같이 사용하게 된다는 것을 알게되어 사용하게 되었다.

 

아래는 React Hook Form 공식문서에 나와있는 예제코드이다.

확실히 예전의 email의 상태 값을 받아와서 유효성 검사하는 함수를 구현한 후 작업하는 것보다 짧게 코드를 작성할 수 있다.

하지만, pattern에 여러가지 항목의 유효성을 검사하게 된다면 인라인으로 구현해야하는 만큼 코드가 지저분해질 수 있다. 

  <input
    type="email"
    {...register("email", {
      required: "Required",
      pattern: {
        value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
        message: "invalid email address"
      }
    })}
  />
  {errors.email && errors.email.message}

yup이란?

스키마 유효성 검사를 도와주는 라이브러리이다.

아래의 사용방법의 3번에 있는 yup 코드는 내가 직접구현하면서 작성했던 yup 스키마 생성이다. 직접 유효성 검사를 할 때보다 확실히 가독성이 좋다는 것을 알 수 있다.

사용방법

아래와 같은 순서로 코드를 작성해서 회원가입 form 유효성 검사를 간단하게 할 수 있었다. 
자세한 내용은 공식문서에 잘 나와 있기 때문에 확인해가며 작성을 한다면 어렵지 않게 유효성 검사를 할 수 있다.

1. 패키지 설치

npm install react-hook-form yup @hookform/resolvers

2. 라이브러리 import

import { useForm, SubmitHandler } from "react-hook-form";
import { yupResolver } from "@hookform/resolvers/yup";
import * as yup from "yup";

3. yup 스키마 생성

const schema = yup.object().shape({
  id: yup
    .string()
    // 최소 글자수 지정
    .min(2, "아이디는 최소 2글자 이상입니다.")
    .matches(
      /^[^ㄱ-ㅎ|ㅏ-ㅣ|가-힣]+$/,
      "아이디는 영문으로만 입력할 수 있습니다."
    )
    .required("아이디는 필수입력 사항입니다."),
  // 이메일 유효성 검사 코드
  email: yup
    .string()
    .email("이메일 형식을 맞춰주세요.")
    .required("이메일을 입력해주세요."),
  password: yup
    .string()
    .min(8, "비밀번호는 8글자 이상입니다..")
    // 최대 글자수 지정
    .max(16, "비밀번호는 16글자 이하입니다.")
    .matches(
      /^(?=.*[a-zA-Z])((?=.*\d)(?=.*\W))/,
      "비밀번호는 영문, 숫자, 특수문자가 포함되어야 합니다."
    )
    // 반드시 입력해야 할 경우 나타날 수 있도록 하는 코드
    .required("비밀번호는 8글자 이상 16글자 이하입니다."),
  confirmPassword: yup
    .string()
    // yup에 작성한 password와 일치여부 확인
    .oneOf([yup.ref("password"), null], "비밀번호가 일치하지 않습니다."),
});

4. React Hook Form을 사용한 Form 구성

const Signup = () => {
  const {
    register,
    handleSubmit,
    formState: { errors },
  } = useForm<Inputs>({ resolver: yupResolver(schema), mode: "onChange" });
  // mode: "onChange"를 입력해야 Input에 입력할 때마다 검증해준다.

  const onSubmit: SubmitHandler<Inputs> = (data) => console.log(data);

  return (
    <form id="signup" onSubmit={handleSubmit(onSubmit)}>
      <label htmlFor="userId">아이디</label>
      <input
        id="userId"
        type="text"
        placeholder="아이디를 입력해주세요"
        {...register("id")}
      />
      {errors.id && <span>{errors.id.message}</span>}
      <label htmlFor="email">이메일</label>
      <input
        type="email"
        id="email"
        placeholder="example@example.com"
        {...register("email")}
      />
      {errors.email && <span>{errors.email.message}</span>}
      <label htmlFor="password">비밀번호</label>
      <input
        type="password"
        id="password"
        placeholder="비밀번호를 입력해주세요"
        {...register("password")}
      />
      {errors.password && <span>{errors.password.message}</span>}
      <label htmlFor="confrimPassword">비밀번호 확인</label>
      <input
        type="password"
        id="confrimPassword"
        placeholder="비밀번호를 입력해주세요"
        {...register("confirmPassword")}
      />
      {errors.confirmPassword && <span>{errors.confirmPassword.message}</span>}
      <button type="submit">회원가입</button>
    </form>
  );
};

참고자료

React Hook Form 공식문서

 

Home

React hook for form validation without the hassle

react-hook-form.com

yup 공식문서

 

yup

Dead simple Object schema validation. Latest version: 0.32.11, last published: a year ago. Start using yup in your project by running `npm i yup`. There are 3974 other projects in the npm registry using yup.

www.npmjs.com

 

'Coding > React & React-native' 카테고리의 다른 글

[RN]React Native CLI로 시작하기 - macOS(Android Studio)  (0) 2023.12.28
[RN] React Native란?  (0) 2023.12.22
[React] Vite를 사용해보자  (0) 2022.10.25
[React] Portals  (0) 2022.07.16
[React] Fragment  (0) 2022.07.12