Yup vs Zod - maeng2418/zzik-meok GitHub Wiki
Yup๊ณผ Zod ๋น๊ต
Yup๊ณผ Zod๋ ๋ชจ๋ JavaScript/TypeScript์์ ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํ ์คํค๋ง ๊ธฐ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๋ ๋ค ํผ ๊ฒ์ฆ, API ๋ฐ์ดํฐ ๊ฒ์ฆ, ๋ฐํ์ ํ์ ๊ฒ์ฌ ๋ฑ์ ์ฌ์ฉ๋ฉ๋๋ค.
๊ณตํต์
- ์คํค๋ง ๊ธฐ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ ์ ๊ณต
- ์ฒด์ด๋ API ์ง์
- React Hook Form, Formik ๋ฑ ํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํตํฉ ๊ฐ๋ฅ
- ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๊ฒ์ฆ ๊ฐ๋ฅ
Yup
์ฅ์
- ์ญ์ฌ๊ฐ ์ค๋๋์ด ์์ ์ ์ด๊ณ ์ฑ์ํจ
- ์ต์ํ API (ํนํ Joi ์ฌ์ฉ์๋ค์๊ฒ)
- ๋ ๊ฐ๋ฒผ์ด ๋ฒ๋ค ํฌ๊ธฐ (Zod๋ณด๋ค ์ฝ๊ฐ ์์)
- ๋ ๋ง์ ์ปค๋ฎค๋ํฐ์ ์์
๋จ์
- TypeScript ํตํฉ์ด Zod๋งํผ ๊ฐ๋ ฅํ์ง ์์
- ํ์ ์ถ๋ก ๊ธฐ๋ฅ์ด ์ ํ์
์์ ์ฝ๋
import * as yup from 'yup';
const userSchema = yup.object({
name: yup.string().required(),
email: yup.string().email().required(),
age: yup.number().positive().integer().min(18).required(),
website: yup.string().url().nullable()
});
// ์ฌ์ฉ
try {
const validatedData = await userSchema.validate(userData);
// ์ฑ๊ณต
} catch (error) {
// ์ ํจ์ฑ ๊ฒ์ฌ ์คํจ
}
Zod
์ฅ์
- TypeScript์์ ๊ฐ๋ ฅํ ํตํฉ
- ํ์ ์ถ๋ก ์ด ๋ฐ์ด๋จ (์คํค๋ง์์ TypeScript ํ์ ์ ์๋์ผ๋ก ์ถ์ถ)
- ๋ ํ๋์ ์ธ API ์ค๊ณ
- ๋ ์๊ฒฉํ ๊ธฐ๋ณธ๊ฐ (์: null๊ณผ undefined๋ฅผ ๋ช ์์ ์ผ๋ก ํ์ฉํด์ผ ํจ)
- ์๋ฌ ๋ฉ์์ง ์ปค์คํฐ๋ง์ด์ง์ด ๋ ์ ์ฐํจ
๋จ์
- ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ์ฝ๊ฐ ๋ ํผ
- Yup๋ณด๋ค ์ญ์ฌ๊ฐ ์งง์
- ํ์ต ๊ณก์ ์ด ์ฝ๊ฐ ๋ ๊ฐํ๋ฆ
์์ ์ฝ๋
import { z } from 'zod';
const userSchema = z.object({
name: z.string(),
email: z.string().email(),
age: z.number().int().positive().min(18),
website: z.string().url().nullable()
});
// ํ์
์ถ๋ก
type User = z.infer<typeof userSchema>;
// ์ฌ์ฉ
try {
const validatedData = userSchema.parse(userData);
// ์ฑ๊ณต: validatedData๋ User ํ์
} catch (error) {
// ์ ํจ์ฑ ๊ฒ์ฌ ์คํจ
}
์ฑ๋ฅ ๋น๊ต
์ผ๋ฐ์ ์ผ๋ก Zod๊ฐ ์ฝ๊ฐ ๋ ๋๋ฆฌ์ง๋ง ๋๋ถ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ทธ ์ฐจ์ด๋ ๋ฏธ๋ฏธ Yup์ ์ฝ๊ฐ ๋ ์์ ๋ฒ๋ค ํฌ๊ธฐ๋ ํด๋ผ์ด์ธํธ ์ธก ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฝ๊ฐ์ ์ด์
์ด๋ค ๊ฒ์ ์ ํํด์ผ ํ ๊น?
Yup์ ์ ํํ๋ ๊ฒฝ์ฐ:
- JavaScript ํ๋ก์ ํธ
- ๋ ๊ฐ๋ฒผ์ด ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ์ค์ํ ๊ฒฝ์ฐ
- ๋ ์ต์ํ API๋ฅผ ์ํ๋ ๊ฒฝ์ฐ
- ์ฑ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํธํ๋ ๊ฒฝ์ฐ
Zod๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ:
- TypeScript ํ๋ก์ ํธ
- ํ์ ์ถ๋ก ์ด ์ค์ํ ๊ฒฝ์ฐ
- ๋ ํ๋์ ์ธ API๋ฅผ ์ํ๋ ๊ฒฝ์ฐ
- ์๊ฒฉํ ํ์ ๊ฒ์ฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ
์ต๊ทผ ํธ๋ ๋๋ TypeScript์ ์ธ๊ธฐ ์ฆ๊ฐ์ ํจ๊ป Zod๋ก ๊ธฐ์ธ๊ณ ์์ต๋๋ค. ํนํ TypeScript ํ๋ก์ ํธ์์๋ Zod์ ๊ฐ๋ ฅํ ํ์ ์ถ๋ก ๊ธฐ๋ฅ์ด ํฐ ์ฅ์ ์ด ๋ฉ๋๋ค. React Hook Form์ด๋ Formik๊ณผ ๊ฐ์ ํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ฌ์ฉํ ๋๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชจ๋ ์ ํตํฉ๋ฉ๋๋ค. ๊ฒฐ๊ตญ ํ๋ก์ ํธ์ ์๊ตฌ ์ฌํญ๊ณผ ํ์ ์ ํธ๋์ ๋ฐ๋ผ ์ ํํ๋ฉด ๋ฉ๋๋ค.