Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
OpenAPI を用いた GoのAPIサーバー の開発自動化
Search
ysakura_
December 06, 2021
Technology
0
81
OpenAPI を用いた GoのAPIサーバー の開発自動化
マネーフォワードのPublic API開発において、OpenAPIを用いてGoのAPIサーバー構築を効率化しました。
利用シーン/技術選定/使ってみての長所短所を記載しています。
ysakura_
December 06, 2021
Tweet
Share
More Decks by ysakura_
See All by ysakura_
Goでの設定情報管理に苦労した話
ysakura_
0
410
マネーフォワードにおけるGoとマイクロサービスの活用事例
ysakura_
0
560
Other Decks in Technology
See All in Technology
Oracle Cloud Infrastructure IaaS 新機能アップデート 2025/09 - 2025/11
oracle4engineer
PRO
0
150
MLflowで始めるプロンプト管理、評価、最適化
databricksjapan
1
250
[デモです] NotebookLM で作ったスライドの例
kongmingstrap
0
150
生成AI活用の型ハンズオン〜顧客課題起点で設計する7つのステップ
yushin_n
0
200
SSO方式とJumpアカウント方式の比較と設計方針
yuobayashi
7
690
AWS re:Invent 2025で見たGrafana最新機能の紹介
hamadakoji
0
390
エンジニアとPMのドメイン知識の溝をなくす、 AIネイティブな開発プロセス
applism118
4
1.3k
Debugging Edge AI on Zephyr and Lessons Learned
iotengineer22
0
210
今からでも間に合う!速習Devin入門とその活用方法
ismk
1
720
マイクロサービスへの5年間 ぶっちゃけ何をしてどうなったか
joker1007
3
1.2k
1人1サービス開発しているチームでのClaudeCodeの使い方
noayaoshiro
1
170
5分で知るMicrosoft Ignite
taiponrock
PRO
0
380
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.6k
GitHub's CSS Performance
jonrohan
1032
470k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
It's Worth the Effort
3n
187
29k
Site-Speed That Sticks
csswizardry
13
1k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.1k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
1
100
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を使って、ユーザーの課題を解決したいエンジニアを募集中です! カジュアル面談から是非