Slide 1

Slide 1 text

© - BASE, Inc. Go製APIの Validation error handling . . #gouncon kg Go Un Conference kg - @hgsgtk

Slide 2

Slide 2 text

© - BASE, Inc. このトークで持ち帰れること • Goでのバリデーションハンドリングの実例 • ネット上でなかなか⾒つからない(個⼈談) • UseCase: HTTPリクエスト時‧DB保存時 • Question/Suggestionください • 即時に反映されるかも知れません

Slide 3

Slide 3 text

© - BASE, Inc. ⾃⼰紹介 東⼝和暉 (Kazuki Higashiguchi) Twitter / GitHub : @hgsgtk バックエンドエンジニア BASE BANK, Inc. / Dev Division Go歴: - 趣味:2017.7〜 - 仕事:2018.6〜

Slide 4

Slide 4 text

© - BASE, Inc. 前提:全体パッケージ構成とUseCase バリデーション発⽣箇所 バリデーション発⽣箇所

Slide 5

Slide 5 text

© - BASE, Inc. こんな感じのバリデーションエラーを返したい

Slide 6

Slide 6 text

© - BASE, Inc. バリデーション実装全体像

Slide 7

Slide 7 text

© - BASE, Inc. バリデーション実装STEP >

Slide 8

Slide 8 text

© - BASE, Inc. Step Validatorを作成する > 使⽤ライブラリ • go-playground/validator • https://github.com/go-playground/validator • ginフレームワークで公式採⽤されている • →このライブラリをwrapした validation パッケージ を作成

Slide 9

Slide 9 text

© - BASE, Inc. go-playground/validatorの利⽤例 こんな感じで validate タグ設定できる

Slide 10

Slide 10 text

© - BASE, Inc. Step : Validatorを作成する > validation パッケージ • go-playground/validator を各種import

Slide 11

Slide 11 text

© - BASE, Inc. Step : Validatorを作成する • NewRequestValidator: Request Validator • NewDBValidator: Database Validator

Slide 12

Slide 12 text

© - BASE, Inc. バリデータを作成する NewValidator() Step : Validatorを作成する

Slide 13

Slide 13 text

© - BASE, Inc. カスタムエラーメッセージの定義 デフォルトは構造体名が出る → タグ名に変更 Step : Validatorを作成する

Slide 14

Slide 14 text

© - BASE, Inc. Step : Validatorを作成する > tagNameFuncの作成 • tagNameFuncを作成 • See also: https://github.com/go-playground/ validator/issues/ •

Slide 15

Slide 15 text

© - BASE, Inc. Step : Validatorを作成する > 作成されたValidator

Slide 16

Slide 16 text

© - BASE, Inc. バリデーション実装STEP >

Slide 17

Slide 17 text

© - BASE, Inc. Step : バリデーション実⾏

Slide 18

Slide 18 text

© - BASE, Inc. Step : カスタムタグ登録

Slide 19

Slide 19 text

© - BASE, Inc. Step : カスタムタグを作って利⽤する • “inlist”というタグを作る例

Slide 20

Slide 20 text

© - BASE, Inc. Step : カスタムタグを作って利⽤する • “inlist”というタグを作る例 “Inlist”タグは、 “inStatusList()”というルールを実⾏

Slide 21

Slide 21 text

© - BASE, Inc. バリデーション実装STEP >

Slide 22

Slide 22 text

© - BASE, Inc. Step : バリデーション結果 • error interfaceを満たした独⾃エラー型を作成する • 独⾃エラー型は、GetDetail()をシグネチャに持つ

Slide 23

Slide 23 text

© - BASE, Inc. Step : バリデーション結果 > バリデータが返すバリデーション結果

Slide 24

Slide 24 text

© - BASE, Inc. Step : バリデーション結果 > バリデータが返すバリデーション結果 Detail内に バリデーション結果が含まれる

Slide 25

Slide 25 text

© - BASE, Inc. バリデーション実装STEP >

Slide 26

Slide 26 text

© - BASE, Inc. Step : バリデーション結果を利⽤ > 構造体への設定 • バリデーションしたい構造体に validate タグを設定 • 構造体⾃⾝がvalidatorを実⾏する振る舞いを持つ

Slide 27

Slide 27 text

© - BASE, Inc. Step : バリデーション結果を利⽤ > エラー結果を利⽤ • error 型で返却される • validation.Error interface型か判定

Slide 28

Slide 28 text

© - BASE, Inc. Step : バリデーション結果を利⽤ > エラーレスポンス

Slide 29

Slide 29 text

© - BASE, Inc. Step : バリデーション結果を利⽤ > こんな感じのバリデーションエラーを返る

Slide 30

Slide 30 text

© - BASE, Inc. Step : バリデーション結果を利⽤ > DB保存時のバリデーション

Slide 31

Slide 31 text

© - BASE, Inc. Step : バリデーション結果を利⽤ > DB保存時のバリデーション INSERTのSQL実⾏前に バリデーション

Slide 32

Slide 32 text

© - BASE, Inc. まとめ • ネット上にGoでのバリデーションハンドリングの実 例を晒した • Question/Suggestionください • 即時に反映されるかも知れません

Slide 33

Slide 33 text

Any Question or Suggestion?