스키마 검증

Zod vs Valibot

어떤 검증 라이브러리를 쓸까?

기본

ZodValibot
주간 다운로드25439만1686만
최근 릴리스99일 전43일 전
유지보수둔화활발
열린 이슈352166

유지보수 상태는 최근 릴리스 간격만으로 판정합니다 (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 · 미해결

Valibot

아직 정리된 항목이 없습니다. 출처가 확보되는 대로 추가됩니다.

이럴 땐 이걸

  • TypeScript 우선·타입 추론 중심 Zod
  • 번들 크기가 민감한 프론트엔드 Valibot

문서 바로가기