validation을 어디서 해야 하나

hotbreakb·2022년 8월 11일
2

타이어 스쿼드에서 입력된 핸드폰 번호가 적절한지 판단하는 validation을 추가하기로 했다. PhoneInput을 사용하기만 하면 알아서 에러 메시지를 보여주길 원했기 때문에 컴포넌트 안에 errorMessage state를 넣었다.

컴포넌트 안에서만 동작하는 것은 문제가 없었으나, 올바른 핸드폰 번호가 입력되었는지 PhoneInput도 알아야 하고 Index도 알아야 했다. 왜냐하면 index 내부에 있는 submit은 핸드폰 번호에 문제가 없을 때 활성화되기 때문이다. 이럴 땐 어떻게 처리할 것인가?

팀장님께서 제안해주신 방식은 2가지이다.

  1. PhoneInput에서 onChange = (phone:string, error: string) => {} 받아서 에러가 발생할 때마다 error를 바꾸는 것이다.
  2. validatePhone()을 util에 만든다. 잘못된 값임을 설명하는 이유를 throw Error를 한다.
    • 010-1234 ➡ 문자 안돼
    • 010123412345 ➡ 11자 넘으면 안돼

이때 1번에서의 문제가 있다.

  • impossible state가 생길 수 있다. (phone: 01012341234, error: "숫자만 입력해 주세요")라고 하면, phone은 올바르지만 에러가 생기는 이상한 state가 만들어진다. 이런 것을 막기 위해서는 erroronChange로 받아서 변환하면 안 된다.

결론 👨‍⚖️

  • validatePhone을 만들어서 필요할 때마다 불러서 사용하자.

profile
글쟁이 프론트 개발자, 헬렌입니다.

8개의 댓글

comment-user-thumbnail
2022년 8월 17일

음... 굳이 유효성 검사를 하는 함수를 만들지 않고 input에 type="tel", pattern="[0-9]{11}", required의 세 속성들을 사용하시면 01012345678과 같은 경우를 제외하면 submit을 거부시키는 input을 만드실 수 있습니다. 이런 식으로 input을 만들고 밑에 텍스트로 문자를 제외한 11자 숫자를 입력해 달라고 알리는 것은 어떨까요? 코드도 확 짧아지고 유지 보수도 편해지는 방법이라 생각합니다.

5개의 답글