PaPoo
cover
technews
Author
technews
世界の技術ニュースをリアルタイムでキャッチし、日本語でわかりやすく発信。AI・半導体・スタートアップから規制動向まで、グローバルテックシーンの「今」をお届けします。

Spring BootでOpenAPIをコードから自動生成し、CIに組み込む方法をわかりやすく解説

キーポイント

OpenAPIをコードから作る、という話は地味に強い

この記事は、Spring Bootアプリから OpenAPI 仕様を自動生成し、それを CI pipeline に自然に組み込む方法を紹介しています。

まず前提として、OpenAPIはAPIの仕様を機械が読める形で表したものです。人間にとっては「このAPIはGETで、こういう入力を受けて、こういう出力を返す」と読めるし、ツールにとっては「クライアントコードを作るための材料」になります。

ここが大事で、OpenAPIはただのドキュメントではありません。
実際には次のような用途でかなり役に立ちます。

正直、このへんは「OpenAPIって地味だけど便利だなあ」と感じる部分です。
特に複数チームで開発していると、仕様書が生きていることの価値はかなり大きいと思います。

手動でやる方法:まずはSwagger UIからOpenAPIを取る

記事ではまず、普通のSpring Bootプロジェクトを作ります。依存関係としてはざっくりこんな構成です。

springdoc-openapi は、Spring Bootのコードやアノテーションを見て OpenAPI 定義を生成してくれるライブラリです。
Swagger UIは、そのAPIをブラウザで眺めたり試したりする画面だと思えばOKです。

さらに application.yml で OpenAPI の出力先を設定します。この記事では、たとえば /api-docs のようなパスを使っています。

そのあと、シンプルな REST controller を作ります。内容はすごく基本的で、

というものです。

ここまでは、OpenAPIを使うというより「普通のSpring Bootアプリ」ですね。

セキュリティ設定が地味に重要

記事で面白いのは、Security設定をちゃんと分けているところです。

通常時は、

などにアクセスできるようにしつつ、それ以外は認証必須にしています。

そして openapi という専用の Spring profile を用意して、そのときだけは 全リクエストを permitAll にしています。
つまり、OpenAPIを自動生成するための実行時には、ドキュメント取得を邪魔する認証を外すわけです。

これ、かなり実践的です。
CIでドキュメントを取るときに認証でコケるのはありがちな事故なので、最初から「生成用の起動モード」を分けるのは賢いやり方だと思います。

手で保存する方法はできる。でも、CIにはつらい

アプリを起動して Swagger UI を開き、そこから /api-docs を見ることはできます。
そのレスポンスを手で保存すれば、OpenAPI仕様ファイルとして使えます。

ただし、この記事も言っているように、これは繰り返し作業になりがちで、ビルド自動化には向かないです。

ここは本当にその通りで、手動運用は最初の1回は楽でも、数回やったらだいたい面倒になります。
人間は継続的なコピペ作業に弱いので、こういうものは早めに自動化したほうがいいです。

本命はここ:Mavenビルド中にOpenAPIを自動生成する

この記事の核心はここです。

image_0003.svg

springdoc-openapi-maven-plugin は、ゼロからOpenAPIを勝手に作るわけではありません。
起動中のSpring BootアプリにあるOpenAPI endpointを叩いて、その結果を取ってくるだけです。

つまり、プラグインが動くときにアプリ本体も動いていないといけません。

なので、一般的には次の2つを一緒に使います。

この設計は、最初は少し回りくどく見えるかもしれません。
でも、考えてみると筋が通っています。
「コードから仕様を作る」のではなく、​実際に動くアプリから仕様を抜き出すので、実装との差異が出にくいんです。ここはかなり重要です。

openapi profile を切る意味

記事では Maven profile openapi を追加します。
これがあることで、OpenAPIを生成するときだけ以下のような挙動に変えられます。

この「専用モードを用意する」という発想が、私はかなりきれいだと思いました。
本番用のセキュリティ設定を無理に壊さず、生成用途だけ別に逃がしているからです。

CI/CDの文脈では、こういう分離があとあと効いてきます。
ビルドのためだけに本番設定をいじるのは、だいたい危ないので。

この記事の実践的な価値

このレシピの良さは、単に「OpenAPIを出せます」ではなく、​CIに乗せやすい形にしていることです。

たとえば、こんな流れが作れます。

  1. アプリを openapi profile で起動
  2. OpenAPI definition を /api-docs.yaml から取得
  3. openapi.yml をビルド成果物として保存
  4. 必要ならそのファイルを使ってクライアント生成や検証を行う

この流れにしておけば、API仕様がコード変更に追従しやすくなります。
手で更新する仕様書より、ずっと現実的です。

個人的には、OpenAPIの価値は「きれいな仕様書」そのものより、​周辺ツールとの接続点になることにあると思います。
生成、モック、契約テスト。ここにつながると一気に強いです。

ただし、万能ではない

もちろん、OpenAPIを自動生成すれば全部解決、ではありません。

なので、私は「自動生成 + 必要なところだけ手で磨く」のが現実的だと思います。
ゼロから全部手書きするより、かなり楽ですし、ズレも減らせます。

まとめ

この記事は、Spring Bootアプリから OpenAPI を自動生成し、それを Maven ビルドと CI に組み込むための、かなり実践寄りのレシピでした。

特に重要なのは、

という3点です。

見た目は少しややこしいですが、やっていることはかなり素直です。
「動いているアプリから、動く仕様を抜く」。
この発想は、実務ではかなり強いと思います。


参考: OpenAPI From Code With Spring and Java: A Recipe for Your CI

同じ著者の記事