ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Zod, 단순한 폼 검증을 넘어서: TypeScript 개발의 비밀 병기!
    Javascript 2024. 9. 2. 20:45

     

     

    안녕하세요! 오늘은 TypeScript 개발자들 사이에서 큰 인기를 끌고 있는 Zod라는 라이브러리에 대해 이야기해보려고 합니다.

     

    Zod는 처음에는 폼 유효성 검증 도구로 널리 알려졌지만, 이 라이브러리는 그 이상으로 강력한 가능성을 지니고 있습니다.

     

    이번 글에서는 Zod가 단순한 폼 검증을 넘어서 어떻게 다양한 분야에서 활용될 수 있는지, 그리고 실제 코드 예시와 함께 그 기능을 알아보겠습니다.

     

    Zod의 강력한 기능들

    Zod는 단순히 폼 데이터를 검증하는 데 그치지 않고, 다양한 유용한 기능을 제공합니다.

     

    예를 들어, Zod를 사용해 환경 변수(env) 검증을 수행할 수 있는데요, 이는 런타임 오류를 방지하고 개발 초기 단계에서 문제를 잡아내는 데 큰 도움이 됩니다.

    import { z } from 'zod';
    
    // 환경 변수 스키마 정의
    const envSchema = z.object({
      NODE_ENV: z.enum(['development', 'production', 'test']),
      PORT: z.string().regex(/^\d+$/).transform(Number),
    });
    
    // 환경 변수 검증
    const env = envSchema.parse(process.env);
    
    console.log(env.NODE_ENV); // 'development', 'production' 또는 'test'
    console.log(env.PORT); // 숫자로 변환된 포트 번호

     

    위 코드 예시에서 보듯이, Zod를 사용해 환경 변수를 정의하고 검증할 수 있습니다.

     

    이를 통해 개발자는 환경 변수의 오류를 미리 방지할 수 있으며, 코드 작성 시 자동완성 기능을 활용해 더욱 생산성을 높일 수 있습니다.

     

    Zod의 통합성과 확장성

    Zod의 가장 큰 강점 중 하나는 다양한 도구와의 통합이 매우 잘 이루어진다는 점인데요.

     

    예를 들어, Zod 스키마를 OpenAI API에 직접 전달하여 출력 결과를 자동으로 스키마에 맞춰 조정할 수 있습니다.

     

    또한, Zod는 React Hook Form, tRPC, 그리고 다양한 데이터베이스와 API에서도 쉽게 사용할 수 있어, 개발 생산성을 크게 향상시킵니다.

    import { z } from 'zod';
    import { createTRPCClient } from '@trpc/client';
    
    // Zod 스키마 정의
    const userSchema = z.object({
      id: z.string().uuid(),
      name: z.string().min(1),
      email: z.string().email(),
    });
    
    // tRPC 클라이언트 생성
    const client = createTRPCClient({
      url: 'https://api.example.com/trpc',
    });
    
    // API 호출 시 스키마를 통한 입력 검증
    async function fetchUserData() {
      const user = await client.query('getUser', { id: 'some-uuid' });
      const validatedUser = userSchema.parse(user);
      console.log(validatedUser);
    }

     

    이 예시에서 Zod 스키마는 API 호출의 입력 데이터를 검증하고, 오류를 사전에 방지하는 역할을 합니다.

     

    Zod와 다른 라이브러리 비교

    물론 Zod가 모든 상황에서 최선의 선택은 아닐 수 있습니다.

     

    일부 개발자들은 Zod의 문법이 다소 장황하고, 복잡한 스키마를 다룰 때 가독성이 떨어진다고 느끼기도 합니다.

     

    이 경우, Typia나 DeepKit과 같은 대안 라이브러리를 고려해볼 수 있습니다.

     

     

    Typia는 AoT(Ahead-of-Time) 컴파일을 통해 매우 높은 성능을 제공하며, DeepKit은 런타임 리플렉션(reflection) 기능을 추가하여 더욱 강력한 타입 검증을 가능하게 합니다.

     

    // Typia 사용 예시
    import typia from "typia";
    
    type User = {
      id: string;
      name: string;
      email: string;
    };
    
    const isUser = typia.createIs<User>();
    
    console.log(isUser({ id: "uuid", name: "Alice", email: "alice@example.com" })); // true
    console.log(isUser({ id: 123, name: "Alice", email: "alice@example.com" })); // false

     

    위 코드에서 Typia는 TypeScript 타입을 직접 활용하여 런타임 검증을 수행할 수 있도록 도와줍니다.

     

    이는 Zod와는 다른 접근 방식이지만, 특정 상황에서 매우 유용할 수 있습니다.

     

    Zod의 한계와 개선점

    Zod는 매우 유용한 도구이지만, 일부 한계점도 존재합니다.

     

    예를 들어, Zod는 필드 간의 의존성을 처리하는 데 어려움이 있을 수 있습니다.

     

    특히, 필드의 유효성 검사가 다른 필드의 값에 따라 달라지는 경우, Zod의 refine 메서드나 superRefine 메서드를 활용해야 하지만, 이는 코드의 복잡성을 증가시킬 수 있습니다.

     

    이러한 경우, Yup과 같은 라이브러리가 더 적합할 수 있습니다.

    import * as yup from 'yup';
    
    const schema = yup.object().shape({
      password: yup.string().required(),
      confirmPassword: yup.string().oneOf([yup.ref('password'), null], 'Passwords must match'),
    });
    
    schema
      .validate({ password: '123456', confirmPassword: '123456' })
      .then(() => console.log('Valid!'))
      .catch((err) => console.log(err.errors));

     

    이 예시에서 Yup은 필드 간의 의존성을 간단히 처리할 수 있는 .when 메서드를 제공합니다.

     

    마무리하며

    Zod는 폼 검증을 넘어 다양한 입력 데이터를 안전하게 처리하고, 여러 도구와의 통합을 통해 개발 생산성을 높이는 데 큰 도움이 되는 라이브러리입니다.

     

    그러나 특정 상황에서는 다른 라이브러리가 더 적합할 수도 있으므로, 프로젝트의 요구 사항에 따라 적절한 도구를 선택하는 것이 중요합니다.

     

    Zod가 제공하는 강력한 기능들을 잘 활용하여 더욱 안전하고 효율적인 코드를 작성해 보세요!

     

    이제 Zod에 대해 조금 더 이해가 되셨나요?

Designed by Tistory.