새소식

반응형
Programming

Zod를 사용한 유효성 검증

  • -
반응형

Zod는 TypeScript를 주로 사용하는 스키마 선언 및 유효성 검사 라이브러리 중 하나입니다. 비슷한 걸로는 Yup, Joi 등의 라이브러리가 있습니다.

Zod에서 "Schema(스키마)" 라고 하는 용어는 단순한 문자열부터 복잡하게 중청된 객체까지 모든 데이터 유형을 포괄적으로 나타내기 위해 사용됩니다.

 

라이브러리 설치

$ yarn add zod

Zod 패키지에서 z 를 불러와 사용 할 수 있으며, z 하나로 Zod의 모든 기능을 활용할 수 있습니다.

import { z } from "zod"

 

스키마 정의

Zod를 사용하기 위해서는 먼저 스키마를 정의해야 합니다.

예를 들어 이름, 나이, 나이공개여부로 이루어진 사용자 객체를 나타내는 스키마를 만들어보겠습니다.

const User = z.object({
  name: z.string(),
  age: z.number(),
  open: z.boolean()
})

z.object()를 사용해서 User 스키마가 객체의 형태이고 z.string()으로 name의 속성을 문자열, z.number()를 사용해서 age 속성을 숫자, open의 속성은 z.boolean()을 사용해서 불리언 형태라고 나타낼 수 있습니다.

 

유효성 검증

스키마를 활용해서 다양한 작업을 할 수 있는데 유효성 검증을 먼저 해보겠습니다. 스키마의 parde() 함수를 사용해서 검증하고 싶은 값을 넘겨서 호출 하면 됩니다.

User.parse({
  name: "홍길동",
  age: 20,
  open: true
}) // 유효성 검증 통과

User.parse({
  email: "홍길동",
  age: "20"
}) // 유효성 검증 실패

검증이 실패하게되면 parse() 함수는 아래와 같이 error를 발생합니다.

// console

ZodError: [
  {
    code: "invalid_type",
    expected: "number",
    received: "string",
    path: ["age"],
    message: "Expected number, received string"
  },
  {
    code: "invalid_type",
    expected: "boolean",
    received: "undefined",
    path: ["open"],
    message: "Required"
  },
]

* 검증이 성공했을 경우 parse() 함수가 반환하는 객체에는 검증이 통과한 속성만 포함됩니다. 스키마에 정의 되지 않은 속성이 입력 객체에 포함된 경우 parse() 함수가 반환한 결과 객체에는 해당 속성이 제외되어 있습니다.

이는 parse() 함수의 반환 타입이 정의된 스키마에 의해서 결정되기 때문에 일어나는 현상입니다.

 

타입추론

Zod는 정의한 스키마를 기준으로 TypeScript 타입을 추론 할 수도 있습니다. 이 기능을 잘 활용하면 별도의 타입을 작성할 필요없이 스키마를 활용해서 타입추론이 가능해집니다.

위의 User를 TypeScript로 작성하려면 아래와 같이 타입을 작성해줘야 합니다.

interface User {
  name: string
  age: number
  open: boolean
}

function processUser(user: User) {
  User.parse(user) // 유효성 검증
  // 로직
}

Zod의 infer 기능을 활용하면 스키마에서 타입을 가져올 수 있습니다.

type User = z.infer<typeof User>

function process(user: User) {
  User.parse(user) // 유효성검증
  // 로직
}

직접 작성한 타입과 스키마가 항상 일치하도록 관리 하는 것은 여간 어려운 일이 아닙니다. infer를 활용하면 항상 스키마와 타입을 일치하게 관리 할 수 있습니다.

 

다양한 스키마정의

Zod 스키마에 포함된 모든 속성을 필수 입력입니다. 이를 선택입력으로 바꾸려면 optional() 검증자를 사용하면 됩니다.

const User = z.object({
  name: z.string(),
  age: z.number(),
  open: z.boolean().optional()
})

이 스키마를 타입추론을 해보면 open속성 뒤에 ? 를 붙이고 타입을 boolean 또는 undifined로 선언한 것과 마찬가지로 표현됩니다.

type User = z.infer<typeof User>
// { name:string; age:number; open?: boolean | undefined; }

기본값 설정

유효성 검증에서 값이 누락되어 있는 속성에 기본값을 주고 싶을때는 default() 검증자를 사용하면 됩니다.

const User = z.object({
  name: z.string(),
  age: z.number(),
  open: z.boolean().default(false)
})

위와 같이 작성하면 open 속성이 없으면 false로 설정할수 있습니다. 

 

 

Referense

https://zod.dev/

https://www.daleseo.com/zod/

https://www.daleseo.com/zod-schema/

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.