Slide 1

Slide 1 text

noru connect- goで実現する カスタムエラー golang.tokyo #36 〜真夏のLTナイト2024〜

Slide 2

Slide 2 text

自己紹介 00 サーバーサイドエンジニア Go言語を書くことが多いです (たまにPython) アプリケーション設計も好きです 将来ノルウェージャン・フォレスト・キャットと暮らしたい もし良ければ、Xアカウントのフォローお願いします! @noru86kawaii noru

Slide 3

Slide 3 text

会社紹介 01 自社開発事業・受託開発事業 Go, Rust, 生成AIエンジニアを募集中! 興味があれば覗いていただけると嬉しいです https://www.blueish.co.jp 株式会社BLUEISH

Slide 4

Slide 4 text

会社紹介 02 エンタープライズ向けAI・LLMア プリ開発プラットフォーム 各ドメインに特化した実務レベル の専門性の高いワークフローを自 動生成 世界最大のデータセンター企業 Equinixと協業 https://omni-workspace.com Omni Workspace

Slide 5

Slide 5 text

アジェンダ 03 ゴール 1. カスタムエラーについて 2. Connectとは 3. gRPCエラーモデル 4. gRPCステータスコード 5. connect-goでカスタムエラーを実装 6. まとめ 7.

Slide 6

Slide 6 text

アジェンダ 04 ゴール 1. カスタムエラーについて 2. Connectとは 3. gRPCエラーモデル 4. gRPCステータスコード 5. connect-goでカスタムエラーを実装 6. まとめ 7.

Slide 7

Slide 7 text

ゴール 05 connect-goを使ったgRPCカスタムエラーの 概要と実装をお伝えする

Slide 8

Slide 8 text

アジェンダ 06 ゴール 1. カスタムエラーについて 2. Connectとは 3. gRPCエラーモデル 4. gRPCステータスコード 5. connect-goでカスタムエラーを実装 6. まとめ 7.

Slide 9

Slide 9 text

カスタムエラーについて 07 (既にご存知だと思いますが...) エラーレスポンスを返す際に、 ステータスコードやエラーメッセージ等の エラーの詳細情報を含めることで、 デバッグやエラーハンドリングを容易にすることができる

Slide 10

Slide 10 text

アジェンダ 08 ゴール 1. カスタムエラーについて 2. Connectとは 3. gRPCエラーモデル 4. gRPCステータスコード 5. connect-goでカスタムエラーを実装 6. まとめ 7.

Slide 11

Slide 11 text

Connectとは 09 ブラウザおよびgRPC互換のHTTP APIを構築するためのスリムなライブラリ gRPC、gRPC-Web、Connect独自のプロトコルをサポート gRPCのストリーミング、トレーラー、エラーの詳細も対応 対応言語 安定版:Go、TypeScript、JavaScript ベータ版:Swift、Kotlin https://connectrpc.com

Slide 12

Slide 12 text

アジェンダ 10 ゴール 1. カスタムエラーについて 2. Connectとは 3. gRPCエラーモデル 4. gRPCステータスコード 5. connect-goでカスタムエラーを実装 6. まとめ 7.

Slide 13

Slide 13 text

gRPCエラーモデル 11 Standard error model Richer error model

Slide 14

Slide 14 text

gRPCエラーモデル 12 1つのステータスコードを返す オプションでエラーメッセージ を返す シンプルで使いやすいが、複雑 なレスポンスに対応できない Standard error model

Slide 15

Slide 15 text

gRPCエラーモデル 13 Standard error modelに詳細情報 (details) を追加して返す 複雑なレスポンスにも対応できる detailsにはGoogleが用意した error_detailsのいずれかのスキーマで 返すことが推奨されている ErrorInfo BadRequest ... Richer error model

Slide 16

Slide 16 text

アジェンダ 14 ゴール 1. カスタムエラーについて 2. Connectとは 3. gRPCエラーモデル 4. gRPCステータスコード 5. connect-goでカスタムエラーを実装 6. まとめ 7.

Slide 17

Slide 17 text

gRPCステータスコード 15 計17種のステータスコード HTTPのステータスコードと比較すると1対1に なっていない connect-goだとCode型で定義されている https://github.com/connectrpc/connec t-go/blob/main/code.go

Slide 18

Slide 18 text

アジェンダ 16 ゴール 1. カスタムエラーについて 2. Connectとは 3. gRPCエラーモデル 4. gRPCステータスコード 5. connect-goでカスタムエラーを実装 6. まとめ 7.

Slide 19

Slide 19 text

connect-goでカスタムエラーを実装 17 NewError関数を使う (簡単!) 第1引数にはconnect-go内で定義され ているCodeを渡す 第2引数にはエラーレスポンスで返す クライアント向けのエラーを渡す 実際に発生したエラーメッセージはセ キュリティを考慮してログで出力して いる Standard error model

Slide 20

Slide 20 text

connect-goでカスタムエラーを実装 18 NewError関数の第2引数に渡すクライアント向けエラーメッセー ジにて、汎用的な項目は事前に定義している

Slide 21

Slide 21 text

connect-goでカスタムエラーを実装 19 各ユースケースごとにカスタムしたい場合は都度追加して対応していく

Slide 22

Slide 22 text

connect-goでカスタムエラーを実装 20 エラー型を拡張 (カスタムエラー型を作 成) し、APIのエラーレスポンスを返す際 に、カスタムエラー型→connect-goへ詰 め替えている カスタムエラー型を挟むことで、クライ アント向けのエラーメッセージを柔軟に 制御することを実現した

Slide 23

Slide 23 text

connect-goでカスタムエラーを実装 21 Standard error model

Slide 24

Slide 24 text

connect-goでカスタムエラーを実装 22 本LTではAPIのリクエスト値に対して、複数 のバリデーションエラーが発生したケース を想定する 例:ユーザー登録で名前とメールアドレ スがバリデーションに引っかかった NewErrorDetail関数とAddDetailメソッド を使う Richer error model

Slide 25

Slide 25 text

connect-goでカスタムエラーを実装 23 []*BadRequest_FieldVi olationに各バリデーシ ョンエラーを詰め込む NewErrorDetail関数で detailを作成 →AddDetailメソッドで Error構造体内のdetails にappendする Richer error model

Slide 26

Slide 26 text

connect-goでカスタムエラーを実装 24 Domainレイヤーの各New関数内でバリデーシ ョンエラーを早期リターンせず、カスタムエラ ー型のdetailsにappend後にリターンしている APIのエラーレスポンスを返す際に、Standard error modelとRicher error modelどちらを使 用するか判定後、カスタムエラー型 →connect-goへ詰め替えて返している Richer error model

Slide 27

Slide 27 text

connect-goでカスタムエラーを実装 25 Richer error model

Slide 28

Slide 28 text

アジェンダ 26 ゴール 1. カスタムエラーについて 2. Connectとは 3. gRPCエラーモデル 4. gRPCステータスコード 5. connect-goでカスタムエラーを実装 6. まとめ 7.

Slide 29

Slide 29 text

まとめ 27 gRPCのエラーモデル・ステータスコードの概要、connect-goのカスタムエ ラー実装についてお話ししました エラーモデルは基本的にStandard Error Modelを使用していますが、複数 のバリデーションエラーを返す必要がある場合や、Standard Error Model では対応できない特定のユースケースでは、Richer Error Modelを使用する よう実装し、柔軟に対応できるようにしました 何か1つでも皆様の学びになっていたら嬉しいです

Slide 30

Slide 30 text

最後までご覧いただき、ありがとうございました。 THANK YOU