Zod vs Yup
어떤 Schema 라이브러리를 쓸까?
기본
| Zod | Yup | |
|---|---|---|
| 주간 다운로드 | 25439만 | 1236만 |
| 최근 릴리스 | 99일 전 | 1279일 전 |
| 유지보수 | 둔화 | 정체 |
| 열린 이슈 | 352 | 249 |
유지보수 상태는 최근 릴리스 간격만으로 판정합니다 (90일 이내 활발 · 270일 이내 둔화 · 그 이상 정체).
쓰다 보면 만나는 것
Zod
- 거슬림
v3는 대형 스키마에서 TypeScript 컴파일과 에디터가 눈에 띄게 느려지고 번들도 크다
체이닝 API 구조 탓에 타입 인스턴스화가 폭발해 대형 스키마에서 tsc·언어 서버가 느려지고, 트리셰이킹도 잘 되지 않는다. v4 공식 발표문이 v3의 문제를 수치로 자인한다 — 같은 파일이 v3에서 25,000회 타입 인스턴스화, v4에서 175회; 불리언 스키마 번들 12.47kb → 5.36kb. v3를 쓰는 대형 프로젝트에는 여전히 해당한다.
2026-08 · 해결됨 (2025-07) · 3.x
해결 근거: zod@4.0.0(2025-07-09, npm 레지스트리 기준)에서 타입 인스턴스화와 번들 구조가 재설계됐다. 수치 출처는 공식 v4 발표문
- 거슬림
중첩 객체의 모든 필드를 재귀적으로 optional 로 만들던 deepPartial 이 v3.21에서 deprecated 되고 v4에서 제거됐으며, 공식은 대체 API 없이 이를 안티패턴으로 규정한다.
z.object 의 .partial() 은 최상위 한 겹만 optional 로 만들기 때문에, 중첩된 스키마 전체를 optional 로 바꾸려면 deepPartial 이 필요했다. v4 마이그레이션 가이드는 이 메서드를 제거하며 'no direct alternative to this API'라고 명시하는데, 그 근거로 구현상의 함정(footgun)이 많고 사용 자체가 일반적으로 안티패턴이라는 점을 든다. 따라서 대체 API는 제공되지 않으며, 중첩 부분 스키마가 필요한 사용자는 커뮤니티가 공유한 재귀 유틸을 직접 복사해 쓰는 방식으로 우회한다.
2025-05 · 미해결 · ≥3.21 (deprecated), ≥4.0 (removed)
- 거슬림
Zod 는 첫 오류에서 멈추는 abortEarly 옵션이 없어 모든 검증 규칙이 실행되며, .refine()/.superRefine() 안의 검사도 앞선 필드가 실패한 뒤에 그대로 실행된다.
min/max 같은 앞선 검증이 이미 실패해도 뒤따르는 refine 콜백이 전부 호출되므로, uniqueness 확인용 DB 쿼리나 외부 API 호출을 refine 안에 두면 잘못된 입력에도 그 I/O가 매번 실행된다(dev.to 글은 이를 인증 없이 유발 가능한 DoS 로 설명하고, GitHub 이슈들은 동일 증상에 대한 전역 abortEarly 옵션을 요청한다). 전역 조기중단 옵션이 없으므로, 값 자체 검증이 아닌 비싼 작업은 스키마 밖으로 빼서 parse/safeParse 성공 이후에 실행하는 것이 우회법이며, .refine 의 abort:true 나 .superRefine 로 바꾸는 것은 이 실행 동작을 바꾸지 못한다.
2026-05 · 미해결
Yup
- 거슬림
복잡한 스키마(nullable/optional 필드, 중첩 객체, 조건부 필드·변환)에서 yup의 InferType가 추론한 TypeScript 타입이 실제 검증 결과를 정확히 반영하지 못하는 경우가 있다.
yup.InferType는 nullable 필드나 중첩 객체를 조합하면 실제 스키마와 다른 타입을 내는 경우가 있고(예: nullable 문자열에 .default(null)를 주지 않으면 타입 불일치가 보고됨), object와 shape 사용 방식에 따라 인텔리센스가 제공되지 않거나 인덱스 시그니처 관련 타입 에러가 나기도 한다. 이 때문에 스키마와 별개로 인터페이스를 손으로 선언하거나 우회하는 사례가 있다. 독립 비교 글은 조건부 필드·변환·중첩 객체가 있는 복잡한 스키마에서 추론 타입이 검증 결과를 정확히 반영하지 못한다고 같은 계열의 한계로 서술하고, GitHub 이슈는 object/shape 인텔리센스와 nullable 필드 타입 처리 문제를 개별 재현으로 보고한다.
2026-03 · 미해결