[Go] Validate with regex in the go-playground/validator

nzero·2024년 1월 17일
0

Where is the Book

목록 보기
1/6

Go에서 가장 널리 사용되는 validator 패키지인 go-playground/validator에는 공식적으로 정규표현식 옵션을 지원하지 않는다.

구현하는 api 중 특정 필드의 값이 대문자 한글자 + 숫자 12개로 이루어져있어 정규표현식 외에는 달리 검증할 방법이 떠오르지 않아 편법으로 validation을 추가했다.


validator 구조체 생성

validator.go

package utils

import (
	"regexp"

	"github.com/go-playground/validator/v10"
)

func NewValidator() *Validator {
	v := validator.New()
	v.RegisterValidation("bookIdValidation", validateBookId)

	return &Validator{
		validator: v,
	}
}

type Validator struct {
	validator *validator.Validate
}

func (v *Validator) Validate(i interface{}) error {
	return v.validator.Struct(i)
}

func validateBookId(fl validator.FieldLevel) bool {
	bookId := fl.Field().String()
	idPattern := `^S\d{12}$`
	reg := regexp.MustCompile(idPattern)
	result := reg.MatchString(bookId)
	return result
}

echo에 생성한 validator 설정

router.go

func Router() *echo.Echo {
	e := echo.New()
	...
	e.Validator = utils.NewValidator()
	...
    return e
}

Validator 적용

hadler.go

...

type SearchBook struct {
	ID string `json:"id" validate:"bookIdValidation"`
}

...

func StockHandler(c echo.Context) error {
	var searchBook SearchBook
	err := c.Bind(&searchBook)
	if err != nil {
		return c.String(http.StatusBadRequest, "Invalid Request")
	}

	err = c.Validate(searchBook)
	utils.HandleErr(err)

	bookStocks := makeStockResult(searchBook.ID)
	return c.JSON(http.StatusOK, bookStocks)
}

...

Validator 적용 확인

참조
Go Validator v10
Override existing validator
Golang echo realworld example app

0개의 댓글