μœ νš¨μ„± 체크 방법


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 둜 λ³€ν™˜ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜κ³  있으며, 방법은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

Β