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
OpenAPI を用いた GoのAPIサーバー の開発自動化
Search
ysakura_
December 06, 2021
Technology
84
0
Share
OpenAPI を用いた GoのAPIサーバー の開発自動化
マネーフォワードのPublic API開発において、OpenAPIを用いてGoのAPIサーバー構築を効率化しました。
利用シーン/技術選定/使ってみての長所短所を記載しています。
ysakura_
December 06, 2021
More Decks by ysakura_
See All by ysakura_
Goでの設定情報管理に苦労した話
ysakura_
0
410
マネーフォワードにおけるGoとマイクロサービスの活用事例
ysakura_
0
590
Other Decks in Technology
See All in Technology
ハーネスエンジニアリングをやりすぎた話 ~そのハーネスは解体された~
gotalab555
5
2k
Microsoft 365 / Microsoft 365 Copilot : 自分の状態を確認する「ラベル」について
taichinakamura
0
440
「誰一人取り残されない」 AIエージェント時代のプロダクト設計思想 Product Management Summit 2026
mizushimac
1
2.7k
QAエンジニアはどうやって プロダクト議論の場に入れるのか?
moritamasami
1
310
要件定義の精度を高めるための型と生成AIの活用 / Using Types and Generative AI to Improve the Accuracy of Requirements Definition
haru860
0
270
AgentCore×VPCでの設計パターンn選と勘所
har1101
4
370
GKE Agent SandboxでAIが生成したコードを 安全に実行してみた
lamaglama39
0
170
小さいVue.jsを30分で作る
hal_spidernight
0
130
国内外の生成AIセキュリティの最新動向 & AIガードレール製品「chakoshi」のご紹介 / Latest Trends in Generative AI Security (Domestic & International) & Introduction to AI Guardrail Product "chakoshi"
nttcom
4
1.7k
AIが自律的に働く時代へ Amazon Quick で実現するAIエージェント紹介
koheiyoshikawa
0
170
需要創出(Chatwork)×供給(BPaaS) フライホイールとMoat 実行能力の最適配置とAI戦略
kubell_hr
0
1.8k
拝啓、あの夏の僕へ〜あなたも知っているApp Runnerの世界〜
news_it_enj
0
180
Featured
See All Featured
How to Ace a Technical Interview
jacobian
281
24k
Everyday Curiosity
cassininazir
0
200
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
210
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Crafting Experiences
bethany
1
130
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Embracing the Ebb and Flow
colly
88
5k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
64
54k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
350
KATA
mclloyd
PRO
35
15k
Transcript
OpenAPIを用いて、GoのAPIサーバー構築を効率化した話
自己紹介
• 櫻 勇人(さくら ゆうと) ◦ Twitter: ysakura_ ◦ Go歴は3年ほど •
株式会社マネーフォワード @ 京都開発拠点 ◦ サーバーサイドエンジニア ▪ toB領域を主に担当 ◦ これまで ▪ Go製のマイクロサービスの開発運用 ◦ 最近 ▪ Public APIの開発推進 ▪ OAuth 2.0の認可基盤の開発 自己紹介
• MFでのAPI開発 • OpenAPIを採用した理由 • 利用したライブラリの紹介 • MFでの利用シーン • ライブラリの良かった点
/ 辛かった点 • 結論 今日話す事
• Public APIを絶賛開発中 ◦ 外部のサービスとの連携性向上が目的 ◦ Goのマイクロサービスがある所は GoでAPIを実装 • APIの基盤も構築中
◦ OAuth 2.0の認可基盤など ◦ こちらは別の機会に MFでのAPI開発
• OpenAPI ◦ 特定の開発言語に依存しない標準的な RESTful APIのインターフェース定義 ◦ 例 • スキーマ駆動開発をしたい
◦ 最初にスキーマ(API定義)を作り、それを元に開発を進めること ▪ 社外の人にAPIを使って貰うので、スキーマからスタートしたい ◦ API定義とサーバー実装がズレない様にしたい ▪ 外部に提供しているインターフェイスとずれると困る ▪ スキーマからGoのコードが自動生成される様にしたい • 利用事例が多いものを採用したい OpenAPIを採用した理由
https://github.com/deepmap/oapi-codegen • 使い方 利用したライブラリの紹介 go get github.com/deepmap/oapi-codegen/cmd/oapi-codegen oapi-codegen petstore-expanded.yaml >
petstore.gen.go
https://github.com/deepmap/oapi-codegen • 自動生成されるコードの例 ◦ OpenAPI ▪ petstore-expanded.yaml ◦ 型 ▪
petstore-types.gen.go ◦ handlerのベース実装 ▪ petstore-server.gen.go ◦ クライアント ▪ petstore-client.gen.go 利用したライブラリの紹介
MFでの利用シーン • APIサーバー ◦ handlerの自動生成 ◦ 型の自動生成 • テスト ◦
E2Eテストで自動生成されたクライアントを利用
• 型の自動生成 ◦ OpenAPIの型(Schema)が、Goの型として自動生成される ▪ petstore-types.gen.go ▪ OpenAPIとサーバー実装のズレが無くなった • handlerのベース実装の自動生成
◦ ルーターへのhandler登録 (生成例) ◦ パラメーターのパース (生成例) ◦ OpenAPIに基づいたhandlerのInterface(生成例) ▪ このInterfaceを守らないとBuildが失敗する • OpenAPIとサーバー実装のズレが無くなった oapi-codegenで良かった点
• クライアントの自動生成 ◦ E2Eテストで用いた ◦ 実装が減り、テスト作成がかなり楽になった ▪ HTTPリクエストの作成など ◦ 実装例
▪ 初期化 ▪ リクエスト oapi-codegenで良かった点
• Validatorが採用出来ず、自前でバリデーションを実装した ◦ OpenAPIを元にしたValidatorが提供されている(実装) ◦ APIサーバーから返るエラーは、自社のエラーフォーマットに沿う様にしたかった ▪ エラー時の文言/JSONを変更できないので、 oapi-codegenのValidatorは利用せず ◦
今思えば、oapi-codegenのエラーを受け取り、エラーハンドリングすべきだったかも ▪ 後続のmiddlewareで処理する様な形 • APIレスポンスのfieldの並び順が、OpenAPIの並び順と同じにならない ◦ curl等でデバッグする人向けに、重要な情報を上部に表示したかった ◦ OpenAPIの並びをソートして、 Goの構造体が作成される仕様 oapi-codegenで辛かった点
• リクエストとレスポンスで同じ型として扱いたいものが、別の型となってしまう ◦ ページネーションなど ▪ Cursor • Parameters ▪ NextCursor
• Schema ◦ これはもしかすると、 OpenAPIの使い方が悪いのかもしれない oapi-codegenで辛かった点
• スキーマ駆動開発は楽 ◦ OpenAPIを正とした開発の安心感は強い • deepmap/oapi-codegen オススメ ◦ handlerのロジック実装に集中する事が出来た 結論
We are hiring! Goを使って、ユーザーの課題を解決したいエンジニアを募集中です! カジュアル面談から是非