Slide 1

Slide 1 text

Swagger(OpenAPI 2.0)を使った
 API仕様Drivenな開発 春⼭ 誠 Makoto Haruyama 銀座Rails #2

Slide 2

Slide 2 text

2008 - DeNA⼊社 2010 - エンジニアに転向 2011 - DeNA退社 → 福岡で新規サービス⽴ち上げ 2013 - DeNAに出戻り 2016 - ゲーム事業本部 2017 - コマース&インキュベーション事業本部 SpringMT Spring_MT 春⼭ 誠 Makoto Haruyama

Slide 3

Slide 3 text

サービス&チームについて API仕様Drivenな開発 • Swaggerを取り⼊れた開発フローについて 振り返り • 開発スケジュール/不具合はどうだったか/QAからのフィードバック • 今後の課題 まとめ ⽬次

Slide 4

Slide 4 text

サービス&チームについて

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

メンバー構成 全体で5名 開発メンバーは2名 • サーバー∕インフラ担当 — 1名 • クライアント担当 —---------1名

Slide 7

Slide 7 text

サービスの構成 APIサーバー • Rails クライアント • 設計段階からWeb, iOS, Androidに対応することを想定 • 少⼈数で対応することを考えて初期からReact Nativeの採⽤を検討 • Web(JS)はReactベースのSPA (APIサーバーとは独⽴)

Slide 8

Slide 8 text

開発タイムライン

Slide 9

Slide 9 text

できるだけ早くかつ
 何度も検証プロセスを回したい

Slide 10

Slide 10 text

開発タイムライン

Slide 11

Slide 11 text

開発スピードをあげるには
 どうするのが最適?

Slide 12

Slide 12 text

クライアントとサーバーの開発を
 なるべく並列で進められるようにする

Slide 13

Slide 13 text

よくあるパターン

Slide 14

Slide 14 text

今回はこうしたい

Slide 15

Slide 15 text

こうしてみました APIの仕様を開発時に利⽤しやすい形で整備する • メンテナンスがしやすいツールを導⼊ • 開発時に参照しやすいようドキュメント化する • 実装と仕様書が乖離しないよう仕組み化して対応 最初にMock APIを作って開発を並列で⾏えるようにする • クライアントがすぐに作業に着⼿できるように
 最初は簡単なmock APIを提供 • 早くfeedbackをもらうことでサーバーサイドの⼿戻りを最⼩限に

Slide 16

Slide 16 text

API仕様Drivenな開発

Slide 17

Slide 17 text

APIの仕様をどうやって
 開発時に利⽤しやすい形でまとめるか?

Slide 18

Slide 18 text

APIの仕様として最初に決める必要があるもの リクエスト情報 • path, method, content type, path parameter, body レスポンス情報 • content type, body

Slide 19

Slide 19 text

APIの仕様をどうまとめるか ツールを利⽤ • Swagger(今回採⽤) • graphQL • gRPC

Slide 20

Slide 20 text

YAMLで仕様をかける ドキュメント⽣成 RESTベース クライアント⽣成 データに対して、JSON Schema⽣成できる Railsへ組み込むgem(committee)あり APIのmockが作りやすい 検討したツール Swagger

Slide 21

Slide 21 text

今だと⼀番候補になりそうですが、
 開発始めたときはそこまでたころは情報が少なかった 今回、インフラやクライアントで挑戦していることも多く
 RESTから移⾏するための余裕がなかった 同じリソースの内容を画⾯によってで出し分けるのであれば、 graphQLがよさそう 検討したツール graphQL

Slide 22

Slide 22 text

Webクライアント(JS)で
 Protocol Bufferの扱い⽅が難しい grpc-webがでているが試してはいない 検討したツール gRPC

Slide 23

Slide 23 text

Swaggerを利⽤するための⼯夫

Slide 24

Slide 24 text

可読性を⾼めてAPIの仕様をまとめる yamlで書ける まとめて1つのファイルに書く と可読性が悪いので…

Slide 25

Slide 25 text

multi-file-swagger yamlファイルを分割し、最終的に⼀つのschema.yamlにまとめることができる

Slide 26

Slide 26 text

multi-file-swagger yamlファイルの構成例 paths • エンドポイントごとの定義を書く shared • 共通のmodelなどを格納

Slide 27

Slide 27 text

APIの仕様からドキュメントを⽣成する swagger-codegenを使って
 ドキュメントを⽣成 github上でも確認できる
 ようにする

Slide 28

Slide 28 text

RubyMineのSwagger plugin ⼊れることでRubyMine上で
 ドキュメントを⾒ながら開発できる

Slide 29

Slide 29 text

APIの仕様をまとめるときに
 出てくる問題

Slide 30

Slide 30 text

仕様と実装の乖離 • 仕様上にはあったが
 実装がもれている • hotfixによる実装だけ⾏って
 仕様を更新していない

Slide 31

Slide 31 text

Swaggerで定義した仕様と
 APIサーバーの実装を
 結合させることで
 実装と仕様書のズレが
 起こらないようにしたい

