개발하는 너구리

zod 본문

TIL

zod

너구리개발자 2024. 6. 28. 01:34

 

 

 

zod 라이브러리는 TypeScript용으로 설계된 데이터 검증 및 스키마 정의 도구로, 강력한 유효성 검사 기능을 제공합니다. 

 

주요 메서드 

  1. z.string()
    • 문자열 유형을 나타내는 스키마를 생성합니다.
    • 옵션:
      • .min(minLength: number, errorMessage: string): 최소 길이를 지정합니다.
      • .max(maxLength: number, errorMessage: string): 최대 길이를 지정합니다.
      • .regex(regex: RegExp, errorMessage: string): 정규 표현식을 사용하여 문자열을 검사합니다
  2. z.number()
    • 숫자 유형을 나타내는 스키마를 생성합니다.
    • 옵션:
      • .int(): 정수 값인지 검사합니다.
      • .positive(), .negative(), .nonpositive(), .nonnegative(): 숫자의 부호를 검사합니다.
     
  3. z.boolean()
    • 부울 값 (true 또는 false)을 나타내는 스키마를 생성합니다.
     
  4. z.object()
    • 객체를 나타내는 스키마를 생성합니다. 각 필드에 대한 유효성 검사를 추가할 수 있습니다.
     
  5. z.array()
    • 배열을 나타내는 스키마를 생성합니다. 배열 요소에 대한 유효성 검사를 추가할 수 있습니다.
     
  6. .refine()
    • 사용자 지정 조건에 따라 데이터를 추가로 검증합니다. 검증 실패 시 오류 메시지를 반환합니다.
     
  7. .parse() vs .safeParse()
    • .parse(): 유효성 검사 실패 시 에러를 throw합니다.
    • .safeParse(): 유효성 검사 실패 시 에러를 반환하지 않고, 검증 결과 객체를 반환합니다.
     

 

예시 코드

유저네임, 이메일 주소, 비밀번호, confirm password 가 유효한지 검증하는 예시입니다.

 
'use server';

import { z } from 'zod';

const specialRegex = new RegExp(
  /^[^!@#\$%\^&\*\(\)_\+\-\=\{\}\[\]\|\\:;'"<>\?,\.\/`~]*$/
); // []대괄호 안에 있는 특수문자들은 허용하지않는다
const passwordRegex = new RegExp(
  /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).+$/
); //알파벳 소문자,대문자 / 숫자 / 특수문자 최소 1개씩 포함

const formSchema = z
  .object({
    username: z
      .string({
        invalid_type_error: 'Username must be a string.',
        required_error: 'Username must be required',
      })
      .min(3, 'Way too short!!')
      .max(10, 'That is too long!')
      .toLowerCase()
      .trim()
      .regex(specialRegex, 'No special characters allowed.'),
    // regex() : 첫번째인자로 오는 정규표현식을 통과하지못하면, 두번째인자인 에러메시지를 출력
    email: z.string().email().toLowerCase(),
    password: z
      .string()
      .min(10)
      .regex(
        passwordRegex,
        'A password must have lowercase, UPPERCASE, a number and special Characters'
      ),
    confirmPassword: z.string().min(10),
  })
  .refine((data) => data.password === data.confirmPassword, {
    message: 'Both passwords sholud be the same.', // 에러 메시지
    path: ['confirmPassword'], // 에러 메시지를 표시할 위치
  });
//.refine() : password와 confirmPassoword가 같은지 확인하는 유효성검사

export async function createAccount(prevState: any, formData: FormData) {
  const data = {
    username: formData.get('username'),
    email: formData.get('email'),
    password: formData.get('password'),
    confirmPassword: formData.get('confirmPassword'),
  };

  const result = formSchema.safeParse(data);

  if (!result.success) {
    return result.error.flatten();
  } else {
    console.log('result::', result.data);
  }
}

// .parse() : 유효성검사 실패 시 throw error -> try catch와 함께 사용
// .safeParse() : throw error ❌, 결과(객체)를 반환 -> 반환값을 변수에 저장하여 사용
// .flatten() : error의 내용을 보기좋게 변형

'TIL' 카테고리의 다른 글

bcrypt, iron-session  (0) 2024.07.02
prisma  (0) 2024.07.02
@tailwind  (0) 2024.06.27
tailwind css modifier  (0) 2024.06.26
Server Components  (0) 2024.06.25