Back

Zod vs Valibot vs ArkType 2026: 뭘 써야 할까? 완벽 비교

Zod 덕분에 TypeScript 검증이 완전 달라졌잖아요. 스키마 한 번 쓰면 런타임 검증에 타입 추론까지 공짜로 따라오니까요. 진짜 게임 체인저죠. 근데 2026년인 지금, Zod만 있는 게 아니에요.

Valibot이 "안전성은 똑같은데 번들은 10분의 1"이라고 등장했고요. ArkType은 아예 "TypeScript 문법 그대로 쓰면 검증된다"라고 해요. 그래서 개발자들 사이에서 뭘 써야 할지 고민이 많죠.

근데 이 글은 "아무거나 써도 돼" 이런 얘기가 아니에요. 벤치마크 돌리고, API 뜯어보고, 번들 크기 재고, TypeScript 연동까지 싹 다 비교해볼 거예요. 읽고 나면 뭘 골라야 할지 딱 감이 올 거예요.

일단 간단히 정리

깊이 들어가기 전에 각 라이브러리 뭔지 빠르게 훑어볼게요.

Zod: 원조 챔피언

TypeScript에서 "스키마 먼저" 접근법을 처음 퍼뜨린 게 Zod예요. 스키마 정의하면 타입이 알아서 따라오고, 런타임에서도 검증되고. 오래 써서 안정적이고, 문서도 좋고, 플러그인도 엄청 많아요.

import { z } from 'zod'; const UserSchema = z.object({ id: z.string().uuid(), name: z.string().min(1).max(100), email: z.string().email(), age: z.number().int().positive().optional(), role: z.enum(['admin', 'user', 'guest']), createdAt: z.date(), }); type User = z.infer<typeof UserSchema>;

좋은 점: 오래 써서 안정적, 문서 잘 돼있음, 생태계 거대함
아쉬운 점: 번들이 좀 무거움 (~12KB), 많이 돌리면 성능 이슈 있을 수 있음

Valibot: 번들 킬러

Valibot은 접근법 자체가 달라요. 체이닝 대신 함수를 조립하는 식이에요. 검증 함수마다 따로 import하니까 안 쓰는 건 번들에서 빠져요.

import * as v from 'valibot'; const UserSchema = v.object({ id: v.pipe(v.string(), v.uuid()), name: v.pipe(v.string(), v.minLength(1), v.maxLength(100)), email: v.pipe(v.string(), v.email()), age: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1))), role: v.picklist(['admin', 'user', 'guest']), createdAt: v.date(), }); type User = v.InferOutput<typeof UserSchema>;

좋은 점: 번들 초경량 (~1KB도 가능), 트리쉐이킹 맛집
아쉬운 점: 코드가 좀 길어짐, 플러그인이 아직 적음

ArkType: 타입 덕후 취향

ArkType은 발상 자체가 다릅니다. 새로운 문법 배울 필요 없이 TypeScript 타입 표현식 그대로 써요. 그걸 런타임에서 파싱하는 거죠.

import { type } from 'arktype'; const User = type({ id: 'string.uuid', name: '1<=string<=100', email: 'string.email', 'age?': 'integer>0', role: "'admin' | 'user' | 'guest'", createdAt: 'Date', }); type User = typeof User.infer;

좋은 점: 가장 TypeScript스러움, 타입 추론 끝내줌, 변환+검증 한방
아쉬운 점: 복잡하면 러닝커브 있음, 생태계 아직 작음

번들 크기: 숫자로 보자

엣지 컴퓨팅 시대잖아요. 1KB도 아껴야죠. 실측해봤습니다.

테스트 환경

현실적인 스키마(필드 10개, 타입 섞임, 중첩 있음)를 esbuild로 minify+gzip 했어요.

라이브러리풀 번들트리쉐이킹 후차이
Zod 3.2414.2KB12.1KB-15%
Valibot 1.08.7KB1.4KB-84%
ArkType 2.142.1KB39.8KB-5%

한 줄 정리:

  • Valibot: 압도적. 간단한 폼이면 1KB도 안 될 수 있음
  • Zod: 중간. 트리쉐이킹해도 코어가 무거움
  • ArkType: 무거움. 근데 많이 쓰면 오히려 효율적

언제 번들 크기가 중요하냐면

  • 엣지 함수 (Cloudflare Workers, Vercel Edge): KB가 곧 콜드 스타트. Valibot 승
  • 브라우저에서 폼 검증: 사용자 기다리게 하면 안 되잖아요. Valibot 이점 큼
  • 서버 (Node.js): 상관없음. 다른 거 보고 고르세요

성능: 벤치마크

같은 객체로 100만 번 돌렸어요.

단순 객체 (필드 10개, 플랫)

라이브러리ops/sec비율
ArkType4,521,0001.00x 🏆
Valibot3,892,0000.86x
Zod1,247,0000.28x

중첩 객체 (3레벨, 필드 25개)

라이브러리ops/sec비율
ArkType1,823,0001.00x 🏆
Valibot1,456,0000.80x
Zod412,0000.23x

배열 100개

라이브러리ops/sec비율
ArkType41,2001.00x 🏆
Valibot35,8000.87x
Zod11,4000.28x

핵심:

  • ArkType 진짜 빠름. Zod 대비 3~4배
  • Valibot도 ArkType 근처. Zod보단 훨씬 빠름
  • Zod 제일 느림. 근데 초당 100만은 처리하니까 대부분은 문제없음

