์๋ ํ์ธ์!
Zod์ React Hook Form์์ ์ ๊ณตํ๋ ์ฌ๋ฌ๊ฐ์ง ์ ํธ๋ฆฌํฐ ํ ๋ค์ ์ฌ์ฉํด ํผ์ ๋ง์๊ฒ ๋ค๋ฃจ์ด๋ณด๋ ๋ฐฉ๋ฒ์๋ํด ์์ฑํด๋ณด์์ต๋๋ค !
๊ธฐ๋ณธ์ ์ผ๋ก ๋ฆฌํ ํผ์ HTML์์ฑ ๊ธฐ๋ฐ ๊ฒ์ฆ์ ์ง์ํ์ง๋ง, ๋ ๋ณต์กํ ์ ํจ์ฑ ๊ฒ์ฆ์ด๋ ์ปค์คํ ๋ก์ง์ ์ ์ฉํ๋ ค๋ฉด ์ธ๋ถ ๊ฒ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ๊ทธ๋์ ์ผ๋ฐ์ ์ผ๋ก zod, yup, joi ๊ฐ์ ์ ํจ์ฑ ๊ฒ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ฌ์ฉํ๋ค๋ฉด! ๋์ฑ ํฐ ์๋์ง๋ฅผ ๋ผ ์ ์๋ค.
๊ทธ ์ค์์๋ Zod๋ TypeScript์ ๊ฐ๋ ฅํ ํตํฉ์ ๋ชฉํ๋กํ๋ ์ ์ธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฉฐ ์ต๊ทผ ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๊ณ ์๋ค.
<aside> ๐ก
Zod๋ ?
JS, TS์์ ์คํค๋ง ์ ํจ์ฑ ๊ฒ์ฆ ๋ฐ ๋ฐ์ดํฐ ํ์ฑ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ฃผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๊ณ , ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์คํํ๋ฉฐ React Hook Form๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฐํฉํ์ฌ ๋ฐ์ดํฐ ๊ฒ์ฆ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
</aside>
๋ฆฌํ
ํผ์์ Zod๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ฆฌํ
ํผ์์ ์ ๊ณตํ๋ ๋ณ๋์ ์ ํธ๋ฆฌํฐ ํจํค์ง์ธ hookform/resolvers
๋ฅผ ์ค์นํด์ค์ผํ๋ค.
hookfrom/resolvers
๋ ๋ค์ํ ์ ํจ์ฑ ๊ฒ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฆฌํ
ํผ์ ํตํฉ์ ์ง์ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
import { useForm } from 'react-hook-form';
import { z } from 'zod';
import { zodResolver } from '@hookform/resolvers/zod';
const userSchema = z.object({
username: z.string().min(3, "์ด๋ฆ์ ์ต์ 3์ ์ด์์ด์ด์ผ ํฉ๋๋ค."),
password: z.string().min(6, "๋น๋ฐ๋ฒํธ๋ ์ต์ 6์ ์ด์์ด์ด์ผ ํฉ๋๋ค."),
}); // Zod ์คํค๋ง ์ ์
const { register, handleSubmit, formState: { errors } } = useForm({
resolver: zodResolver(schema),
}); // ํผ์ ์คํค๋ง ์ ์ฉ
z.object
: ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ฅผ ์ ์z.string()
: ํ๋๊ฐ ๋ฌธ์์ด์ธ์ง ๊ฒ์ฆmin(length, message)
: ๋ฌธ์์ด์ ์ต์ ๊ธธ์ด๋ฅผ ๊ฒ์ฆ
max(length, message)
: ๋ฌธ์์ด์ ์ต๋ ๊ธธ์ด๋ฅผ ๊ฒ์ฆlength(size, message)
: ๋ฌธ์์ด์ ์ ํํ ๊ธธ์ด๋ฅผ ๊ฒ์ฆ๊ธฐ๋ณธ ๋ฌธ์์ด ๊ฒ์ฆ, ๊ธธ์ด ๊ฒ์ฆ ์ธ์๋ ์์ฒญ๋๊ฒ ๋ง์ ๋ฉ์๋๋ค์ ์ ๊ณตํ๋ค.