Zod 4.5가 런타임 컴파일로 검증 속도를 최대 9배 높였다
TypeScript 우선 스키마 검증 라이브러리 Zod가 4.5와 4.6을 연달아 내놓으며 런타임 컴파일이라는 새 실행 경로를 추가했다. 2026년 8월 28일 공개된 4.5의 핵심은 z.compile()로, 작성한 스키마를 미리 컴파일된 검증기로 바꿔 같은 데이터를 3~9배 빠르게 처리한다. 9월 9일 나온 4.6은 불리언만 돌려주는 .validate()를 더하고, 4.5에서 생긴 재귀 스키마 관련 메모리 문제를 고쳤다.
메모리 쪽 변화도 크다. 인스턴스마다 메서드를 따로 할당하지 않고 바인딩된 메서드를 캐시하면서, 빈 z.string() 하나가 차지하는 힙 메모리가 기존 7.5KB에서 784바이트로 줄었다. 대략 9분의 1 수준이다. 검증 실패 시 safeParse()가 스택 트레이스를 수집하지 않게 바뀐 것도 비용 절감에 영향을 줬는데, 무효 입력을 거부하는 비용이 약 7.5배 낮아졌다는 설명이다.
공개된 Moltar parseSafe 벤치마크에서 컴파일된 Zod는 초당 4750만 회 연산을 기록해 Typia(4530만 회)를 근소하게 앞섰고, Valibot(180만 회)과 ArkType(15.2만 회)과는 큰 격차를 보였다. 다만 4.5와 함께 배포된 순수 불리언 검증 벤치마크에서는 Typia와 ArkType이 여전히 컴파일된 Zod보다 앞선다. 이 수치들은 공개 시점의 스냅숏이며 4.6의 .validate() 경로를 반영한 최신 비교가 아니다. 개발자 Mehul Mohan은 객체와 배열에서 나타난 약 10배 개선을 두고 실제 성능 도약이라고 평가했다.
Zod는 Colin McDonnell이 만들었고 주간 다운로드가 3000만 회를 넘으며 tRPC, React Hook Form, 여러 백엔드 프레임워크가 기본 지원한다. 이번 컴파일은 빌드 타임이 아니라 프로세스 안에서 지연 수행되기 때문에 번들러 플러그인이나 코드 생성 단계를 붙일 필요가 없다. 전역으로 적용하려면 진입 파일 최상단에 import "zod/compile"을 넣거나 node --import zod/compile app.js로 실행하면 되고, 이후 각 스키마는 데이터를 처음 파싱하는 시점에 컴파일된다.
컴파일된 스키마는 원본과 동작이 같아 마이그레이션 비용이 없다는 점이 실무적으로 중요하다. 4.5에서는 z.deepPartial()이 복원되고 .exactPartial(), z.creditCard(), z.input()/z.output(), 재귀 스키마에서의 순환 데이터 지원, 8개 오류 메시지 로케일이 추가됐다. 4.6은 클래스 인스턴스 속성 검증, z.fromJSONSchema()의 검증 키워드 6개, z.iban()을 더했다. 새 .validate()는 첫 문제에서 멈추고 파싱 결과나 ZodError를 만들지 않는데, 컴파일을 켠 상태에서 무효 입력을 처리할 때 .safeParse().success 대비 최대 35배 빠르다고 발표 측은 밝혔다. 이는 일반 파싱 성능이 35배가 됐다는 뜻이 아니다.
주의할 지점도 분명하다. z.compile()은 new Function에 의존하므로 콘텐츠 보안 정책(CSP)이 이를 막는 환경에서는 쓸 수 없다. 이때는 z.withParser()로 외부에서 생성한 파서를 설치할 수 있지만, 이 메서드 자체가 파서를 만들어 주지는 않는다. 또한 4.5의 재귀 스키마가 이미 파싱한 데이터를 계속 붙들어 메모리를 소진할 수 있던 회귀 문제는 4.6에서 수정된 만큼, 컴파일 기능을 쓰려는 팀은 4.6 이상으로 올리는 편이 안전하다. 변환된 출력이나 상세한 오류 정보가 필요한 경우에는 .validate()가 기존 메서드를 대체하지 못한다.