Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
connect-goで実現するカスタムエラー
Search
noru
August 08, 2024
1
74
connect-goで実現するカスタムエラー
- golang.tokyo #36 〜真夏のLTナイト2024〜
noru
August 08, 2024
Tweet
Share
More Decks by noru
See All by noru
開発生産性向上のためにGo Template Repositoryを作った話
genkihirano
1
5
goplantumlの紹介
genkihirano
1
140
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
25
1.8k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
The Invisible Side of Design
smashingmag
298
50k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
44
2.2k
Embracing the Ebb and Flow
colly
84
4.5k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
The Art of Programming - Codeland 2020
erikaheidi
52
13k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Raft: Consensus for Rubyists
vanstee
136
6.6k
Code Reviewing Like a Champion
maltzj
520
39k
Imperfection Machines: The Place of Print at Facebook
scottboms
265
13k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
900
Transcript
noru connect- goで実現する カスタムエラー golang.tokyo #36 〜真夏のLTナイト2024〜
自己紹介 00 サーバーサイドエンジニア Go言語を書くことが多いです (たまにPython) アプリケーション設計も好きです 将来ノルウェージャン・フォレスト・キャットと暮らしたい もし良ければ、Xアカウントのフォローお願いします! @noru86kawaii noru
会社紹介 01 自社開発事業・受託開発事業 Go, Rust, 生成AIエンジニアを募集中! 興味があれば覗いていただけると嬉しいです https://www.blueish.co.jp 株式会社BLUEISH
会社紹介 02 エンタープライズ向けAI・LLMア プリ開発プラットフォーム 各ドメインに特化した実務レベル の専門性の高いワークフローを自 動生成 世界最大のデータセンター企業 Equinixと協業 https://omni-workspace.com
Omni Workspace
アジェンダ 03 ゴール 1. カスタムエラーについて 2. Connectとは 3. gRPCエラーモデル 4.
gRPCステータスコード 5. connect-goでカスタムエラーを実装 6. まとめ 7.
アジェンダ 04 ゴール 1. カスタムエラーについて 2. Connectとは 3. gRPCエラーモデル 4.
gRPCステータスコード 5. connect-goでカスタムエラーを実装 6. まとめ 7.
ゴール 05 connect-goを使ったgRPCカスタムエラーの 概要と実装をお伝えする
アジェンダ 06 ゴール 1. カスタムエラーについて 2. Connectとは 3. gRPCエラーモデル 4.
gRPCステータスコード 5. connect-goでカスタムエラーを実装 6. まとめ 7.
カスタムエラーについて 07 (既にご存知だと思いますが...) エラーレスポンスを返す際に、 ステータスコードやエラーメッセージ等の エラーの詳細情報を含めることで、 デバッグやエラーハンドリングを容易にすることができる
アジェンダ 08 ゴール 1. カスタムエラーについて 2. Connectとは 3. gRPCエラーモデル 4.
gRPCステータスコード 5. connect-goでカスタムエラーを実装 6. まとめ 7.
Connectとは 09 ブラウザおよびgRPC互換のHTTP APIを構築するためのスリムなライブラリ gRPC、gRPC-Web、Connect独自のプロトコルをサポート gRPCのストリーミング、トレーラー、エラーの詳細も対応 対応言語 安定版:Go、TypeScript、JavaScript ベータ版:Swift、Kotlin https://connectrpc.com
アジェンダ 10 ゴール 1. カスタムエラーについて 2. Connectとは 3. gRPCエラーモデル 4.
gRPCステータスコード 5. connect-goでカスタムエラーを実装 6. まとめ 7.
gRPCエラーモデル 11 Standard error model Richer error model
gRPCエラーモデル 12 1つのステータスコードを返す オプションでエラーメッセージ を返す シンプルで使いやすいが、複雑 なレスポンスに対応できない Standard error model
gRPCエラーモデル 13 Standard error modelに詳細情報 (details) を追加して返す 複雑なレスポンスにも対応できる detailsにはGoogleが用意した error_detailsのいずれかのスキーマで
返すことが推奨されている ErrorInfo BadRequest ... Richer error model
アジェンダ 14 ゴール 1. カスタムエラーについて 2. Connectとは 3. gRPCエラーモデル 4.
gRPCステータスコード 5. connect-goでカスタムエラーを実装 6. まとめ 7.
gRPCステータスコード 15 計17種のステータスコード HTTPのステータスコードと比較すると1対1に なっていない connect-goだとCode型で定義されている https://github.com/connectrpc/connec t-go/blob/main/code.go
アジェンダ 16 ゴール 1. カスタムエラーについて 2. Connectとは 3. gRPCエラーモデル 4.
gRPCステータスコード 5. connect-goでカスタムエラーを実装 6. まとめ 7.
connect-goでカスタムエラーを実装 17 NewError関数を使う (簡単!) 第1引数にはconnect-go内で定義され ているCodeを渡す 第2引数にはエラーレスポンスで返す クライアント向けのエラーを渡す 実際に発生したエラーメッセージはセ キュリティを考慮してログで出力して
いる Standard error model
connect-goでカスタムエラーを実装 18 NewError関数の第2引数に渡すクライアント向けエラーメッセー ジにて、汎用的な項目は事前に定義している
connect-goでカスタムエラーを実装 19 各ユースケースごとにカスタムしたい場合は都度追加して対応していく
connect-goでカスタムエラーを実装 20 エラー型を拡張 (カスタムエラー型を作 成) し、APIのエラーレスポンスを返す際 に、カスタムエラー型→connect-goへ詰 め替えている カスタムエラー型を挟むことで、クライ アント向けのエラーメッセージを柔軟に
制御することを実現した
connect-goでカスタムエラーを実装 21 Standard error model
connect-goでカスタムエラーを実装 22 本LTではAPIのリクエスト値に対して、複数 のバリデーションエラーが発生したケース を想定する 例:ユーザー登録で名前とメールアドレ スがバリデーションに引っかかった NewErrorDetail関数とAddDetailメソッド を使う Richer
error model
connect-goでカスタムエラーを実装 23 []*BadRequest_FieldVi olationに各バリデーシ ョンエラーを詰め込む NewErrorDetail関数で detailを作成 →AddDetailメソッドで Error構造体内のdetails にappendする
Richer error model
connect-goでカスタムエラーを実装 24 Domainレイヤーの各New関数内でバリデーシ ョンエラーを早期リターンせず、カスタムエラ ー型のdetailsにappend後にリターンしている APIのエラーレスポンスを返す際に、Standard error modelとRicher error modelどちらを使
用するか判定後、カスタムエラー型 →connect-goへ詰め替えて返している Richer error model
connect-goでカスタムエラーを実装 25 Richer error model
アジェンダ 26 ゴール 1. カスタムエラーについて 2. Connectとは 3. gRPCエラーモデル 4.
gRPCステータスコード 5. connect-goでカスタムエラーを実装 6. まとめ 7.
まとめ 27 gRPCのエラーモデル・ステータスコードの概要、connect-goのカスタムエ ラー実装についてお話ししました エラーモデルは基本的にStandard Error Modelを使用していますが、複数 のバリデーションエラーを返す必要がある場合や、Standard Error Model
では対応できない特定のユースケースでは、Richer Error Modelを使用する よう実装し、柔軟に対応できるようにしました 何か1つでも皆様の学びになっていたら嬉しいです
最後までご覧いただき、ありがとうございました。 THANK YOU