API駆動開発
文責:日本CTO協会 丸山直樹
APIとは?
「API駆動開発」について理解するためには、前提となる「API」という言葉を押さえておく必要があります。
APIは、"Application Programming Interface"の略です。あるシステムやライブラリの機能を別のシステムから利用するための手続きやプロトコルのことを意味しています。人間にとってのインターフェースではなく、コンピュータシステム同士のインタフェースのことを示しています。
現在では、APIというと、独立したプロセス同士がネットワークを経由してやりとりするための仕組みのことを指すことが多いです。それらはRPC( Remote Procedure Call )などとも呼ばれます。このようなAPIが用意されたシステムであれば、その機能を、別のシステムからでも利用できるようになります。
"API駆動開発"はなぜ重要か?
開発プロセスの中心にAPIを置くことで、APIの利点である再利用性や拡張性を最大限に活かすことができます。
そうすることで、一貫性のある機能を複数デバイス間で迅速に共有したり、APIを利用しているシステムへの影響を最小限にアップデートできるなど、開発効率と品質を向上させ、高速な仮説検証を可能にします。
"API駆動開発"とはなにか?
従来の開発手法では、まず画面を設計し、それを元にAPIを設計・開発していました。
この手法では再利用性や開発の柔軟性が低くなる課題があります。画面に特化した作りになるため、他のデバイスで利用する場合は都度修正が必要であったり、画面の変更に応じてAPIも修正する必要があるなどです。
API駆動開発では、どのような機能を提供するか?を考え、まずAPIの設計と構築、次に利用する各システムを構築するという順序で開発を行います。
この開発手法のポイントは、各システムがAPIに依存することにあります。
こうすることで、各システム同士は疎結合になり、また各システムがそれぞれ異なる言語やデバイスで構築されていても、APIで提供される機能やインターフェースに一貫性が保たれることになります。
結果として、品質高く、高速な仮説検証を可能にします。
一方、APIの設計が非常に重要となり、システム全体のパフォーマンスや拡張性に影響を与える可能性があるので、APIの設計には十分注意が必要です。
"API駆動開発"を代表するプラクティスの解説
プロダクトに対して外部あるいは内部の別のシステムと連携するためのAPIが提供されているか。
APIを通じて、プロダクトは新しい機能やサービスを簡単に追加でき、外部のサービスやツールと連携することで多機能かつ柔軟なものに進化します。開発されたAPIは様々なアプリケーションやシステムで再利用が可能で、開発時間とコストを削減します。また、異なるシステム間のデータ共有と統合を容易にし、ビジネスプロセスの効率化を促進します。このように、APIはプロダクトの機能を外部システムやアプリケーションに公開し、内部システム間の連携を円滑化するための重要なツールであり、プロダクトの価値を最大化しユーザーエクスペリエンスを向上させることができます。
- 外部システムとの連携
- 外部の開発者やサードパーティ向けにAPIを公開し、データを提供したり、一部の機能を利用可能にします。こうすることで、各ユーザーは自身のニーズにカスタマイズしてプロダクトの機能を利用することができるので、結果的にユーザー体験を向上させることができます。
- 内部の別のシステムとの連携
- 内部向けにAPIを公開することです。別のシステムからプロダクトの機能を利用することができるようになるので、開発効率やユーザー体験の向上が見込めます。
APIは何らかのSchema定義言語によって規定され、そこから自動的にクライアントの生成やバリデータの生成が行われているか。
Schema定義言語とは、APIがどのようなリクエストを受け付けし、どのようなレスポンスを返すかを定義する言語です。定義することで、開発者と利用者のコミュニケーションを助けることができます。
この言語はマシンリーダブルであるため、定義を読み込ませることによって、呼び出し側のコード、バリデータの作成、テストの作成などを自動的に行うことができ、開発の効率化が可能です。
多くの開発言語で、これら自動的な生成がサポートされています。
APIに関わる要件は、SDD(スキーマ駆動開発)で開発され、直ちにモックアップサーバーが提供できるか。
SDDとは、前述したSchema定義言語で定義したスキーマをベースに開発を進める手法です。
スキーマさえ完成してしまえば、API開発と利用側(フロントエンドなど)の開発を並行して進めることができるので、非常に効率的です。
さらに、そのスキーマを元にモックアップサーバーを提供できる仕組みが数多く存在しているので、利用側はAPIが完成しているかのような状態で開発を進めることができます。
"API駆動開発"はどのようにして測定するか
APIの利用者のユーザビリティについて定期的なフィードバックを収集し、それを基にAPIを改善しているかどうかを確認しているかどうかの観点があります。
API駆動開発ではAPIがベースとなるため、APIのユーザビリティが低い場合、全体的なパーフォマンスに影響を及ぼします。
API開発フローの中に、フィードバックのサイクルを組み込み、定期的に改善して結果を評価していくことが重要となります。
"API駆動開発"で陥りがちなアンチパターンとはどういう状況か
ViewやControllerの層に処理が集中しており、機能をAPIに切り出すことが困難な設計になっている。
これは既存のシステムからAPI駆動開発に以降する際に直面するアンチパターンです。
APIを作ろうとしたときに、処理がViewやControllerに混在していると、API実装時に同じビジネスロジックを再度実装することになってしまい、非常に非効率かつ保守性の低い状態になってしまいます。
この場合、まずAPIの開発をスタートする前に、ビジネスロジックを分離することから初める必要があります。
各APIに対して、ネットワークを経由したE2E(ステージング・本番どちらに対するE2Eテストかは問わない)のテストが存在しておらず、死活監視ができていない。
API駆動開発ではAPIの問題は利用側全体のリスクとなりますので、問題の早期発見が必要です。
そのためには、コードをベースとしたロジックのテストのみでは不十分であり、インフラも含めたAPI利用側を想定したテストでの死活監視が重要になります。
APIがバージョン管理されておらず、破壊的な変更が利用者から検知できない。
エンドポイントの削除、レスポンスフォーマットの変更のようなAPIの破壊的変更をしてしまうと、利用者システムすべてが正常に稼働しなくなります。
よって、APIのバージョン管理を行って、新・旧バージョンどちらも接続可能な状態にしておき、利用者それぞれのタイミングでアップデートが可能なようにすることでこの問題を解決できます。
APIのバージョン管理には、URLベースの方法が一般的です。例えば、APIのエンドポイントに や といったバージョン番号を含めます。この方法の利点は、APIの異なるバージョンに対して明確なアドレスを提供できることです。また、ヘッダーベースのバージョニングやクエリパラメータを使用する方法もあります。
重要なのは、新しいバージョンを導入する際には、十分な通知とドキュメントの提供、適切な移行期間の提供を行うことです。これにより、利用者は自分のスケジュールに合わせてシステムを更新でき、無用な混乱やダウンタイムを避けることができます。
最終的に、APIのバージョン管理とは、利用者が破壊的な変更に対応できるようにするための透明性と予測可能性を提供することです。適切なバージョン管理戦略を採用することで、APIとその利用者の間の信頼と安定性を確保することができます。
参考
https://www.mertech.com/blog/api-driven-developmenthttps://swagger.io/resources/articles/adopting-an-api-first-approach/https://www.wavemaker.com/the-basics-of-api-driven-development/https://blog.restcase.com/api-driven-development/