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
Swagger (OpenAPI 2.0) を使ったAPI仕様Drivenな開発 / API-...
Search
Spring_MT
October 18, 2018
Technology
9
3.7k
Swagger (OpenAPI 2.0) を使ったAPI仕様Drivenな開発 / API-Spec-Driven development with Swagger
Spring_MT
October 18, 2018
Tweet
Share
More Decks by Spring_MT
See All by Spring_MT
Deep Environment Parity CDNT 2019
spring_mt
5
3.4k
環境の一致について考えてみる / Environment Parity
spring_mt
4
7.5k
1人でできる Docker Kubernetes(GKE)を 使った新規サービス立ち上げ / Docker and Kubernetes(GKE) for new services
spring_mt
19
7.9k
CI CD Test on ReRep
spring_mt
3
3.5k
Rails on GKEで運用する Webアプリケーションの紹介/Rails on GKE
spring_mt
0
530
新規事業立ち上げからマイクロサービスについて考えてみる
spring_mt
1
1.2k
hpbn_3
spring_mt
0
150
backbone.jsの使用例 その1
spring_mt
0
400
chef-soloの簡単な使い方
spring_mt
4
1k
Other Decks in Technology
See All in Technology
~Everything as Codeを諦めない~ 後からCDK
mu7889yoon
3
260
Digitization部 紹介資料
sansan33
PRO
1
6.8k
GitHub Issue Templates + Coding Agentで簡単みんなでIaC/Easy IaC for Everyone with GitHub Issue Templates + Coding Agent
aeonpeople
1
170
Introduction to Bill One Development Engineer
sansan33
PRO
0
360
Bill One急成長の舞台裏 開発組織が直面した失敗と教訓
sansantech
PRO
1
280
Tebiki Engineering Team Deck
tebiki
0
24k
プロポーザルに込める段取り八分
shoheimitani
0
160
SREじゃなかった僕らがenablingを通じて「SRE実践者」になるまでのリアル / SRE Kaigi 2026
aeonpeople
6
2.1k
Meshy Proプラン課金した
henjin0
0
240
CDKで始めるTypeScript開発のススメ
tsukuboshi
1
310
月間数億レコードのアクセスログ基盤を無停止・低コストでAWS移行せよ!アプリケーションエンジニアのSREチャレンジ💪
miyamu
0
800
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
3k
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.8k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
110
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.6k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
110
Java REST API Framework Comparison - PWX 2021
mraible
34
9.1k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
66
36k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
150
Being A Developer After 40
akosma
91
590k
Leo the Paperboy
mayatellez
4
1.4k
Darren the Foodie - Storyboard
khoart
PRO
2
2.3k
Agile that works and the tools we love
rasmusluckow
331
21k
Transcript
Swagger(OpenAPI 2.0)を使った API仕様Drivenな開発 春⼭ 誠 Makoto Haruyama 銀座Rails #2
2008 - DeNA⼊社 2010 - エンジニアに転向 2011 - DeNA退社 →
福岡で新規サービス⽴ち上げ 2013 - DeNAに出戻り 2016 - ゲーム事業本部 2017 - コマース&インキュベーション事業本部 SpringMT Spring_MT 春⼭ 誠 Makoto Haruyama
サービス&チームについて API仕様Drivenな開発 • Swaggerを取り⼊れた開発フローについて 振り返り • 開発スケジュール/不具合はどうだったか/QAからのフィードバック • 今後の課題 まとめ
⽬次
サービス&チームについて
None
メンバー構成 全体で5名 開発メンバーは2名 • サーバー∕インフラ担当 — 1名 • クライアント担当 —---------1名
サービスの構成 APIサーバー • Rails クライアント • 設計段階からWeb, iOS, Androidに対応することを想定 •
少⼈数で対応することを考えて初期からReact Nativeの採⽤を検討 • Web(JS)はReactベースのSPA (APIサーバーとは独⽴)
開発タイムライン
できるだけ早くかつ 何度も検証プロセスを回したい
開発タイムライン
開発スピードをあげるには どうするのが最適?
クライアントとサーバーの開発を なるべく並列で進められるようにする
よくあるパターン
今回はこうしたい
こうしてみました APIの仕様を開発時に利⽤しやすい形で整備する • メンテナンスがしやすいツールを導⼊ • 開発時に参照しやすいようドキュメント化する • 実装と仕様書が乖離しないよう仕組み化して対応 最初にMock APIを作って開発を並列で⾏えるようにする
• クライアントがすぐに作業に着⼿できるように 最初は簡単なmock APIを提供 • 早くfeedbackをもらうことでサーバーサイドの⼿戻りを最⼩限に
API仕様Drivenな開発
APIの仕様をどうやって 開発時に利⽤しやすい形でまとめるか?
APIの仕様として最初に決める必要があるもの リクエスト情報 • path, method, content type, path parameter, body
レスポンス情報 • content type, body
APIの仕様をどうまとめるか ツールを利⽤ • Swagger(今回採⽤) • graphQL • gRPC
YAMLで仕様をかける ドキュメント⽣成 RESTベース クライアント⽣成 データに対して、JSON Schema⽣成できる Railsへ組み込むgem(committee)あり APIのmockが作りやすい 検討したツール Swagger
今だと⼀番候補になりそうですが、 開発始めたときはそこまでたころは情報が少なかった 今回、インフラやクライアントで挑戦していることも多く RESTから移⾏するための余裕がなかった 同じリソースの内容を画⾯によってで出し分けるのであれば、 graphQLがよさそう 検討したツール graphQL
Webクライアント(JS)で Protocol Bufferの扱い⽅が難しい grpc-webがでているが試してはいない 検討したツール gRPC
Swaggerを利⽤するための⼯夫
可読性を⾼めてAPIの仕様をまとめる yamlで書ける まとめて1つのファイルに書く と可読性が悪いので…
multi-file-swagger yamlファイルを分割し、最終的に⼀つのschema.yamlにまとめることができる
multi-file-swagger yamlファイルの構成例 paths • エンドポイントごとの定義を書く shared • 共通のmodelなどを格納
APIの仕様からドキュメントを⽣成する swagger-codegenを使って ドキュメントを⽣成 github上でも確認できる ようにする
RubyMineのSwagger plugin ⼊れることでRubyMine上で ドキュメントを⾒ながら開発できる
APIの仕様をまとめるときに 出てくる問題
仕様と実装の乖離 • 仕様上にはあったが 実装がもれている • hotfixによる実装だけ⾏って 仕様を更新していない
Swaggerで定義した仕様と APIサーバーの実装を 結合させることで 実装と仕様書のズレが 起こらないようにしたい
SwaggerとAPIサーバの連携
APIサーバーと連携する committeeを使ってRailsに組み込む •https://github.com/interagent/committee
committeeを利⽤してできること リクエストのバリデーション • リクエストの内容をSwaggerで⽣成されるJSON Schemaを使ってバリ デーション レスポンスの⽣成とバリデーション • View作らずに、Swaggerの定義通りにレスポンスを⽣成する •
Jbuilderとかは使わない • レスポンスの内容をSwaggerで⽣成されるJSON Schemaを使ってバリ デーション
レスポンスの⽣成 schemaのプロパティを 使って⾃動⽣成 • レスポンスのパラメータ追 加ならコード変更はいらな い
これらをプロセスに組み込んだ 開発フロー
開発フロー 1. 画⾯仕様の決定 2. SwaggerでAPIの仕様を起こす 3. サーバー側でルーティングを⾜してテストを書きテストを落とす 4. Swaggerのモックレスポンスをcontrollerにコピーしてテストを通す 5.
マージしてsandbox環境でデプロイする 6. クライアントとサーバーの開発開始 1 2 3 4 5 6
開発フロー ʙ࣌ؒ͘Β͍ͰରԠ͢Δ 1. 画⾯仕様の決定 2. SwaggerでAPIの仕様を起こす 3. サーバー側でルーティングを⾜してテストを書きテストを落とす 4. Swaggerのモックレスポンスをcontrollerにコピーしてテストを通す
5. マージしてsandbox環境でデプロイする 6. クライアントとサーバーの開発開始 1 2 3 4 5 6
画⾯仕様の決定 Product Requirementか らAPIの設計をす る 1
SwaggerでAPIの仕様を起こす Swaggerの書き⽅に 準じて書くだけ 2
サーバー側でRoutingを⾜してテストを書きテストを落とす 最⼩限の実装 3
サーバー側でRoutingを⾜してテストを書きテストを落とす 実装ないので落ちる 最⼩限のテスト 3
サーバー側でRoutingを⾜してテストを書きテストを落とす 3
Swaggerのモックレスポンスをcontrollerにコピーしテストを通す Swagger Editorから コピーできる 4
Swaggerのモックレスポンスをcontrollerにコピーしテストを通す 4
Swaggerのモックレスポンスをcontrollerにコピーしテストを通す 4
mergeしてsandbox環境でデプロイする Sandbox deploy • Sandbox環境へはローカルからdeployできる 5
サーバーとクライアントの実装開始 ここからちゃんとした実装開始 • サーバーはDBの設計とかロジックを書いていく • クライアントはダミーのレスポンスをもとに画⾯を作っていく 6
振り返り
開発ボリューム 管理画⾯ページ数 60 APIエンドポイント数 30 フロント画⾯数(SPA) 40
β版リリースまでのスケジュール βリリース後も機能追加や本リリース向けの対応を⾏っている
不具合
QAチームとの振り返り DeNAの中で⽐較すると全体的に品質が⾼いと⾼評価 • APIの不具合はほとんどなし • 上がってきたものはQAで拾う想定だった⽂⾔やレイアウトの問題
クライアント側との振り返り 今の所特に不満なし • ドキュメントが整備されていて実装しやすい 今後はクライアント側のコードの ⾃動⽣成までサポートしてほしい • axios使っているのでそれに即したコードの⽣成
今後の課題 Swaggerのファイル分割をスマートに • https://github.com/chuross/swaglow を検討する OpenAPI 3.0への対応 • 3.0で対応される新しい仕様への対応(nullable等、今は⾃前で拡張)
まとめ
まとめ Swaggerを使ったAPI仕様ファーストで開発スピードを向 上できた さらにSwaggerとサーバーを組み合わせることで、開発ス ピードの向上と不具合の減少に寄与することができた
We are hiring!
と⾔いたいのですが 弊チームの計画上これ以上は。。
https://dena.com/jp/recruit/career/engineer/ DeNA is hiring!