|
| 1 | +--- |
| 2 | +title: "Fast APIのすすめ(概要編)" |
| 3 | +date: 2024/12/26 00:00:00 |
| 4 | +postid: a |
| 5 | +tag: |
| 6 | + - Python |
| 7 | + - 技術選定 |
| 8 | + - FastAPI |
| 9 | +category: |
| 10 | + - Programming |
| 11 | +thumbnail: /images/20241226a/thumbnail.png |
| 12 | +author: 髙橋遼 |
| 13 | +lede: "FastAPIを選定した理由や、そもそもFastAPIがどのようなものかについて、簡単に紹介できればと思います。" |
| 14 | +--- |
| 15 | + |
| 16 | +<img src="/images/20241226a/logo-teal.png" alt="" widgh="800" height="288"> |
| 17 | + |
| 18 | +# はじめに |
| 19 | + |
| 20 | +初めまして。フューチャーの社内セキュリティ部門、SATの髙橋です。部門におけるシステムのテックリードとして、日夜活動しています。 |
| 21 | + |
| 22 | +先日、当部門が運用する社内向けWeb業務システムの更改がなされ、その中で、FastAPIを採用したAPIサーバの構築をしました。 |
| 23 | + |
| 24 | +本記事では、FastAPIを選定した理由や、そもそもFastAPIがどのようなものかについて、簡単に紹介します。 |
| 25 | + |
| 26 | +ちなみに、以下の記事でも、FastAPIに関して触れられていますので、併せてご覧ください。 |
| 27 | + |
| 28 | +- [サーバーアプリ開発環境(Python/FastAPI)](/articles/20210611a/) |
| 29 | + |
| 30 | +## なぜFastAPIを選んだのか |
| 31 | + |
| 32 | +前提として、本システムにおけるサーバサイドの実装言語は、Pythonをチョイスしています。 |
| 33 | + |
| 34 | +業務システムとしての言語としては、より堅牢な言語を選ぶべきだと考えらえそうですが、最大の理由として、すでに他業務にてPythonを用いて動くシステムを多数構築しており、その知見や今後のシステム間連携等を踏まえるとPythonが最適解であったためです。 |
| 35 | + |
| 36 | +近頃のPythonは、弱点とされていた型システム周りにおいて、より強固かつ使いやすくなる改善が多数あり、パフォーマンスにおいてもコンパイラの改善等が予定されているため、業務システムでも裾野を広げていくのではないかと個人的には見ています。 |
| 37 | + |
| 38 | +そんなPythonで、APIサーバを構築するためのフレームワークとしては、以下の3つが代表例としてよく挙げられると思います。 |
| 39 | + |
| 40 | +- Django |
| 41 | +- Flask |
| 42 | +- FastAPI |
| 43 | + |
| 44 | +まず、Djangoですが、大規模なWebアプリケーションに向いたフルスタックフレームワークとして知られています。 |
| 45 | + |
| 46 | +APIだけでなく、フロントエンド、DB(ORM)も含め、すべてをDjangoで構築するということもできるようでした。 |
| 47 | + |
| 48 | +しかし、一つのフレームワークへの依存度が高くなることや、システム規模に対して、フレームワークとしての機能が重厚すぎることから、 |
| 49 | +検討段階で、採用は見送られました。 |
| 50 | + |
| 51 | +次に、Flaskです。 |
| 52 | + |
| 53 | +こちらは対照的に、軽量でよりAPIサーバに特化しています。必要最低限の機能提供がベースとなっていて、プラグインでの機能拡充ができる作りとなっていました。 |
| 54 | + |
| 55 | +実装方法も至ってシンプルな作りで、学習コストも低いです。本システムにおいても、FastAPIを最終的に採用するまで、主にプロトタイプ開発で利用を行っていました。 |
| 56 | + |
| 57 | +最後に、FastAPIです。こちらもFlaskと同様に、APIサーバ構築に特化したフレームワークです。 |
| 58 | + |
| 59 | +最大の特徴としては、データモデルライブラリのPydanticとの連携による型ヒントの充実、 |
| 60 | +非同期処理への対応も可能な処理の高速さ、そして何よりOpenAPI定義、API Docを自動で生成する機構が備わっている点があり、保守性向上に大きく貢献してくれています。 |
| 61 | + |
| 62 | +これらを、最終的に以下のような観点で評価を進め、FastAPIを採用することにしました。 |
| 63 | + |
| 64 | +| フレームワーク | 機能性 | 学習容易性 | 将来性(保守性) | |
| 65 | +| -------------- | ------ | ------------ | ---------------------- | |
| 66 | +| Django | ◎ | N/A (未評価) | 〇 | |
| 67 | +| Flask | 〇 | ◎ | 〇 | |
| 68 | +| FastAPI | ◎ | ◎ | ◎ | |
| 69 | + |
| 70 | +## FastAPIでできること |
| 71 | + |
| 72 | +FastAPIには、次のような特徴があります。 |
| 73 | + |
| 74 | +- 高速性 |
| 75 | +- 開発のしやすさ |
| 76 | +- Pydanticによる堅牢な型管理 |
| 77 | +- 依存性注入の仕組み |
| 78 | +- Open API定義や API Docの自動生成サポート |
| 79 | + |
| 80 | +開発のしやすさは、対象のメソッドにアノテーションを付与するだけで、エンドポイントやミドルウェアの処理が定義できるため、フレームワーク特有の記述が少なく済んでおり、コードを簡潔に保つことができています。 |
| 81 | + |
| 82 | +個人的に最も恩恵を受けているのは、Pydanticとの連携が強固な点で、普段使っているVSCodeでも入力補助が得られるため、開発体験がとても良いです。 |
| 83 | + |
| 84 | +また、アーキテクチャとしてクリーンアーキテクチャ風の構成を取っていますが、ドメインモデルをPydanticで定義し、FastAPIで活かすといったシナジーが得られるため、 |
| 85 | +自然と堅牢なシステムが構築できます。 |
| 86 | + |
| 87 | +依存性注入の仕組みは、まだ実務で適用できていませんが、今後のシステム拡充で採用をしてみたいところです |
| 88 | + |
| 89 | +# さいごに |
| 90 | + |
| 91 | +実務において、なぜFastAPIを選定したのか選定理由と、簡単なFastAPIの紹介をさせていただきました。 |
| 92 | + |
| 93 | +FastAPIは、コンパクトなフレームワークでありながら、快適なAPI開発を進めるのにイチオシなフレームワークです。Pydanticとの連携による開発体験は一度試すとなくてはならないものになります。 |
| 94 | + |
| 95 | +PythonでAPIを開発する際はぜひ検討してみてください。 |
| 96 | + |
| 97 | +# 参考リンク |
| 98 | + |
| 99 | +- [公式 - FastAPI](https://fastapi.tiangolo.com/) |
0 commit comments