Slide 32

Slide 32 text

SwaggerとAPIサーバの連携

Slide 33

Slide 33 text

APIサーバーと連携する committeeを使ってRailsに組み込む •https://github.com/interagent/committee

Slide 34

Slide 34 text

committeeを利⽤してできること リクエストのバリデーション • リクエストの内容をSwaggerで⽣成されるJSON Schemaを使ってバリ デーション レスポンスの⽣成とバリデーション • View作らずに、Swaggerの定義通りにレスポンスを⽣成する • Jbuilderとかは使わない • レスポンスの内容をSwaggerで⽣成されるJSON Schemaを使ってバリ デーション

Slide 35

Slide 35 text

レスポンスの⽣成 schemaのプロパティを 使って⾃動⽣成 • レスポンスのパラメータ追 加ならコード変更はいらな い

Slide 36

Slide 36 text

これらをプロセスに組み込んだ
 開発フロー

Slide 37

Slide 37 text

開発フロー 1. 画⾯仕様の決定 2. SwaggerでAPIの仕様を起こす 3. サーバー側でルーティングを⾜してテストを書きテストを落とす 4. Swaggerのモックレスポンスをcontrollerにコピーしてテストを通す 5. マージしてsandbox環境でデプロイする 6. クライアントとサーバーの開発開始 1 2 3 4 5 6

Slide 38

Slide 38 text

開発フロー ʙ͸࣌ؒ͘Β͍ͰରԠ͢Δ 1. 画⾯仕様の決定 2. SwaggerでAPIの仕様を起こす 3. サーバー側でルーティングを⾜してテストを書きテストを落とす 4. Swaggerのモックレスポンスをcontrollerにコピーしてテストを通す 5. マージしてsandbox環境でデプロイする 6. クライアントとサーバーの開発開始 1 2 3 4 5 6

Slide 39

Slide 39 text

  画⾯仕様の決定 Product Requirementか らAPIの設計をす る 1

Slide 40

Slide 40 text

   SwaggerでAPIの仕様を起こす Swaggerの書き⽅に 準じて書くだけ 2

Slide 41

Slide 41 text

  サーバー側でRoutingを⾜してテストを書きテストを落とす 最⼩限の実装 3

Slide 42

Slide 42 text

  サーバー側でRoutingを⾜してテストを書きテストを落とす 実装ないので落ちる 最⼩限のテスト 3

Slide 43

Slide 43 text

  サーバー側でRoutingを⾜してテストを書きテストを落とす 3

Slide 44

Slide 44 text

   Swaggerのモックレスポンスをcontrollerにコピーしテストを通す Swagger Editorから
 コピーできる 4

Slide 45

Slide 45 text

   Swaggerのモックレスポンスをcontrollerにコピーしテストを通す 4

Slide 46

Slide 46 text

   Swaggerのモックレスポンスをcontrollerにコピーしテストを通す 4

Slide 47

Slide 47 text

  mergeしてsandbox環境でデプロイする Sandbox deploy • Sandbox環境へはローカルからdeployできる 5

Slide 48

Slide 48 text

  サーバーとクライアントの実装開始 ここからちゃんとした実装開始 • サーバーはDBの設計とかロジックを書いていく • クライアントはダミーのレスポンスをもとに画⾯を作っていく 6

Slide 49

Slide 49 text

振り返り

Slide 50

Slide 50 text

開発ボリューム 管理画⾯ページ数
 60 APIエンドポイント数
 30 フロント画⾯数(SPA)
 40

Slide 51

Slide 51 text

β版リリースまでのスケジュール βリリース後も機能追加や本リリース向けの対応を⾏っている

Slide 52

Slide 52 text

不具合

Slide 53

Slide 53 text

QAチームとの振り返り DeNAの中で⽐較すると全体的に品質が⾼いと⾼評価 • APIの不具合はほとんどなし • 上がってきたものはQAで拾う想定だった⽂⾔やレイアウトの問題

Slide 54

Slide 54 text

クライアント側との振り返り 今の所特に不満なし • ドキュメントが整備されていて実装しやすい
 今後はクライアント側のコードの
 ⾃動⽣成までサポートしてほしい • axios使っているのでそれに即したコードの⽣成

Slide 55

Slide 55 text

今後の課題 Swaggerのファイル分割をスマートに • https://github.com/chuross/swaglow を検討する
 OpenAPI 3.0への対応 • 3.0で対応される新しい仕様への対応(nullable等、今は⾃前で拡張)

Slide 56

Slide 56 text

まとめ

Slide 57

Slide 57 text

まとめ Swaggerを使ったAPI仕様ファーストで開発スピードを向 上できた さらにSwaggerとサーバーを組み合わせることで、開発ス ピードの向上と不具合の減少に寄与することができた

Slide 58

Slide 58 text

We are hiring!

Slide 59

Slide 59 text

と⾔いたいのですが 弊チームの計画上これ以上は。。

Slide 60

Slide 60 text

https://dena.com/jp/recruit/career/engineer/ DeNA is hiring!