Zod는 TypeScript에서 사용하는 런타임 유효성 검사 라이브러리입니다.
사용자로부터 입력 받은 폼 데이터등의 타입이 보장되지 않는 경우에 유용하게 사용할 수 있습니다.
에러메시지를 커스터마이징할 수 있어 Form에 사용하기에 아주 적합하기도 합니다.
회원가입 폼을 가정하고 Zod로 Schema를 생성해보았습니다.
코드는 아래 조건들을 만족합니다.
email: email 포맷일 것
password: 2자 이상, 숫자와 영문자를 최소한 하나씩 포함할 것
passwordCheck: password와 동일할 것
job: name이 other일 경우 other에 값이 있을 것
특히, name이 other일 경우 other에 값이 있을 것과 같은 복잡한 조건도 refine을 사용하여 구현할 수 있어 만족도가 높습니다.
React Hook Form
React Hook Form은 React에서 사용하는 Form 라이브러리입니다.
폼의 상태 관리와 유효성 검사를 쉽게 할 수 있게 도와줍니다.
위의 Zod로 만든 signUpFormSchema를 사용하지 않고 React Hook Form만을 사용한다면 아래와 같이 코드를 작성해야 합니다.
Zod와 같이 사용하면 위와 같은 코드를 Form과 유효성 검사를 위한 타입을 분리하여 작성할 수 있으므로 더욱 쉽고 가독성 있게 작성할 수 있습니다.
아래부터의 코드는 Zod로 만든 signUpFormSchema를 기반으로 React Hook Form을 사용한 코드입니다.
resolver에 Zod로 만든 signUpFormSchema를 zodResolver를 통해 넘겨 이를 기반으로 유효성 검사를 하게 됩니다.
또한 Context(FormProvider)를 사용하여 Form의 상태를 관리할 수 있으며 이를 사용해 멀티페이지 폼을 만들 수 있습니다.
Input 페이지 만들기
useFormContext 훅을 사용하여 폼의 상태를 관리합니다. register 함수를 사용하여 폼 필드를 등록하고, errors 객체를 통해 유효성 검사 에러를 확인합니다.
코드 설명: "email" 필드를 등록하고, 유효성 검사 에러가 있다면 에러 메시지를 출력합니다.
멀티페이지이므로 다음 페이지로 넘어가기 전에 해당 페이지의 Input에 대한 유효성 검사를 해야하고,
이는 trigger 함수로 해당 필드만을 검사하게 됩니다.
코드 설명: "email" 필드의 유효성 검사를 실행하고, 유효하다면 다음 페이지("/signup/password")로 이동합니다.
Shadcn/ui
shadcn/ui는 Radix UI 와 Tailwind CSS를 기반으로 만들어진 UI 컴포넌트 모음입니다.
공식 문서 설명: This is NOT a component library. It's a collection of re-usable components that you can copy and paste into your apps.
저희 회사는 웹 접근성이 보장되고, 공통된 컴포넌트 시스템을 쉽게 구축할 수 있을 뿐더러 커스터마이징도 쉽기 때문에 shadcn/ui를 적극 사용하고 있습니다.
그리고 제공하는 Form 컴포넌트가 React Hook Form을 Wrap하고 있고 에러 메시지 출력, 에러에 따른 스타일링 등도 설정되어 있어 같이 사용하면 더욱 편리해집니다.
마무리
React Hook Form은 Form의 상태 관리와 유효성 검사를 쉽게 할 수 있게 도와주고, Zod는 Form의 유효성 검사를 위한 타입을 분리하여 가독성 좋게 작성할 수 있게 해주고, shadcn/ui는 더욱 쉽게 폼을 만들 수 있게 해줍니다.