WebAPIを設計から実装までした時に考えたことや書いたコードをまとめていく。
今回は設計思想について
実装編書きました→WebAPIの設計から実装まで〜実装編〜
GitHubのレポジトリ→chat_app
そもそもWebAPIとは
WebAPIとは、
特定のURLに値とともにアクセスするとデータベースから必要なデータを取ってきてそれをクライアント(ユーザー側)にそのデータを送信する。
WebAPIのデータフロー
下図のように設計した
-
Client
→Route
・・・Client
からAPI
にRequest
を送る -
Route
→Controller
・・・Route
でURL
を解析してController
にDispatch
する -
Controller
→Service
・・・Controller
でデータを整理してService
に投げる -
Service
→DB
・・・Service
はController
から受け取ったデータをDB
に格納する -
DB
→Service
・・・Service
はDB
からの実行結果を受け取る -
Service
→Controller
・・・Controlller
はDB
に保存できたかどうかの結果をService
から受け取る -
Controller
→Client
・・・Client
はController
からRequest
に対してのResponse
をjson
形式で受け取る
ControllerとDBの間にServiceを入れた理由
MVCFramework
において、Controller
の役割は非常に多く、すべての処理をController
に書くと肥大化してしまう。そこで、DB
へのアクセスをService
にまとめることで、処理をわかりやすく且つ再利用性を高めることができるようになる。
Routeの公開は必要最低限にする
Route
はClient
から見るとWebAPI
の玄関口であり、ここの間口を必要最低限にすることによりセキュリティ性を高めることができる。
Controllerでは細かいところまでエラー処理をする
Controller
はClient
にResponse
を返す役割があるので、エラー処理を細やかにすることによってClient
側のRequest
エラーをわかりやすくすることができる。
ServiceにDBを操作する処理をすべて書く
Service
にはDBを操作する処理をすべて書く。特定のService
を呼び出せるのは特定のController
にすることにより、セキュリティ性を高めることができる。
DB構築について
下図のように構築してみた。
気をつけた点
- データを
DB
から引っ張ってくるときになるべく別table
とjoin
しないようにした - 正規化をして、DBの拡張性を高めた
DBにおいて重要だと思ってること
DBから引っ張ってくるデータの量を最小化する努力をするべきだ。なぜならClient
にResponse
する際、データの総量が大きくなってしまうとどうしても通信量が増えてしまい、またClient
側でparse
するときに時間がかかってしまうからだ。
WebAPIのエンドポイント
エンドポイントとは、
WebAPIにおけるエンドポイントとは、APIにアクセスするためのURI
美しく設計することによって、別の開発者でも楽にアクセスできるようになる。
エンドポイントの実際の例
細かいエンドポイントの設計の仕方はいずれ記事を書きます。
UnitTest
UnitTest
は文字通りテストコードでWebAPIにおいてはそれぞれのURLは正しく使えるかということを確認することができ非常に有益だと思う。また、機能拡張やソースコードのリファクタリングをしたときに正常に動くかどうかを自動でテストすることができる。また、エラー処理したコードが正常に動くかもテストできるので非常に便利だ。
また、きちんとテストコードを書くことによってドキュメント代わりにもなり、別の開発者からもわかりやすくなる。
参考までに実行したときのCUIを載せておく
最後に
試行錯誤して学んだ知識なので間違いがあるかもしれないし、さらに良い設計方法もあるかもしれません。
コメントで批判していただけると嬉しいです。