ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ํ์๊ฐ์ , ๋ก๊ทธ์ธ, ํ๋กํ ์์ ๊ฐ์ ํ๋ฉด์ ์ ๋ง ๋ง์ด ๋ง๋ค๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋งค๋ฒ ๋ฐ๋ณตํด์ ๊ณ ๋ฏผํ๊ฒ ๋์ฃ .
โ "์ด ์ ๋ ฅ๊ฐ์ ํ์์ธ๊ฐ์?"
โ "๋น๋ฐ๋ฒํธ๋ 8์ ์ด์์ด์ด์ผ ํ๋์?"
โ "์ด๋ฉ์ผ ํ์์ด ๋ง๋์ง ์ด๋ป๊ฒ ํ์ธํ์ฃ ?"
์ด๋ฐ ๊ณ ๋ฏผ์ ๋์ด์ฃผ๊ณ , ๊ฐ๋ฐ์ ํจ์ฌ ํธ๋ฆฌํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค.
๋ฐ๋ก Yup
์
๋๋ค!
(๋ฌผ๋ก ์์ฆ์ Zod
๊ฐ์ ๋ค๋ฅธ ๋์๋ ์์ด์, ์ค๋์ ๋น๊ต๋ ํจ๊ป ํด๋๋ฆฌ๊ฒ ์ต๋๋ค.)
Yup์ ์คํค๋ง(Schema)๋ฅผ ์ ์ํด์ ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฆํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
์ฆ, ๋ฐํ์ ๋ฐ์ดํฐ ๊ฒ์ฆ์ ์ฝ๊ฒ ํ ์ ์๋๋ก ๋์์ฃผ๋ ๋๊ตฌ์ ๋๋ค.
import * as yup from 'yup';
const loginSchema = yup.object({
loginId: yup
.string()
.required('์์ด๋๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.')
.matches(/^[a-zA-Z0-9]{5,20}$/, '5~20์์ ์๋ฌธ ๋๋ ์ซ์ ์กฐํฉ์ด์ด์ผ ํฉ๋๋ค.'),
userPw: yup
.string()
.required('๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.')
.matches(
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()\-_=+{};:,<.>]).{8,}$/,
'์๋ฌธ ๋์๋ฌธ์, ์ซ์, ํน์๋ฌธ์๋ฅผ ํฌํจํด 8์ ์ด์ ์
๋ ฅํด์ฃผ์ธ์.'
),
});
object()
๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฒด ํํ๋ก ์คํค๋ง๋ฅผ ๋ง๋ค๊ณ ,.string()
, .required()
, .matches()
๋ฑ ์ฒด์ด๋ ๋ฐฉ์์ผ๋ก ๊ฒ์ฆ ๊ท์น์ ์ถ๊ฐํ ์ ์์ต๋๋ค.ํผ์ ์์ฑํ ๋ Yup๊ณผ ํจ๊ป ํ๋ฉด, ๊ฒ์ฆ์ด ์ ๋ง ๊น๋ํ๊ฒ ๋๋ฉ๋๋ค.
์ฅ์ | ์ค๋ช |
---|---|
๋ฐฐ์ฐ๊ธฐ ์ฝ์ต๋๋ค | ๋จ์ํ ์ฒด์ด๋ ๋ฐฉ์์ผ๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์, ๋ฌธ๋ฒ์ด ์ง๊ด์ ์ ๋๋ค. |
Form ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฐฐ๋ก์ ๋๋ค | React Hook Form, Formik ๋ฑ๊ณผ ์ฝ๊ฒ ์ฐ๋ํ ์ ์์ต๋๋ค. |
์๋ฌ ๋ฉ์์ง๋ฅผ ์ฝ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค | ์ ์ ์๊ฒ ์น์ ํ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. |
๋ค์ํ ํ์ ์ง์ | ๋ฌธ์์ด, ์ซ์, ๋ ์ง, ๋ฐฐ์ด, ๊ฐ์ฒด ๋ฑ ๊ฑฐ์ ๋ชจ๋ ํ์ ์ ์ง์ํฉ๋๋ค. |
๋น๋๊ธฐ ๊ฒ์ฆ๋ ์ง์ํฉ๋๋ค | ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด์ผ ํ๋ ๊ฒ์ฆ๋ ๊ฐ๋ฅํฉ๋๋ค. |
Zod๋ ์ต๊ทผ ์ฃผ๋ชฉ๋ฐ๊ณ ์๋ ๋ ๋ค๋ฅธ ๋ฐ์ดํฐ ๊ฒ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
Zod๋ ํนํ TypeScript์์ ๊ถํฉ์ด ๋งค์ฐ ์ข์ต๋๋ค.
Zod ํน์ง์ ๊ฐ๋จํ ์์ฝํ๋ฉด:
z.infer<typeof schema>
)ํญ๋ชฉ | Yup | Zod |
---|---|---|
๋ฐ์นญ ์๊ธฐ | 2017๋ (์ค๋๋จ) | 2020๋ (์ ์ธ๋) |
์ฃผ์ ํน์ง | ๊ฒ์ฆ ์ค์ฌ | ํ์ ๊ณผ ๊ฒ์ฆ ๋์ ์ง์ |
TypeScript ์ง์ | ์ฝ๊ฐ ์์ฌ์ (ํ์ ์ถ๋ก ๋ถํธ) | ์์ฃผ ๊ฐ๋ ฅํจ (ํ์ ์ถ๋ก ์์ฐ์ค๋ฝ๊ฒ) |
Form ์ฐ๋ | ์์ฃผ ์ฌ์ (Formik, React Hook Form ๋ฑ์์ ๋๋ฆฌ ์ฌ์ฉ) | ์ต๊ทผ ์ฐ๋ ์ง์ ๊ฐํ |
์๋ฌ ๋ฉ์์ง | ์ปค์คํฐ๋ง์ด์ง ์์ ๋ก์ | ๋ฉ์์ง ์ถ๊ฐ ๊ฐ๋ฅํ์ง๋ง ์ฝ๋ ๋ง์์ง ์ ์์ |
ํ์ต ๋์ด๋ | ๋ ์ฌ์ | ์ฝ๊ฐ ์ง์ ์ฅ๋ฒฝ ์์ |
์์ ์ฑ | ๋งค์ฐ ๊ฒ์ฆ๋จ (์๋ ๊ฐ ์ฌ์ฉ) | ๊ธ์ฑ์ฅ ์ค์ด์ง๋ง ์ฝ๊ฐ์ ๋ณํ ์์ |
์ ๋ฆฌ
์ ๊ฐ Yup์ ์ ํํ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋น ๋ฅธ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ์ต๋๋ค
ํผ ๊ฒ์ฆ์ ํ์ํ ๊ท์น๋ค์ ์ฒด์ด๋ ๋ฐฉ์์ผ๋ก ์ฝ๊ฒ ์์ฑํ ์ ์์๊ณ , ์๋ฌ ๋ฉ์์ง๋ ๋ฐ๋ก ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์์ต๋๋ค.
Form ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฐ๋์ด ์ฌ์ ์ต๋๋ค
ํนํ React Hook Form๊ณผ ์ฌ์ฉํ ๋ resolver
ํ๋๋ง ์ถ๊ฐํ๋ฉด ๋์ด์์ต๋๋ค.
์ปค์คํฐ๋ง์ด์ง์ด ์ฌ์ ์ต๋๋ค
ํ๊ธ ๋ฉ์์ง ์ค์ , ๋์ ๊ฒ์ฆ ์กฐ๊ฑด ์ถ๊ฐ ๋ฑ ๋ชจ๋ ๋ถ๋ถ์ ์ปค์คํฐ๋ง์ด์งํ ์ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํผ ๊ฒ์ฆ์ด ๋ฒ๊ฑฐ๋ก์ฐ์ จ๋ ๋ถ๋ค์ด๋ผ๋ฉด, ํ ๋ฒ Yup์ ์จ๋ณด์๊ธธ ์ถ์ฒ๋๋ฆฝ๋๋ค.
string()
, number()
, required()
๋ง ์์๋ 80%๋ ๋๋ผ ์ ์์ผ๋๊น์.
"๊ฒ์ฆ์ ๊ท์ฐฎ์ง๋ง, ํ์์ ๋๋ค."
Yup์ ์ด ๊ท์ฐฎ์์ ์ฆ๊ฑฐ์ด ๊ฐ๋ฐ๋ก ๋ฐ๊ฟ์ค ์ ์๋ ์ข์ ๋๊ตฌ์ ๋๋ค.