Web Frontend

회원가입 form 구현(1)_유효성 검사

홍유진 2024. 8. 3. 00:38

유효성 검사를 구현하면 사용자가 올바른 데이터를 입력하도록 유도하고, 잘못된 데이터가 서버에 전달되는 것을 방지할 수 있다. 그래서 이번 프로젝트에서 회원가입 페이지를 구현하면서 유효성 검사 기능을 구현하였다.

그 과정을 살펴보자.

1. 상태 초기화 및 핸들러 설정

먼저, useState를 사용하여 폼 데이터와 에러 메세지를 관리한다. 또한 handleChange 함수를 통해 입력값이 변경될 때마다 호출되어 상태를 업데이트하고 유효성 검사를 수행한다.

// 입력된 값을 저장
const [value, setValue] = useState<FormValues>({
  email: "",
  password: "",
  nickname: "",
});
// 유효성 검사 결과를 저장
const [errors, setErrors] = useState<FormValues>({
  email: "",
  password: "",
  nickname: "",
});

const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  const { name, value } = e.target;

  setValue(prev => ({
    ...prev,
    [name]: value,
  }));
  validateField(name, value);
};

2. 유효성 검사 함수

validateField 함수는 각 입력 필드에 대한 특정한 유효성 검사 규칙을 적용한다.

이메일 형식, 비밀번호 길이 및 조합, 닉네임 길이를 확인한다.

const validateField = (name: string, value: string) => {
  let errorMessage = "";

  switch (name) {
    case "email":
      if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i.test(value)) {
        errorMessage = "유효한 이메일 주소를 입력해주세요.";
      }
      break;
    case "password":
      if (value.length < 6) {
        errorMessage = "비밀번호는 최소 6자 이상 입력하세요.";
      } else if (!/(?=.*[a-zA-Z])(?=.*\\d)/.test(value)) {
        errorMessage = "알파벳, 숫자를 조합한 비밀번호를 입력하세요.";
      }
      break;
    case "nickname":
      if (value.trim().length === 0) {
        errorMessage = "닉네임은 최소 1자 이상 입력하세요.";
      }
      break;
    default:
      break;
  }

  setErrors(prev => ({
    ...prev,
    [name]: errorMessage,
  }));
};

3. 유효성 검사 결과에 따른 폼 상태 업데이트

useEffect를 사용하여 입력값과 에러메세지의 상태 변화를 감지하고, 모든 입력 필드가 유효한 경우에만 폼을 제출할 수 있도록 버튼을 활성화한다.

useEffect(() => {
  const isFormValid =
    Object.values(value).some(filed => filed.trim() !== "") && // 모든 입력 필드가 비어 있지 않은지 확인
    Object.values(errors).every(error => error === ""); // 모든 에러 메시지가 빈 문자열인지 확인

  setIsDisabled(!isFormValid); // 두 조건이 모두 만족되면 isFormValid는 true가 되고, setIsDisabled는 false로 버튼을 활성화
}, [value, errors]);

 

다음 포스트에서는 버튼 활성화에 관한 내용을 볼 수 있습니다.