Govalidator를 사용하여 Go 구조체 유효성 검사

Govalidator를 사용하여 Go 구조체 유효성 검사

구조체는 Go 프로그래밍 언어에서 제공되는 기본적이고 널리 사용되는 데이터 유형 중 하나입니다. 데이터베이스 패키지에서 ORM에 이르기까지 다양한 기능의 많은 패키지와 일부 웹 프레임워크는 쉬운 데이터 구문 분석 및 기타 작업을 위해 구조체를 사용합니다.

구조체 유효성 검사는 Go의 일반적인 작업이며 Go 유효성 검사기 패키지는 프로젝트에서 구조체의 유효성을 검사하는 간단하고 효율적인 방법을 제공합니다.

Go Validator 패키지란?

유효성 검사기 패키지용 github 미리보기

Go 유효성 검사기 패키지 는 구조체 선언에 지정된 태그를 기반으로 구조체 및 개별 필드에 대한 값 유효성 검사를 구현합니다.

Go 유효성 검사기 패키지는 다차원 필드 유효성 검사, 사용자 정의 필드 유효성 검사, 사용자 정의 필드 이름 추출, 사용자 정의 가능한 오류 메시지, 패키지의 기본 유효성 검사기로 널리 사용되는 Gin 프레임워크를 지원합니다.

작업 디렉터리의 터미널에서 다음 명령 중 하나를 실행하여 유효성 검사기 패키지를 설치합니다.

go get gopkg.in/go-playground/validator.v9
go get github.com/go-playground/validator/v10

버전은 URL의 접미사입니다. 첫 번째 명령은 버전 9를 설치하고 두 번째 명령은 패키지 버전 10을 설치합니다.

패키지를 설치한 후 설치한 버전에 따라 패키지를 프로젝트로 가져올 수 있습니다.

import (
    "gopkg.in/go-playground/validator.v9"
)

이제 Go 유효성 검사기 패키지를 계속 사용할 수 있습니다. 설치에 문제가 있는 경우 최신 Go 버전으로 다시 설치/업그레이드해 보세요.

유효성 검사기 패키지로 구조체 유효성 검사

validator.Validate 구조체 의 인스턴스를 만들고 필드에 대한 유효성 검사 규칙을 지정하는 유효성 검사 태그를 사용하여 유효성을 검사하려는 구조체를 정의해야 합니다.

다음은 validator.Validate 구조체 의 인스턴스를 만드는 방법 입니다.

func main() {
    validate: = validator.New()
}

필드에 대한 태그를 지정하여 유효성 검사 규칙을 설정하여 유효성을 검사하려는 구조체를 정의할 수 있습니다. 유효성 검사 태그는 규칙을 지정하는 구조체 필드 정의의 특수 주석입니다.

다음은 유효성 검사를 위한 일반 구조체입니다.

type User struct {
    Name string
    Age int
    Email string
}

다음은 유효성 검사 준비가 된 구조체의 예입니다.

type User struct {
    Name string `validate:"required"`
    Age int `validate:"gte=0,lte=130"`
    Email string `validate:"required,email"`
}

이 예제에서는 이름 필드를 인스턴스화에 필요한 것으로 지정했고 나이 필드는 0보다 크거나 같고 130보다 작거나 같아야 하며 이메일 필드는 필수이며 인스턴스화에 유효한 이메일 주소여야 합니다.

필수 필드, 최소값 및 최대값, 정규식에 대한 태그를 포함하여 Go 유효성 검사기 패키지에서 다양한 유효성 검사 태그를 사용할 수 있습니다. Go 유효성 검사기 패키지 설명서에서 사용 가능한 유효성 검사 태그의 전체 목록을 찾을 수 있습니다.

유효성을 검사하려는 구조체를 정의하고 각 필드에 대한 유효성 검사 규칙을 지정했으면 validator.Validate 구조체의 Struct 메서드를 사용하여 구조체를 유효성 검사할 수 있습니다.

user: = User{
    // Name not instantiated
    Age: 3990000,
    Email: "john@example.com",
}
// note that the Name and Age fields fail the validation

err: = validate.Struct(user)
if err! = nil {
    // Struct is invalid
}

Struct 메서드 는 유효성 검사 오류가 있는 경우 오류를 반환하며 작업에 따라 오류를 처리할 수 있습니다.

오류의 ValidationErrors 메서드를 사용하여 이러한 오류에 액세스할 수 있습니다 .

if err! = nil {
    for _, err: = range err.(validator.ValidationErrors) {
        fmt.Println(err.Field(), err.Tag())
    }
}

ValidationErrors 메서드 는 유효성 검사 오류가 있는 각 필드의 이름과 오류를 일으킨 유효성 검사 태그를 반환합니다.

오류 출력

사용자 지정 유효성 검사 태그 정의

특정 유효성 검사 요구 사항이 기본 제공 태그의 일부가 아닌 경우 사용자 지정 유효성 검사 태그를 정의할 수도 있습니다.

validator.Validate 구조체 의 RegisterValidation 메서드를 사용할 수 있습니다 . RegisterValidation 메서드는 두 개의 인수를 사용합니다 . 검증 태그의 이름과 검증 함수. 유효성 검사 함수는 사용자 지정 유효성 검사 태그가 있는 각 필드에 대해 호출되는 콜백 함수이며, 이 함수는 필드가 유효하면 true 를 반환하고 그렇지 않으면 false 를 반환해야 합니다.

다음은 사용자 지정 유효성 검사 태그의 정의 예입니다. 태그는 짝수의 필드를 확인합니다.

validate.RegisterValidation("even", func(fl validator.FieldLevel) bool {
    // Try to get the field value as an int
    value, ok: = fl.Field().Interface().(int)
    if! ok {
        // If the field value is not an int, return false
        return false
    }
    // Return true if the value is even, false, otherwise
    return value % 2 == 0
})

이 코드는 validator.Validate 구조체 의 RegisterValidation 메서드를 사용하여 사용자 지정 유효성 검사 태그를 정의합니다 . validator.FieldLevel 유형의 단일 인수를 사용하는 함수를 사용하여 유효성 검사 태그를 정의했습니다 .

이제 내장 유효성 검사 태그와 동일한 방식으로 구조체 정의에서 사용자 지정 유효성 검사 태그를 사용할 수 있습니다.

type MyStruct struct {
    Value int `validate:"even"`
}

더 많은 구조체를 사용할 수 있습니다.

구조체는 Go에서 일급 시민이며 구조체로 할 수 있는 일이 너무 많습니다. 순전히 객체 지향 언어에 익숙하다면 Go 구조체를 사용하여 클래스에서와 마찬가지로 데이터를 조작할 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다