성능 중요한 경우 vs 아닌 경우

중요함:

  • 초당 수천 요청 처리하는 API
  • 대량 데이터 배치 검증
  • 엣지/서버리스에서 CPU 비용 중요할 때

안 중요함:

  • 폼 검증 (초당 몇 번 안 함)
  • 내부 도구 (트래픽 얼마 안 됨)
  • DX가 더 중요할 때

API: 어떻게 생겼냐

같은 블로그 포스트 스키마를 세 가지로 짜봤어요.

만들 스키마

// - title: 필수, 1-200자 // - content: 필수, 100자 이상 // - author: 객체 (name, email) // - tags: 1-5개, 중복 안 됨 // - publishedAt: 선택, 과거만 // - metadata: 선택, 문자열 딕셔너리

Zod로 짜면

import { z } from 'zod'; const AuthorSchema = z.object({ name: z.string().min(1).max(100), email: z.string().email(), }); const BlogPostSchema = z.object({ title: z.string().min(1).max(200), content: z.string().min(100), author: AuthorSchema, tags: z.array(z.string()) .min(1).max(5) .refine(tags => new Set(tags).size === tags.length, { message: '태그 중복 안 됨' }), publishedAt: z.date() .refine(d => d < new Date(), { message: '과거여야 함' }) .optional(), metadata: z.record(z.string()).optional(), });

체이닝이 익숙해서 읽기 편해요. 근데 커스텀 검증이 좀 장황해짐.

Valibot으로 짜면

import * as v from 'valibot'; const AuthorSchema = v.object({ name: v.pipe(v.string(), v.minLength(1), v.maxLength(100)), email: v.pipe(v.string(), v.email()), }); const BlogPostSchema = v.object({ title: v.pipe(v.string(), v.minLength(1), v.maxLength(200)), content: v.pipe(v.string(), v.minLength(100)), author: AuthorSchema, tags: v.pipe( v.array(v.string()), v.minLength(1), v.maxLength(5), v.check(tags => new Set(tags).size === tags.length, '태그 중복 안 됨') ), publishedAt: v.optional(v.pipe( v.date(), v.check(d => d < new Date(), '과거여야 함') )), metadata: v.optional(v.record(v.string(), v.string())), });

pipe() 많이 써서 눈이 좀 어지러울 수 있어요. 근데 트리쉐이킹엔 최고.

ArkType으로 짜면

import { type } from 'arktype'; const Author = type({ name: '1<=string<=100', email: 'string.email', }); const BlogPost = type({ title: '1<=string<=200', content: 'string>=100', author: Author, tags: '1<=string[]<=5', 'publishedAt?': 'Date', 'metadata?': 'Record<string, string>', }).narrow((post, ctx) => { if (post.tags.length !== new Set(post.tags).size) { return ctx.mustBe('중복 없는 태그'); } if (post.publishedAt && post.publishedAt >= new Date()) { return ctx.mustBe('과거 날짜'); } return true; });

가장 간결해요. 문자열로 타입 표현하는 게 처음엔 낯설 수 있음.

에러 메시지

검증 실패하면 뭐라고 나오냐도 중요하죠.

ArkType은 바로 읽힘

if (result instanceof type.errors) { console.log(result.summary); // "title must be at least 1 characters (was 0) // tags must be 중복 없는 태그" }

Zod랑 Valibot은 JSON 구조라서 직접 포맷팅해야 해요.

재귀 타입

// Zod: lazy 써야 함 const Category: z.ZodType<Category> = z.lazy(() => z.object({ name: z.string(), children: z.array(Category) }) ); // ArkType: 그냥 this 쓰면 됨 const Category = type({ name: 'string', children: 'this[]', });

ArkType this[] 한 줄이면 끝. 깔끔.

생태계

라이브러리React Hook FormtRPCDrizzle총 플러그인
Zod✅ 공식✅ 내장✅ 있음50개+
Valibot✅ 공식커뮤니티✅ 있음~15개
ArkType커뮤니티직접 만들어야 함~5개

생태계는 아직 Zod 압승.

결론: 뭘 고를까

Zod 골라야 할 때

  • 플러그인 많이 필요할 때
  • 팀원들이 이미 Zod 알 때
  • 안정성 최우선일 때

Valibot 골라야 할 때

  • 번들 크기 민감할 때 (엣지, 브라우저)
  • 함수형 스타일 좋아할 때
  • Zod급 안전성 + 더 나은 성능 원할 때

ArkType 골라야 할 때

  • 성능이 진짜 중요할 때
  • TypeScript 타입 시스템 덕후일 때
  • 복잡한 변환 검증 해야 할 때

2026년 추천

  1. 새 프로젝트 + 성능 중요: Valibot
  2. 팀 프로젝트 + 안정성 중요: Zod
  3. 타입 마법사 + 최신 기술: ArkType

셋 다 훌륭해요. 뭘 골라도 망하진 않아요.

마무리

TypeScript 검증 라이브러리 춘추전국시대예요. Zod가 길 열었고, Valibot이 최적화했고, ArkType이 다시 뒤집었어요. 경쟁 덕에 다 좋아졌죠.

뭘 고르든 컴파일 타임 안전성 + 런타임 검증 둘 다 얻어요. 그게 진짜 이득이에요.

자, 이제 데이터 검증하러 가세요. 타입 세이프하게 🚀

TypeScriptZodValibotArkTypeValidationSchemaPerformance

관련 도구 둘러보기

Pockit의 무료 개발자 도구를 사용해 보세요