Zod는 왜 쓰나요?
팀 내에서 Zod를 사용하고 있는데, Zod는 어떤 라이브러리고 어떤 이점이 있어서 사용하게 됐을까? 에 대해 알아보며 간략하게 정리한 글.
Zod란?
Zod is a TypeScript-first schema declaration and validation library. I'm using the term "schema" to broadly refer to any data type, from a simple string to a complex nested object.
Zod란 TypeScript를 우선으로하는 스키마 선언 및 유효성 검사 라이브러리이다.
여기서 스키마는 데이터 형태와 구조를 나타내는 것으로 TypeScript에서 선언하는 타입과 유사하다고 볼 수 있다.
타입 선언도 하고 유효성 검사도 가능하다는 얘긴데 이게 어떤 장점이 있을지 한줄로는 확 와닿지 않았다. 조금 더 알아보자.
Zod는 왜 쓸까?
Zod is designed to be as developer-friendly as possible. The goal is to eliminate duplicative type declarations. With Zod, you declare a validator once and Zod will automatically infer the static TypeScript type. It's easy to compose simpler types into complex data structures.
Zod의 공식 문서에는 중복된 타입 선언을 제거하는 것이 목표라고 기재되어있다.
여기서 말하는 중복된 타입 선언이 뭘까?
일단... 컴파일 타임에만 타입을 체크하는 TypeScript의 특성 때문에 아쉬움을 느꼈던 적이 있을 것이다. (일단 나)
사용자 입력 폼을 개발할 때를 생각해보자. 🤔
TypeScript로 개발을 한다면, 사용자가 입력하는 값의 타입을 먼저 정의해줄 것이다.
type UserInfo = {
name: string;
age: number;
email: string;
}
여기서 사용자가 입력한 값의 형식이 내가 정의한 타입에 맞지 않다면 경고 문구를 띄우는 기능을 추가한다고 할 떄, TS특성상 위에 정의해준 타입은 유효성 검사 로직에 사용할 수 없고 따로 검사하는 코드를 작성해주어야한다.
입력 형식에 대한 타입 정의, 사용자 입력에 대한 타입 체크를 따로 작성해주어야하는 것이다. 🫠
Zod는 이런 컴파일 시점에만 타입 체크가 가능한 TypeScript의 한계를 보완해주는, 선언과 유효성 검사를 동시에 할 수 있도록 해주는 라이브러리중 하나이다.
Zod 사용하기 - 스키마(Schema) 정의하기
일단 Zod를 사용하기 위해서는 이 스키마를 먼저 정의해주어야한다. 스키마는 테이터의 형태와 구조를 나타내며 기본적인 데이터 타입부터 시작해 더 복잡한 객체와 배열, 커스텀 유효성 검사 규칙까지 정의할 수 있다.
아까 TypeScript로 선언했던 타입을 Zod의 스키마로 정의하면 다음 코드와 같다.
import { z } from 'zod';
const UserSchema = z.object({
name: z.string(),
age: z.number(),
email: z.string().email()
});
이렇게 정의한 스키마는 infer()를 이용해 TypeScript 타입을 추론할 수 있다.
type UserInfo = z.infer<typeof UserSchema>;
Zod 사용하기 - 유효성 검사
정의한 스키마를 사용하여 런타임에 데이터 유효성을 검사할 수 있다. 스키마의 parse() 함수에 검증하고 싶은 값을 넘겨서 호출하면 된다.
try {
const userData = { name: "Alice", age: 30, email: "alice@example.com" };
UserSchema.parse(userData);
console.log("유효한 사용자 데이터");
} catch (error) {
console.error(error);
}
parse()함수는 유효성 검사에 실패하면 ZodError를 throw한다. Error를 throw하기 원하지 않으면 safeParse()를 이용하면 된다.
이렇게 zod를 사용하면 정적 타입 선언도, 런타임 유효성 검사도 스키마 선언 하나로 해결되는 것이다 🎉 야호~
이렇게 간략하게 장점과 사용방법을 알아보았는데 더 자세한 사용방법, 예제는 공식문서에 잘 나와있다.
GitHub - colinhacks/zod: TypeScript-first schema validation with static type inference
TypeScript-first schema validation with static type inference - colinhacks/zod
github.com
조만간 Zod를 이용해 예전에 작성했던, 점점 요구사항이 늘어나고 있는 사용자 정보 입력 폼을 리팩토링 해봐야겠다.