Goのvalidatorとozzo-validationの比較

2024/09/29

Webアプリケーション開発において、バリデーションは必須です。

Goのバリデーションライブラリとして有名なものは大きく2つあります。

本記事ではこの2つを比較して、私がozzo-validationを採用した理由を話します。

大きな違い

両者には大きな違いがあります。

まず、validatorはタグベースのバリデータとなっています。

構造体のタグにバリデーションの内容を記述するか、validate.Var に同様の内容を記述することでバリデーションを行います。

type Data struct {
    ID string `validate:"required,uuid4"`
}

data := &Data{
    ID: "3dd943d8-8a4e-4e28-bba8-a4ac8e6ddd7f",
}

validate := validator.New(validator.WithRequiredStructEnabled())

err := validate.Struct(data)
fmt.Printf("%+v\n", err)

s := "a0ea4a4e-1134-4e47-87e0-a7aef7bc364b"

err = validate.Var(&s, "required,uuid4")
fmt.Printf("%+v\n", err)

Go Playground

一方で、ozzo-validationは変数・関数ベースのバリデータです。

type Data struct {
    ID string
}

data := &Data{
    ID: "3dd943d8-8a4e-4e28-bba8-a4ac8e6ddd7f",
}

err := validation.ValidateStruct(data,
    validation.Field(&data.ID, validation.Required, is.UUIDv4),
)
fmt.Printf("%+v\n", err)

s := "a0ea4a4e-1134-4e47-87e0-a7aef7bc364b"

err = validation.Validate(&s, validation.Required, is.UUIDv4)
fmt.Printf("%+v\n", err)

Go Playground

validationの場合はタグの入力ミスや型の間違いが起こり得ますが、ozzo-validationでは変数や関数を用いているため、そのような問題は発生しづらいです。

私は簡単かつ少ないミスでバリデーションを行いたかったため、ozzo-validationを選定しました。

細かな違い

validationはライブラリ内に正規表現を内包していますが、ozzo-validationはgovalidatorを用いて実装しています。

また、validationはテストコードがあまり多くなく、カバレッジは74%です。

一方で、ozzo-validationはテストコードが多く、カバレッジは99%にまで達しています。

Star数

執筆時点(2024/09/29)では、以下のStar数になっています。

  • validator: 16.6k
  • ozzo-validation: 3.7k

先発のvalidatorの方がよく利用されていることがわかるので、新しいライブラリを使うのに抵抗がある方はこちらのほうがいいかもしれません。

しかしながら、ozzo-validationの方が実装もメンテも容易になるので、可能であればこちらを使用したほうがいいと個人的に思います。

まとめ

ozzo-validationは実装の容易性やミスの起きづらさが利点ですが、validatorは採用実績の多さがあります。

これらの違いから要件に応じて選定することで、快適にバリデーションを実装できれば幸いです。

Publish on 2024/09/29