Go에서 가장 널리 사용되는 validator 패키지인 go-playground/validator에는 공식적으로 정규표현식 옵션을 지원하지 않는다.
구현하는 api 중 특정 필드의 값이 대문자 한글자 + 숫자 12개로 이루어져있어 정규표현식 외에는 달리 검증할 방법이 떠오르지 않아 편법으로 validation을 추가했다.
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
}
router.go
func Router() *echo.Echo {
e := echo.New()
...
e.Validator = utils.NewValidator()
...
return e
}
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)
}
...

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