μ ν¨μ± μ²΄ν¬ λ°©λ²
X2BEE μ루μ
μμΒ Zod λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν΄ λ°μ΄ν° μ ν¨μ±μ κ²μ¦ν©λλ€. λ³Έ κ°μ΄λλ μ€ν€λ§ μ μ, νλλ³ μ ν¨μ± κ²μ¦, μ 체 λ°μ΄ν° κ²μ¦, λ°μ΄ν° κ°κ³΅ λ° νμ
μΆλ‘ μ ν¨μ¨μ μΌλ‘ ꡬνν μ μλ λ°©λ²μ μ€λͺ
ν©λλ€.
1. Zod μ€ν€λ§ μ μ λ°©λ²
Zod λ TypeScriptλ₯Ό μ°μ μΌλ‘ νλ μ€ν€λ§ μ μΈ λ° μ ν¨μ± κ²μ¦ λΌμ΄λΈλ¬λ¦¬ μ΄λ©°, μ€λ³΅λ μ ν μ μΈμ μ κ±°νκΈ° μν΄ μ¬μ©λλ λΌμ΄λΈλ¬λ¦¬ μ λλ€. Zod λ₯Ό ν΅ν΄ μ ν¨μ± κ²μ¬λ₯Ό νκ³ Typescript μ νμ μΆλ‘ ν μ μμ΅λλ€.
import {z} from 'zod'
/**
κΈ°λ³Έμ μΈ zod κ°μ²΄ μ μμ λ΄λΆμ object ν¨μλ₯Ό μ΄μ©νμ¬ κ°μ²΄λ₯Ό μμ±νκ³ λ°νν΄μ€ μ μμ΅λλ€.
Argument λ‘ κ°μ²΄λ₯Ό λμ Έμ£Όλ©΄ μμ ννμ zod schema λ₯Ό μ¬μ©ν μ μκ² λ©λλ€.
Argument λ‘ μ λ¬νλ κ°μ²΄μ κ²½μ° κ° νλλ₯Ό μ μνκ³ νμ
μ zod μ νμ
μΌλ‘ μ μν΄μ€μΌ ν©λλ€.
**/
const zodExampleSchema = z.object({
name: z.string(),
userId: z.string(),
password: z.string(),
phone: z.number()
})
Β
2. κ° νλλ³ μ ν¨μ± μ²΄ν¬ λ°©λ²
zod λ§μΌλ‘λ λ¨μ μ ν¨μ± κ²μ¬λ₯Ό νλλ° μ νμ΄ λ°μλκΈ° λλ¬Έμ κ° νλͺ©μ λν΄μ μμ λ μλ μ ν¨μ± κ²μ¬λ₯Ό μ§νμ΄ λμ΄μΌ ν©λλ€. λͺ¨λ κ²μ¬λ₯Ό λ΄μ μ μμ§λ§ κΈ°λ³Έμ μΈ λΉκ°μ 체ν¬νλ κ²μ¦ λ°©μμ μλμ κ°μ΅λλ€.
import {z} from 'zod'
/**
min, max... λ± λ€μν κΈ°λ³Έ κ²μ¦ λ°©μλ€μ΄ μ‘΄μ¬νμ§λ§, μμ λ μλ κ²μ¦μ μν΄μ zod λ΄λΆμ
μ§μνκ³ μλ ν¨μ refine μ μ΄μ©ν΄μ νλμ λ€μ΄μ¨ λ°μ΄ν°μ λν΄μ κ²μ¦μ΄ κ°λ₯ν©λλ€.
refine μ Argument λ 첫λ²μ§Έ μΈμλ‘λ κ²μ¦ ν΅κ³Ό μ¬λΆμ΄λ©°, λλ²μ§Έ μΈμλ‘λ refine option μΌλ‘
κΈ°λ³Έμ μΌλ‘ λ©μμ§ μ²λ¦¬μ κ΄λ ¨λ μ΅μ
μ μ λ¬ ν©λλ€.
**/
const zodExampleSchema = z.object({
name: z.string().refine(
(data) => !!data, // data μ name νλμ κ°μ μλ―Ένλ€. ( boolean λ°ν )
{
message: "μ΄λ¦μ μ
λ ₯ν΄μ£ΌμΈμ." // message κ° μ λ¬
}
),
userId: z.string(),
password: z.string(),
phone: z.number()
})
Β
3. μ 체 νλλ₯Ό λμμΌλ‘ ν μ ν¨μ± μ²΄ν¬ λ°©λ²
κ° νλλ§ μ ν¨μ± κ²μ¬νλ κ²½μ° λ€λ₯Έ κ°μ μ°Έμ‘°ν μ μλ μ΄μκ° μμ΅λλ€. μλ₯Ό λ€μ΄ λΉλ°λ²νΈ νλλ₯Ό κ²μ¦νλλ° λΉλ°λ²νΈ νμΈ νλλ₯Ό μ°Έμ‘°νμ¬ κ²μ¦μ ν΄μΌνλ€λ©΄ refine λ§μΌλ‘λ ν΄λΉ κ²μ¦μ ν μ μμ΅λλ€. κ·Έλμ μ¬μ©νλ κΈ°λ₯μ΄ zod μμ μ§μνλ superRefine κΈ°λ₯μΌλ‘ μ¬μ© λ°©λ²μ μλμ κ°μ΅λλ€.
import {z} from 'zod'
/**
superRefine μ κ²½μ° κ° κ°μ²΄μ μ μ©νλ κ²μ΄ μλ zod object λ₯Ό λμμΌλ‘ μ€μ νλ κ²μΌλ‘,
μλμ κ°μ΄ z.object μ μΆκ° μ΅μ
μΌλ‘ superRefine μ μ μ©ν μ μμ΅λλ€.
Parameter λ‘ μ²«λ²μ§Έ μΈμλ μ 체 νλμ λ°μ΄ν°λ₯Ό κ°κ³ μλ κ°μ²΄μ΄λ©°, λλ²μ§Έ μΈμλ zod μ
context λ₯Ό Parameter λ‘ μ λ¬λ°κ² λ©λλ€. ν΄λΉ νλͺ©μ ν΅νμ¬ κ²μ¦ ν΅κ³Ό μ¬λΆλ₯Ό boolean νμΌλ‘
λ°ννκ² λ©λλ€.
**/
const zodExampleSchema = z.object({
userId: z.string(),
password: z.string(),
rePassword: z.string()
}).superRefine((data, ctx) => {
if(data.password !== data.rePassword) {
ctx.addIssue({
message: "λΉλ°λ²νΈκ° μΌμΉνμ§ μμ΅λλ€.",
code: z.ZodIssueCode.custom,
path: ['password']
})
return false
}
return true
})
Β
4. μ΅μ’ μ€ν€λ§ λ°μ΄ν° κ°κ³΅ λ°©λ²
zod κ²μ¦ ν formData λ‘ μ λ¬μ΄ λλ κ³Όμ μμ λ°μ΄ν° λ³ν λ° μΆκ° λΆλΆμ΄ λ°μν μ μμ΅λλ€. κ·Έλ΄λ μ°λ κΈ°λ₯μΌλ‘ zod μ transform μ μ¬μ©ν μ μμΌλ©°, κ²μ¦ ν λ°μ΄ν°λ₯Ό μ€ν€λ§μμ λ°νν λ μ΅μ’ κ°μΌλ‘ λ³Ό μ μμ΅λλ€. λ¬Όλ‘ κ²μ¦ μ μ λ°μ΄ν°λ₯Ό κ°κ³΅ν λ€μ superRefine μ μ΄μ©νμ¬ μ ν¨μ± κ²μ¦λ κ°λ₯ν©λλ€. transform μ¬μ© λ°©λ²μ μλμ κ°μ΅λλ€.
Β
5. νμ μΆλ‘ λ°©λ²
zod μ μ€ν€λ§λ₯Ό Typescript λ‘ λ³ννλ κΈ°λ₯μ μ 곡νκ³ μμΌλ©°, λ°©λ²μ μλμ κ°μ΅λλ€.
Β