Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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