회원가입 폼을 만들면 다양한 정보를 입력받는 여러 input들이 있다.
회원가입폼에 필요한 것들을 정리해보자면
👉 입력 필드들의 상태를 관리하기위한 변수
👉 유효성 검사를 하기 위한 함수와 만족 여부를 확인하기 위한 변수
👉 에러 메시지를 띄우기 위한 메시지 변수
정말 여러 가지들이 들어가야하기 때문에 굉장히 비슷한 성질의 여러 코드가 들어가게된다.
너무 길어지는 코드에 좋은 방법이 없을까 하다가 지피티님이 방법을 추천해주셨다.
React-hook-form + yup 을 활용한 폼
❓ React-hook-form 이란
유효성 검사를 쉽게 할 수 있는 리액트의 라이브러리로써 폼을 유연하고 쉽게 구현이 가능하도록 지원해준다.
유효성 검사는 물론 상태관리와 에러 메시지 까지 한꺼번에 관리할 수 있다.
물론 form 안에 있는 필드 한정이다.
❓ yup 이란
스키마를 정의하여 데이터의 유효성을 검증할 수 있도록 해주는 라이브러리이다.
따라서 yup에서 정의한 유효성 검증을 담은 스키마를 기반으로
React-hook-form에서 해당 폼 내부에 필드에 적용을 시키는것이다.
🔍 적용해보기
⬛ React-hook-form
우선 라이브러리를 설치해준다.
나는 yarn을 사용하기 때문에
yarn add react-hook-form
해준다.
◾ react-hook-form 정의
const { register, watch, handleSubmit, trigger, setValue, formState: { errors }, } = useForm({ resolver: yupResolver(schema), mode: "onBlur", });
useForm 속성 정리
👉 register
폼 필드와 리액트 훅 폼을 연결해준다.
register("필드이름") 을 해당 폼 필드에 붙여주면 필드의 값과 상태관리를 할 수 있게된다 => 자동 useState
👉 watch
폼 필드의 값을 실시간으로 감시하는 함수이며
실시간으로 계속 바뀌는 필드들을 중간에 값을 체크하고싶을때 watch("필드이름") 해주게 되면 최신값을 얻는다.
👉 handleSubmit
폼 제출 할 시 호출할 함수이다.
react-hook-form을 사용하면 자동으로 form안에 버튼이 type = submit을 가지게된다.
이때 호출한 함수는 폼 내에 필드들을 전부 유효성 검사를 한 뒤 실패한 필드가 있는 경우 submit이 넘어가지 않도록한다.
👉 trigger
특정 필드나 전체를 강제로 유효성 검사를 수행하는 함수
만약 이메일 중복 검사를 하기전에 이메일만 유효성 검증을 따로 하고 싶을 경우
trigger("email") 하게 되면 이메일만 유효성 검증을 할 수 있게된다.
👉 setValue
특정 이벤트에 따라 값 변경이 필요할 때 사용한다.
폼필드가 아닌 외부 컴포넌트나 외부 이벤트에 따라 값의 변경이 필요할 때 사용한다.
👉 formState : {errors}
각 필드별 검사 에러 메시지와 상태를 포함하는 객체이다.
errors.필드 이름을 통해 유효성 검사에 실패하였을 경우에 해당 필드의 에러 메시지를 가져올 수 있다.
👉 resolver: yupResolver(schema)
yup스키마를 기반으로 유효성 검사를 적용한다.
👉 mode: "onBlur"
사용자가 입력필드에 발생시키는 이벤트에 따라 유효성 검사를 실행
onclick에 경우 클릭할 떄마다 유효성 검사를 한다고 보면된다.
⬛ Yup
//유효성 조건(yup) const schema = yup.object({ email: yup .string() .email("올바른 이메일 형식이 아닙니다.") .required("필수 입력입니다."), password: yup .string() .required("필수 입력입니다.") .matches( /^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[!@#$%^&*()_+{}\[\]:;<>,.?/~`\-=|\\]).{10,16}$/, "10~16자 대소문자+영문+특수 기호로 조합해주세요." ), password2: yup .string() .oneOf([yup.ref("password")], "비밀번호가 일치하지 않습니다.") .required("비밀번호 확인은 필수 입니다."), name: yup .string() .required("필수 입력입니다") .matches(/^[가-힣]*$/, "한글로만 입력해주세요.") .max(4, "4자 이내로 입력해주세요."), birth: yup .string() .matches( /^(19[0-9][0-9]|20\d{2})(0[0-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$/, "정확한 생년월일 8자리로 입력해주세요" ), phone: yup .string() .matches(/^[0-9\b]{0,13}$/, "휴대번호를 정확하게 입력해주세요."), address1: yup.string().required("필수 입력입니다."), });
👉 yup의 유효성검증들을 구현한 스키마이다.
체인 형식으로 조건들을 나열할 수 있으며 리액트 폼에서 유효성을 통과하지 못한 경우에
지정한 에러 메시지를 errors에 담는것이다.
어떠한 메서드들이 있는지 궁금하면 한번 찾아보는걸 추천한다.
'리액트' 카테고리의 다른 글
[React + SpringBoot] 프론트에서 axios로 MultipartFile 을 보내고 백엔드에서 받기 (3) | 2025.06.11 |
---|---|
[React] DB없이 프론트에서 useState로 데이터를 관리하기 (localstorage ❌) (0) | 2025.03.18 |
[React] useEffect 와 useMemo 에 대해 알아보자 (0) | 2025.02.24 |
[React] 객체화를 통하여 더욱 효율적이게 상태 관리를 해보기 (회원가입) (0) | 2025.02.20 |
[React] 클린업 함수란 무엇이며, 사용해야 하는 이유를 예제로 알아보기(useEffect) (2) | 2025.02.17 |