구현목록
- React Hook Form를 사용해서 회원가입 폼 개선(유효성 검사 속성 및 에러메세지 추가)
React Hook Form이란?
React에서 Form을 쉽게 만들기 위해 사용하는 라이브러리.
✔️ 기존의 폼에서 입력해야하는 여러가지 번거로운 작업을 줄여준다.(value설정, 데이터 전송 관리 등)
✔️ 타입스크립트로 작성된 라이브러리로, 타입스크립트와 아주 잘 맞는다.
✔️ 사용하기 쉬운 유효성 검사, 적은 코드
결과
이메일, 비밀번호를 필수값으로 지정
이메일 - 패턴값 지정, 비밀번호 - minLength로 4글자 이상으로 지정
과정
1️⃣ React Hook Form 설치
npm install react-hook-form
2️⃣ useForm 불러오기(react-hook-form에서 제공하는 여러가는 hook 중 하나, 우리가 사용하고자 하는 대부분의 기능이 이 hook에서 나온다고 함)
3️⃣ useForm 기능 사용하기
useForm 중에서도 register, handleSubmit, watch, formState 사용
Register : input값을 불러오기 위한 함수
{...register("사용하고 싶은 이름") } 이라고 적어두면 나중에 적은 이름으로 값을 불러올 수 있다.
두번째 인자에 유효성 검사 적용. 다양한 옵션을 설정해서 validation을 수행하는 기준값을 설정할 수 있다.
{...register("email", {
required: "이메일은 필수 값입니다.",
pattern: {
value: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/i,
message: "올바른 이메일 형식으로 작성해주세요",
},
})}
{...register("password", {
required: "비밀번호는 필수 값입니다.",
minLength: {
value: 4,
message: "비밀번호는 4글자 이상이어야합니다",
},
})}
- required : 필수값 지정. true,false로 구분해도 되지만 문자열을 넣을 경우에는 에러메세지로 들어간다.
- pattern : 입력에 대한 정규식 패턴 지정. 입력값 형식 지정
- minLength : 입력 최소 길이 지정
⇒ 위의 유효성 검사를 통과하지 못했을때 errors 객체를 이용하여 에러 메세지를 보여줄 수 있다.
Watch : input 입력값을 실시간으로 확인하기 위한 함수
console.log(watch());
HandleSubmit : submit을 관리하기 위해 만든 함수
함수를 인자로 받으며, 그 함수에 data를 넘겨줌.
<button onClick={handleSubmit(onSignIn)}>SignIn</button>
data ⇒ input 입력값
FormState: {errors} : 발생한 error값들이 formState 객체 안에 errors로 담겨져 있다.
해당 errors 객체를 이용해서 사용자들에게 표시.
<div className="errorMessage">
{errors.email?.type === "required" &&
"이메일을 필수 조건으로 입력하시길 바랍니다."}
{errors.email?.type === "pattern" && errors.email.message}
</div
⬇️ 최종 구현 코드
import { useForm } from "react-hook-form";
function Auth() {
const {
register,
handleSubmit,
watch,
formState: { errors },
} = useForm({ mode: "onSubmit" });
const onSignIn = (data: any) => {
axios
.post(
"<http://localhost:1234/register>",
{
email: data.email,
password: data.password,
},
{ withCredentials: true }
)
.then((res) => {
alert("회원가입 성공");
})
.catch((error: any) => {
alert("형식을 확인해주세요");
console.dir(error);
});
};
return (
<>
<div>Auth</div>
<form
onSubmit={(e) => {
e.preventDefault();
}}
>
<input
{...register("email", {
required: "이메일은 필수 값입니다.",
pattern: {
value: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/i,
message: "올바른 이메일 형식으로 작성해주세요",
},
})}
placeholder="EMAIL"
/>
<div className="errorMessage">
{errors.email?.type === "required" &&
"이메일을 필수 조건으로 입력하시길 바랍니다."}
{errors.email?.type === "pattern" && errors.email.message}
</div>
<input
{...register("password", {
required: "비밀번호는 필수 값입니다.",
minLength: {
value: 4,
message: "비밀번호는 4글자 이상이어야합니다",
},
})}
placeholder="PW"
/>
<div className="errorMessage">
{errors.password?.type === "required" &&
"비밀번호를 필수 조건으로 입력하시길 바랍니다."}
{errors.password?.type === "minLength" && errors.password.message}
</div>
<button onClick={handleSubmit(onSignIn)}>SignIn</button>
<button onClick={handleSubmit(onLogin)}>Login</button>
</form>
</>
);
}
export default Auth;
백엔드 코드에도 validation 체크해야함. 프론트에서는 언제든지 바꿀 수 있기 때문!
백엔드 프론트 보안도 항상 생각하자 !!
참고사이트
React Form Validation 폼태그 유효성 검증을 쉽게 도와주는 Formik 사용방법
[React] react-hook-form 사용 및 useForm - 1
[React] 커스텀 훅, useForm (섹시하게) 만들기
[React] react-hook-form이란? / 사용법
'sns 프로젝트' 카테고리의 다른 글
React-query 데이터 업데이트 (1) | 2024.01.22 |
---|---|
상태관리 도입해서 전역 변수 관리하기(Redux, React Query) (0) | 2024.01.21 |
token 검증 실패시 에러처리하기(토큰검증 미들웨어) (1) | 2024.01.21 |
회원가입, 로그인 기능 구현(JWT) (1) | 2024.01.21 |
백엔드 개발 환경 설치 과정(Nodejs, express, Sequelize), CORS해결 (0) | 2024.01.21 |