API HTTP validator μ΅μ ν
Sonamuλ REST μμ²μ μ΅μ’fastifyCaster validatorλ₯Ό handler μλͺ
λμ ν λ²λ§ λ§λλλ€. μ΄
μΊμλ κΈ°λ³Έ λμμ΄λ©° λ³λ μ€μ μ΄ νμνμ§ μμ΅λλ€. zod-compilerλ κ·Έ μ΅μ’
validatorλ₯Ό
μΆκ°λ‘ μ»΄νμΌνλ opt-in κΈ°λ₯μ
λλ€.
μ€μ
sonamu.config.ts
- μ€μ μ΄ μκ±°λ
zodCompiler: falseμ΄λ©΄ cached plain Zodλ₯Ό μ¬μ©ν©λλ€. jitλ μ₯κΈ° μ€ν Node.js μλ²μ μ ν©ν©λλ€. μλ²κ° routeλ₯Ό μ€λΉν λ eager compileνλ©°, μ»΄νμΌμ μ€ν¨νλ©΄ 첫 μμ²μ΄ μλλΌ μλ² μμμ΄ μ€ν¨ν©λλ€.aotλpnpm sonamu build apiμμ μμ± registryλ§ μ»΄νμΌν©λλ€. κ°λ° μλ²λ κ°μ μ€μ μμλ cached plain Zodλ₯Ό μ¬μ©νλ©°, νλ‘λμ μμ μ registry fingerprintμ route coverageλ₯Ό νμΈν©λλ€.- Webκ³Ό Expo compiler targetμ μμ§ μ 곡νμ§ μμΌλ©° νμ μμ μΌλ‘ λ―Έλ£Ήλλ€.
- μ΄λ² API μ μ© λ¨κ³μμλ
validation.zodCompiler.apiλ§ μ€μ ν μ μκ³ ,validation.zodCompiler.targetsλ μ€λ₯λ‘ κ±°λΆν©λλ€.
As-isμ To-be
μλ €μ§ λμ μ°¨μ΄
zod-compiler 1.23.6μ recordμμ enumerable string keyλ§ μννκ³ , μΌλΆ containerλ μ
λ ₯
referenceλ₯Ό μ μ§νλ©°, per-call parse optionμ 무μν©λλ€. Schema-level errorμ z.config()λ
κ·Έλλ‘ μ μ©λ©λλ€. μμΈν μ°¨μ΄λ
zod-compilerμ Behavioral Differencesλ₯Ό
μ°Έμ‘°νμΈμ. Sonamu HTTP validatorκ° μ¬μ©νλ λν coercionκ³Ό μ€λ₯ κ²½λ‘λ benchmark parityλ₯Ό
ν΅κ³Όνμ§λ§, μ ν리μΌμ΄μ
μ΄ container identityλ symbol keyμ μμ‘΄νλ€λ©΄ opt-in μ μ λ³λλ‘
νμΈν΄μΌ ν©λλ€.
λλλ¦¬λ €λ©΄ validation.zodCompilerλ₯Ό μ κ±°νκ±°λ falseλ‘ λ°κΎΈκ³ API packageμ
zod-compiler κ°λ° μμ‘΄μ±μ μ κ±°ν λ€μ syncμ buildλ₯Ό λ€μ μ€νν©λλ€. Syncκ° μμ±λ AOT
registryλ₯Ό μμ νλ©°, handler cacheμ κΈ°μ‘΄ BadRequestException/ZodError κ³μ½μ μ μ§λ©λλ€.
μ€μΈ‘ 쑰건과 κ²°κ³Όλ μ μ₯μμ docs/benchmarks/zod-compiler-http-validation.mdλ₯Ό μ°Έμ‘°νμΈμ. λ€μ μ€νν
5ν benchmarkμμ eager JITλ validator-only median p95λ₯Ό 58.7%, AOTλ 58.0% μ€μμ§λ§,
Fastify inject κ³μΈ΅μμλ λ λ€ 10% κΈ°μ€μ λμ§ λͺ»νμ΅λλ€. λ°λΌμ compiler modeλ opt-inμΌλ‘
μ μ§ν©λλ€.
Zodλ?
νμ μμ μ€ν€λ§
TypeScript νμ
μλ μΆλ‘ λ³λ νμ
μ μ λΆνμ
λ°νμ κ²μ¦
μ€ν μ λ°μ΄ν° κ²μ¦ μλͺ»λ λ°μ΄ν° μ°¨λ¨
μμΈν μλ¬
νλλ³ μλ¬ λ©μμ§ λλ²κΉ
μ©μ΄
λ³ν & κΈ°λ³Έκ°
λ°μ΄ν° λ³ν λ° κΈ°λ³Έκ° μ μ°ν μ²λ¦¬
κΈ°λ³Έ μ¬μ©λ²
Zod μ€ν€λ§λ Entityμμ μλ μμ±λμ§λ§, μ§μ μ μν μλ μμ΅λλ€.μ€ν€λ§ μ μ
λ°μ΄ν° κ²μ¦
parse vs safeParse:
parse(): μλ¬λ₯Ό λμ§λλ€. try-catchλ‘ μ²λ¦¬safeParse(): μλ¬λ₯Ό λ°νν©λλ€. result.successλ‘ μ²΄ν¬
parse()λ₯Ό μ¬μ©νμ¬ μλμΌλ‘ 400 μλ¬λ₯Ό λ°ννκ³ , UIμμλ safeParse()λ‘ μμ νκ² μ²λ¦¬ν©λλ€.κΈ°λ³Έ νμ κ²μ¦
Entityμ κ° νμ λ³ Zod κ²μ¦μ λλ€.λ¬Έμμ΄ κ²μ¦
μ«μ κ²μ¦
λ μ§ κ²μ¦
λΆλ¦° κ²μ¦
λ³΅ν© νμ κ²μ¦
λ°°μ΄
κ°μ²΄
Enum
Union (μ¬λ¬ νμ μ€ νλ)
κ³ κΈ κ²μ¦ ν¨ν΄
μ‘°κ±΄λΆ κ²μ¦
λ°μ΄ν° λ³ν
κΈ°λ³Έκ° μ€μ
μ€μ κ²μ¦ ν¨ν΄
API νλΌλ―Έν° κ²μ¦
λΉμ¦λμ€ λ‘μ§ κ²μ¦
Form κ²μ¦
μλ¬ μ²λ¦¬
ZodError ꡬ쑰
μλ¬ λ©μμ§ μ»€μ€ν°λ§μ΄μ§
μλ¬ ν¬λ§·ν
μ±λ₯ μ΅μ ν
μ€ν€λ§ μ¬μ¬μ©
λΆλΆ κ²μ¦
λ€μ λ¨κ³
E2E Type Safety
μλν¬μλ νμ
μμ μ±
Entity Types
Entity νμ
λ³ν
Generated Types
μμ± νμ
νμ©
Model Testing
Zod κ²μ¦ ν
μ€νΈνκΈ°