React Hook Form: 폼 상태 관리

2025. 2. 19. 11:40·TypeScript
반응형

React Hook Form은 고성능의 유연한 폼 유효성 검사를 제공하는 라이브러리입니다. 불필요한 리렌더링을 최소화하고, 사용하기 쉬운 API를 제공합니다.

기본 설치 및 사용법

npm install react-hook-form
import { useForm } from 'react-hook-form';

interface FormInputs {
  email: string;
  password: string;
}

function LoginForm() {
  const { register, handleSubmit, formState: { errors } } = useForm<FormInputs>();

  const onSubmit = (data: FormInputs) => {
    console.log(data);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input {...register("email", { required: "이메일은 필수입니다" })} />
      {errors.email && <p>{errors.email.message}</p>}

      <input {...register("password", { 
        required: "비밀번호는 필수입니다",
        minLength: { value: 6, message: "최소 6자 이상이어야 합니다" }
      })} />
      {errors.password && <p>{errors.password.message}</p>}

      <button type="submit">로그인</button>
    </form>
  );
}

고급 유효성 검사

const SignupForm = () => {
  const { register, handleSubmit, watch, formState: { errors } } = useForm({
    defaultValues: {
      username: '',
      email: '',
      password: '',
      confirmPassword: ''
    }
  });

  const password = watch("password");

  return (
    <form onSubmit={handleSubmit(data => console.log(data))}>
      <input {...register("username", {
        required: "사용자 이름은 필수입니다",
        pattern: {
          value: /^[A-Za-z0-9]+$/,
          message: "영문과 숫자만 사용 가능합니다"
        }
      })} />

      <input {...register("email", {
        required: "이메일은 필수입니다",
        pattern: {
          value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
          message: "유효한 이메일 주소를 입력하세요"
        }
      })} />

      <input {...register("confirmPassword", {
        validate: value => 
          value === password || "비밀번호가 일치하지 않습니다"
      })} />
    </form>
  );
};

폼 상태 관리

function ComplexForm() {
  const { 
    register, 
    handleSubmit, 
    formState: { 
      errors, 
      isSubmitting, 
      isDirty, 
      isValid 
    },
    reset,
    setValue,
    watch
  } = useForm({
    mode: 'onChange'
  });

  const onSubmit = async (data) => {
    try {
      await submitToServer(data);
      reset();
    } catch (error) {
      console.error(error);
    }
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      {/* 폼 필드들 */}
      <button 
        type="submit" 
        disabled={!isDirty || !isValid || isSubmitting}
      >
        {isSubmitting ? '제출 중...' : '제출'}
      </button>
    </form>
  );
}

동적 폼 필드

function DynamicForm() {
  const { register, control, handleSubmit } = useForm();
  const { fields, append, remove } = useFieldArray({
    control,
    name: "items"
  });

  return (
    <form onSubmit={handleSubmit(data => console.log(data))}>
      {fields.map((field, index) => (
        <div key={field.id}>
          <input {...register(`items.${index}.name`)} />
          <input {...register(`items.${index}.quantity`)} />
          <button type="button" onClick={() => remove(index)}>
            삭제
          </button>
        </div>
      ))}

      <button type="button" onClick={() => append({ name: '', quantity: '' })}>
        항목 추가
      </button>
    </form>
  );
}

비동기 유효성 검사

function AsyncValidationForm() {
  const { register, handleSubmit, setError } = useForm();

  const validateUsername = async (username: string) => {
    const response = await fetch(`/api/check-username?username=${username}`);
    return response.ok;
  };

  return (
    <form>
      <input {...register("username", {
        validate: async value => {
          const isValid = await validateUsername(value);
          return isValid || "이미 사용 중인 사용자 이름입니다";
        }
      })} />
    </form>
  );
}

Schema 기반 유효성 검사

import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import * as z from 'zod';

const schema = z.object({
  name: z.string().min(2, "이름은 2자 이상이어야 합니다"),
  age: z.number().min(18, "18세 이상이어야 합니다"),
  email: z.string().email("유효한 이메일을 입력하세요")
});

function SchemaForm() {
  const { register, handleSubmit } = useForm({
    resolver: zodResolver(schema)
  });

  return (
    <form>
      <input {...register("name")} />
      <input {...register("age", { valueAsNumber: true })} />
      <input {...register("email")} />
    </form>
  );
}

 

장점

  1. 성능
    • 불필요한 리렌더링 방지
    • 제어 컴포넌트 최소화
  2. 사용성
    • 직관적인 API
    • 적은 보일러플레이트 코드
  3. 유연성
    • 다양한 유효성 검사 옵션
    • 커스텀 검증 로직 지원
  4. 타입 안전성
    • TypeScript 지원
    • 폼 데이터 타입 추론

React Hook Form은 복잡한 폼 상태 관리를 단순화하고, 높은 성능을 제공하는 강력한 도구입니다.

저작자표시 비영리 변경금지 (새창열림)

'TypeScript' 카테고리의 다른 글

tailwind CSS : 유틸리티 기반 CSS 프레임워크  (0) 2025.03.01
Zod: TypeScript 스키마 검증  (0) 2025.02.20
Node-Cache : 서버 성능 최적화  (0) 2025.02.17
React : map  (0) 2025.02.16
React useEffect 의존성 경고  (1) 2025.02.14
'TypeScript' 카테고리의 다른 글
  • tailwind CSS : 유틸리티 기반 CSS 프레임워크
  • Zod: TypeScript 스키마 검증
  • Node-Cache : 서버 성능 최적화
  • React : map
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (725)
      • 스마트팜 (0)
      • 상품 추천 (223)
      • MongoDB (4)
      • 하드웨어 (17)
      • 일기장 (4)
      • 파이썬 (130)
        • Basic (41)
        • OpenCV (8)
        • Pandas (15)
        • PyQT (3)
        • SBC(Single Board Computer) (1)
        • 크롤링 (14)
        • Fast API (29)
        • Package (6)
      • Unity (138)
        • Tip (41)
        • Project (1)
        • Design Pattern (8)
        • Firebase (6)
        • Asset (2)
      • Linux (4)
      • C# (97)
        • Algorithm (11)
        • Window (7)
      • TypeScript (51)
        • CSS (10)
      • Git (11)
      • SQL (5)
      • Flutter (10)
        • Tip (1)
      • System (1)
      • BaekJoon (6)
      • Portfolio (2)
      • MacOS (1)
      • 유틸리티 (1)
      • 서비스 (6)
      • 자동화 (3)
      • Hobby (10)
        • 물생활 (10)
        • 식집사 (0)
  • 인기 글

  • 태그

    learntocode
    긴유통기한우유
    믈레코비타멸균우유
    appdevelopment
    스크립트 실행
    스크립트 실행 순서
    programmerlife
    카페24리뷰
    cv2
    programming101
    쇼핑몰리뷰
    ipcamera
    codingcommunity
    list
    C#
    Python
    라떼우유
    리뷰이관
    unity
    rtsp
    리스트
    셀레니움
    devlife
    리뷰관리
    유니티
    codingtips
    파이썬
    스마트스토어리뷰
    카페24리뷰이관
    상품 리뷰 크롤링
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코샵
React Hook Form: 폼 상태 관리
상단으로

티스토리툴바