Javascript/React

React Hook Form

LSH2118 2025. 3. 19. 18:38

오늘의 주제는 react hook form에 대해서 공부해 봤다

 

내가 프로젝트를 하는데 폼 작성하는 기능이 주를 이루는 프로젝트라

이번기회에 react hook form을 사용하자고 결정하고 자세하게 배워봤다


React Hook Form

Performant, flexible and extensible forms with easy-to-use validation.
유효성 검사를 쉽게 할 수 있는, 성능이 우수하고 유연하며 확장 가능한 form을 제공하는 라이브러리이다.

 

npm install react-hook-form

 

react hook form은 React에서 폼을 쉽게 다룰 수 있도록 도와주는 라이브러리이다

 

여기서 폼이란 html태그중 하나인 form을 의미하는 것으로

html에서 사용자가 값을 입력하고 제출할 수 있게 하는 태그다

 

주로 로그인, 회원가입등에 사용된다

기존의 React에서의 방법

원래 React에서 로그인, 회원가입을 구현하려면 아래와 같은 작업을 거친다

 

아이디, 비밀번호 같은 요소들을 useState를 사용해 업데이트하고, onChange로 동기화하는 작업을 거친다

 

그 후 우리가 원하는 형식인지 확인하는 절차를 거친다

if (!email.includes("@gmail.com")) return (<p>이메일 형식이 올바르지 않습니다.</p>;
if (password.length < 6) return (<p>비밀번호는 6자 이상이어야 합니다.</p>;

 

요구하는 형식이 올바르면 서버에 요청을 보내고 로그인, 회원가입을 할 수 있었다

 

방법이야 간단 방법이지만 

코드상으로는 길고 또 비효율적인 부분이 있다

 

먼저 useState랑 onChange로 상태를 동기화하는데

 

useState에서 상태가 업데이트가 되면 재렌더링이 되기 때문에 불필요한 렌더링이 발생한다

 

그리고 유효성 검사를 직접 일일이 구현해야 하기 때문에

코드가 조금 더 길어지게 되고, 복잡해진다

 

애초에 React를 사용할 때는 form보다는 그냥 useState로 상태관리해서 자체적으로 구현하는 경우가 많다

 

그러면 왜 React hook form이란 라이브러리를 도입해서 사용하는 걸까?

왜?

일단 form태그를 사용했을 때 장점이 있다

 

기본적인 enter키로 자동제출기능 같은 작은 내용부터

 

form 태그는 웹 표준을 따르므로 접근성 개선 효과와,

 

<input>, <select>, <textarea> 등의 폼 요소를 자연스럽게 그룹화해서

입력값이 많을 경우 일일이 useState를 사용하는 경우를 방지할 수 있다는 이점이 있다

 

그 외에도 react hook form만의 추가적인 기능도 제공된다

register 기반의 자동 관리

register 함수로 input이나 textarea를 등록하면 useState를 사용하지 않아도

자동으로 값을 동기화한다

const { register, handleSubmit } = useForm();

<form onSubmit={handleSubmit(onSubmit)}>
  <input {...register("username")} />
</form>

 

 

더불어 내부적으로 useRef를 사용하기 때문에 불필요한 재렌더링을 방지할 수 있다

 

검색 내장화

react hook form은 기본적인 검증 방법을 제공합니다

 

필수값(required)

입력 필드를 필수로 설정할 수 있다

<input {...register("username", { required: "사용자 이름은 필수입력입니다." })} />
<input {...register("password", { required: "비밀번호는 필수입력입니다" })} />

 

최소&최대길이(minLength, maxLength)

입력값의 최소, 최대길이 지정할 수 있다

<input
    {...register('password', {
      minLength: {
        value: 8,
        message: '비밀번호는 최소 8자 이상이어야 합니다.',
      },
      maxLength: {
      	value: 16,
        message: '비밀번호는 최대 16자입니다',
      }
    })}
  />;

패턴검사(pattern)

정규식을 사용해서 입력값의 형식을 검사할 수 있다

email 형식이나 전화번호 형식 등

<input
  placeholder="이메일을 입력해주세요"
  {...register('email', {
    required: '이메일을 입력해주세요.',
    pattern: {
      value: /^[a-zA-Z0-9._%+-]+@gsm\.hs\.kr$/,
      message: '학교 이메일(@gsm.hs.kr)만 사용 가능합니다.',
    },
  })}
/>

 

<input
  {...register('phone', {
    required: '전화번호는 필수입력란 입니다',
    pattern: {
      value: /^010-\d{4}-\d{4}$/,
      message: '올바른 전화번호 형식(010-XXXX-XXXX)으로 입력하세요.',
    },
  })}
/>;

 

비동기 중복 검사 

vaildate는 특정 조건을 만족할 때 실행되는 옵션이지만 

이를 이용해 id중복이나 이미 사용된 email, 멀리는 회원가입 시 인증코드까지 검사할 수 있다

const checkEmail = async (email: string) => {
  const response = await fetch(`대충 검사 url=${email}`);
  const data = await response.json();
  return data.available || "이미 사용 중인 이메일입니다.";
};

<input {...register("email", { validate: checkEmail })} />

 

위코드는 사용 중인 email을 표시하는 예제코드다


결론

원래 존재했었다 정도만 알고있었지만

막상 사용하려고 공부를 해보니 더욱 다양한 기능이 있다는 사실을 알아서 좋았다

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

shadcn  (1) 2025.05.11
[React]server component  (0) 2025.03.12
[React]React-Markdown  (0) 2024.12.10
[React]심심할땐 뻘짓이지  (0) 2024.11.19
[React]React-Helmet  (0) 2024.11.04