「APIの仕様書、誰が更新するの?」というやり取りを、チーム内で何度も聞いたことはないでしょうか。API開発において、仕様書の管理はもっとも厄介な問題のひとつです。コードを変更するたびに手動でドキュメントを更新するのは現実的ではなく、気がつけば仕様書とAPIの実態がまったく一致していない、という状況に陥りがちです。
実は、この問題を根本的に解決するアプローチとして「API仕様書の自動生成」という手法が広く普及しています。OpenAPI(旧Swagger)やGraphQLのエコシステムには、コードやスキーマからドキュメントを自動的に生成するツールが豊富に揃っています。この記事では、REST APIとGraphQL APIの両方の観点から、仕様書自動生成の実践的な手法を紹介します。ドキュメント駆動開発のワークフローを取り入れることで、API開発の効率と品質を同時に向上させましょう。
API仕様書はなぜ重要なのか
APIを公開する、あるいはチーム内で共有する場面において、仕様書の重要性を疑う人はほとんどいないでしょう。しかし、その重要性を頭では理解していても、実際に高品質な仕様書を維持し続けるのは容易ではありません。ここでは、API仕様書が果たす役割と、手動管理の限界について考えてみましょう。
API仕様書は、フロントエンドとバックエンドの開発者をつなぐ共通言語のような存在です。フロントエンド開発者がAPIを利用する際、エンドポイントのURL、リクエストパラメータ、レスポンスの形式、エラーコードなどを正確に把握する必要があります。仕様書がなければ、バックエンドの開発者に都度質問することになり、お互いの作業が中断されてしまいます。特に、フロントエンドとバックエンドが並行して開発を進めるようなプロジェクトでは、正確な仕様書の存在が開発速度に直結します。
そういえば、外部パートナーやサードパーティにAPIを公開するケースでは、仕様書の品質がそのままサービスの信頼性として受け取られます。StripeやTwilioのようなAPI主体のサービスが高く評価されている理由のひとつは、充実したドキュメントを提供していることです。開発者体験(Developer Experience)を重視する流れの中で、わかりやすいAPI仕様書は競合他社との差別化要因にすらなり得るのです。
ところで、手動でAPI仕様書を管理する場合、どんな問題が起きるのでしょうか。最も深刻なのは、コードと仕様書の乖離です。開発のスピードが上がるほど、仕様書の更新は後回しにされがちで、スプリントが終わるころには数十箇所の不整合が生まれていた、ということも珍しくありません。こうした問題を仕組みで解決するのが、自動生成というアプローチです。
ドキュメント駆動開発という考え方
API仕様書の自動生成を語るうえで欠かせないのが「ドキュメント駆動開発」(Document-Driven Development)という考え方です。テスト駆動開発(TDD)がテストを先に書くように、ドキュメント駆動開発ではAPI仕様を先に定義してから実装に取りかかります。
このアプローチの最大の利点は、フロントエンドとバックエンドの合意がAPIの実装前に取れることです。OpenAPIの仕様ファイルをYAML形式で先に作成し、チーム全体でレビューを行います。エンドポイントの設計、リクエスト・レスポンスの形式、認証方式などについて事前に合意を形成することで、「実装してみたら仕様と違った」というトラブルを未然に防げます。仕様ファイルがGitで管理されていれば、プルリクエストを通じてAPIの設計変更をレビューすることもできます。
実は、ドキュメント駆動開発のもうひとつの大きなメリットは、モックサーバーを早期に立ち上げられることです。OpenAPIの仕様ファイルさえあれば、PrismやStoplight Studioなどのツールを使って即座にモックサーバーを起動できます。バックエンドの実装が完了する前からフロントエンドの開発を進められるため、チーム全体の開発スピードが加速します。モックが返すレスポンスは仕様ファイルに定義した例示データに基づくため、実際のAPIとの差異も最小限に抑えられるのです。
そういえば、ドキュメント駆動開発を実践する際に忘れてはならないのが、仕様ファイルのバリデーションです。OpenAPIの仕様にはスキーマの定義ルールがあり、それに準拠していないファイルはツールが正しく処理できません。CI/CDパイプラインにバリデーションステップを組み込んでおくと、不正な仕様ファイルがリポジトリに入り込むのを防げます。Spectral(Stoplight社製のリンター)は、OpenAPIファイルの品質チェックに広く使われているツールです。
OpenAPIによるREST APIドキュメントの自動生成
OpenAPI Specification(OAS)は、REST APIを記述するための業界標準的な仕様です。もともとSwagger Specificationとして知られていましたが、2015年にOpenAPI Initiativeに移管されて現在の名称になりました。この仕様に基づいてAPIを記述すれば、さまざまなツールを活用してドキュメント生成やコード生成を自動化できます。
OpenAPIの仕様ファイルは、YAMLまたはJSON形式で記述します。エンドポイントのパス、HTTPメソッド、リクエストパラメータ、レスポンスのスキーマ、認証方式などを構造化されたフォーマットで定義できます。現在の最新バージョンはOpenAPI 3.1で、JSON Schemaとの完全互換性が実現されています。過去のバージョン(2.0や3.0)からの移行ガイドも充実しているため、段階的にアップグレードしていくことも可能です。
実は、OpenAPIの仕様ファイルから対話的なドキュメントを生成するツールは複数あります。最も有名なのはSwagger UIで、仕様ファイルを読み込んでブラウザ上で操作できるAPIリファレンスを生成します。各エンドポイントの詳細を確認でき、その場でリクエストを試すことも可能です。Redocは見た目がモダンで、三段組のレイアウトが読みやすいと評判です。Stoplight Elementsはカスタマイズ性に優れており、自社サイトに組み込んで使うのに適しています。
ところで、コードからOpenAPIの仕様ファイルを自動生成するアプローチも人気があります。Express.jsではswagger-jsdoc、Springではspringdoc-openapi、FastAPIではフレームワーク自体がOpenAPIの自動生成に対応しています。コードにアノテーションやデコレーターを書くことで、APIの実装と仕様が自動的に同期する仕組みを作れます。特にFastAPIはPythonの型ヒントからOpenAPIの仕様を自動的に導出するため、追加の記述がほぼ不要で、開発者の負担が非常に小さいのが特徴です。
コードファーストとデザインファーストの使い分け
OpenAPIの活用には、コードファーストとデザインファーストという2つのアプローチがあります。コードファーストは実装を先に書き、コードからOpenAPIの仕様を生成する方法です。一方、デザインファーストは仕様ファイルを先に書き、それに基づいて実装を行う方法です。
コードファーストは、既存のAPIにドキュメントを後付けしたい場合や、小規模なプロジェクトで素早くAPIを構築したい場合に向いています。開発者にとっては馴染みのある言語でコードを書くだけでドキュメントが生成されるため、学習コストが低いというメリットがあります。一方で、APIの設計があいまいなままコードが進んでしまい、後から仕様を見直す必要が出てくるリスクもあります。
デザインファーストは、複数チームが連携する大規模プロジェクトや、外部APIの設計において特に効果を発揮します。仕様を先に固めることで、フロントエンドとバックエンドの開発を並行して進められます。ただし、仕様ファイルの記述にOpenAPIの知識が必要になるため、チーム内にOpenAPIに精通したメンバーがいるかどうかが導入の鍵になります。Swagger Editorのようなビジュアルエディタを活用すると、仕様ファイルの記述ハードルを下げられるでしょう。
GraphQLドキュメントの自動生成
RESTと並んでAPI開発で注目を集めているGraphQLには、独自のドキュメント生成エコシステムがあります。GraphQLのスキーマ自体が「自己記述的」であるという特徴を持っており、REST APIとはドキュメント戦略が少し異なります。
GraphQLのスキーマには、クエリ、ミューテーション、サブスクリプション、型定義などの情報がすべて含まれています。しかもGraphQLにはイントロスペクション機能が組み込まれており、スキーマの情報をプログラムで取得できます。つまり、実行中のGraphQLサーバーに対してイントロスペクションクエリを投げるだけで、利用可能なすべてのAPI情報を取得できるのです。この仕組みが、GraphQLのドキュメント自動生成を支えています。
実は、GraphQLのスキーマにdescriptionフィールドを適切に記述しておけば、ドキュメント生成ツールがその情報を自動的に拾ってくれます。スキーマ定義言語(SDL)で型やフィールドの直前にコメントを書くだけで、それがドキュメントに反映されるのです。REST APIのOpenAPIに比べると、ドキュメントの記述がコードと完全に一体化しているため、乖離が起きにくいというメリットがあります。
そういえば、GraphQLのドキュメント生成ツールとして広く使われているのがGraphQL Voyagerです。スキーマをインタラクティブなグラフとして可視化してくれるため、型同士の関連性を直感的に理解できます。SpectaQLは、GraphQLスキーマから静的なHTMLドキュメントを生成するツールで、ホスティングが容易です。Apollo StudioにはExplorerという対話的なクエリビルダーが備わっており、ドキュメントを見ながらクエリを構築して実行することができます。
GraphQLスキーマ設計のベストプラクティス
ドキュメントの品質を高めるためには、スキーマ設計の段階で意識しておくべきポイントがあります。すべての型、フィールド、引数にdescriptionを書くのは当然のこととして、命名規則を統一しておくことが重要です。フィールド名はcamelCase、型名はPascalCase、enum値はSCREAMING_SNAKE_CASEという慣例に従うことで、スキーマ全体の一貫性が保たれます。
GraphQLの非推奨機能を示す@deprecatedディレクティブも積極的に活用しましょう。RESTのAPIバージョニングとは異なり、GraphQLではフィールドレベルで非推奨を宣言できます。移行先のフィールドをdescriptionに明記しておけば、利用者は自分のペースで新しいフィールドに切り替えられます。このきめ細かい非推奨管理は、GraphQLならではのメリットです。
ところで、GraphQLのスキーマが大規模になってくると、単一のファイルでの管理が難しくなります。スキーマの分割管理には、graphql-toolsのmergeTypeDefs関数やApollo FederationのようなSubgraph構成が有効です。ドキュメント生成も、分割されたスキーマに対応できるツールを選定しておく必要があります。
自動生成を支えるCI/CDパイプライン
API仕様書の自動生成は、CI/CDパイプラインに組み込んでこそ真価を発揮します。手元で手動実行するだけでは、生成を忘れたり古い仕様書がデプロイされたりするリスクが残るためです。
GitHub Actionsを例にとると、プルリクエストのタイミングでOpenAPIの仕様ファイルをバリデーションし、マージ後にドキュメントを自動生成してデプロイする、というワークフローが一般的です。SpectralによるOpenAPIのリント、swagger-diffによる破壊的変更の検出、Redocによるドキュメント生成、GitHub Pagesへのデプロイまでを一連のパイプラインとして構築できます。これにより、APIの変更がドキュメントに即座に反映される仕組みが完成します。
実は、APIのバージョン管理もCI/CDの中で自動化できるポイントです。セマンティックバージョニングに基づいてAPI仕様のバージョンを管理し、破壊的変更が検出された場合はメジャーバージョンを上げる、といったルールを機械的に適用できます。optic-ciのようなツールは、プルリクエストの差分からAPIの変更内容を自動的に分析し、後方互換性のない変更がないかチェックしてくれます。
そういえば、ドキュメントのデプロイ先として最近注目されているのがコンフルエンスやNotionとの連携です。エンジニアだけでなく、プロダクトマネージャーやビジネス担当者もAPIの仕様を確認できるようにすることで、組織全体でのAPI理解が深まります。OpenAPIの仕様ファイルからMarkdownを生成し、それをConfluenceのページとして自動更新する、というワークフローも実用化されています。
ツール選定のポイント
API仕様書の自動生成ツールは数多く存在しますが、プロジェクトの特性に合ったものを選ぶことが重要です。ツール選定の際に考慮すべき観点をいくつか挙げてみましょう。
最も重要なのは、チームの技術スタックとの親和性です。Express.jsのプロジェクトであればswagger-jsdocやtsoa、Spring Bootであればspringdoc-openapi、Djangoであればdrf-spectacular、FastAPIであればフレームワーク組み込みの機能が使えます。フレームワークと親和性の高いツールを選ぶことで、導入コストを最小限に抑えられます。新しいツールを導入する際には、そのツールのメンテナンス状況やコミュニティの活発さも確認しておくと安心です。
実は、ドキュメントの見た目や操作性も選定基準として無視できません。Swagger UIはデファクトスタンダードですが、デザインがやや古いという声もあります。Redocは三段組レイアウトで情報密度が高く、大規模なAPIのドキュメントに向いています。Stoplight Elementsはモダンなデザインで、自社のブランディングに合わせたカスタマイズが容易です。実際に各ツールのデモサイトを確認して、チームやユーザーにとって使いやすいものを選ぶとよいでしょう。
ところで、コスト面も無視できない要素です。多くのドキュメント生成ツールはオープンソースで無料ですが、Stoplight PlatformやPostmanのようなSaaS型のツールは有料プランでないと機能が制限される場合があります。チームの規模やAPIの公開範囲に応じて、オープンソースのセルフホスティングとSaaSの有料プランのどちらが費用対効果に優れているかを検討する必要があります。
まとめ
API仕様書の自動生成は、現代のAPI開発において欠かせない手法です。手動での仕様書管理が引き起こすコードとドキュメントの乖離という問題を、仕組みの力で解決できます。
REST APIであればOpenAPI Specificationを軸に、Swagger UI、Redoc、Stoplight Elementsなどのツールでドキュメントを生成できます。GraphQLであればスキーマの自己記述性を活かし、descriptionフィールドとイントロスペクション機能を組み合わせることで、高品質なドキュメントを自動的に維持できます。
ドキュメント駆動開発のアプローチを取り入れれば、API設計の品質向上とフロントエンド・バックエンドの並行開発を同時に実現できます。CI/CDパイプラインに自動生成とバリデーションを組み込むことで、常に最新かつ正確な仕様書が保たれる体制を構築しましょう。API仕様書の自動化は、エンジニアの開発効率を高めるだけでなく、チーム全体のコミュニケーションを円滑にする投資です。