特に対応しなくてもいい場合もあると思うので一概には言えないですが、
APIに変更が入った際の対応方針を4通り考えてみました。(4通りと言いつつ3通りな気がするが気にしない)
前提として、これはウェブアプリケーションの場合なので、他のプラットフォームでは当てはまらないことも多々あると思います。
また、足りない観点などあればご教示いただけると嬉しいです。
① 古いAPIも残していくあなた
よくぞこの道を選びました。
この道を選んだ際に検討することは大きく以下の2点です。
- どこまで対応するか
- どうやってバージョン判定するか
###1.どこまで対応するか
対応すると言っても、リリースしてから全てのバージョンに対応するか、1つ前のバージョンだけ対応するかで大分変ってきます。
これは扱うアプリケーションにもよるんですが、基準としては「(ほぼ)全てのユーザが最新版に至るまでの期間に平均何回アップデートするか」
に依存するでしょう。
ただ、未来の要求なんて読めないことの方が多いし、1週間2週間もブラウザ上で同じアプリを開きっぱにするケースも考えづらいので、
とりあえず「最新のバージョンの一つ前だけ対応する」ようにして、一応それ以上のバージョンも対応できるような拡張性を用意しておくくらいの方針がいいんじゃないかと思います。
###2.どうやってバージョン判定するか
これは①だけでなく②、③でも必要なことですが、バージョンを判定する仕組みが必要になります。
これに関しては素敵な記事があったのでリンクを貼るのみにしておきます。
api開発に失敗しないための情報収集まとめ
※どんなバージョニング方法があるか
の項です
② 古いAPIは残さないが、なんとかリクエストは通すあなた
ユーザが実行途中に強制再読み込みされたら激しくイラつくようなユースケースがある際には、この道が有効かと思われます。
送られてきたリクエストとサーバー側のバージョンが食い違っている時に、
変更部分をダミーパラメータ追加してごまかしたり、返す時に不要な値を削ったり、
変更の内容には依存しますが、どう転んでもad hocな対応になるかとは思われます。
③ 古いAPIは残さず、ユーザに再読み込みを強いるあなた
私は最終的にこの道を選びました。
①の項で書いたバージョン判定の方法加え、再読み込みさせた際に必ず最新版を読み込ませる工夫を導入する必要があります。
私が作ったアプリケーションでは以下のように対応しました。
- HTMLはキャッシュさせず、再読み込みさせた際に必ず新しいもの取らせる
- CSSとJSはキャッシュさせるが、HTML内のリンクにバージョンを含んだクエリをくっつけて、更新した際には必ず新しいものを取得させる。
まずHTMLについてなんですが、前提として
- 私が作っているアプリはReactを用いたSPAのためHTML自体はCSSとJSを読み込むだけの非常に簡素(ファイルサイズが小さい)
- B to Bアプリケーションのためリクエスト数がそこまで大きくなりづらい
ということがあり、キャッシュを一切させないことによる性能への影響が少なく、単純にキャッシュを許容しないのが実装上シンプルでよいだろうと判断しました。
Cache-Controlに以下のプロパティを追加しました。
must-revalidate, no-store, max-age=0, no-cache
ブラウザのキャッシュコントロールについては以下の記事が大変参考になりました。
キャッシュについて整理してみた
CSSとJSはそこそこファイルサイズ大きいのでキャッシュは効かせたいと思い、変更があった時だけ新しいものを取得させるようにしました。
具体的には以下のようにHTML内の各ファイルのリンクにバージョンを含んだクエリを追加しました。
<link rel="stylesheet" href="/static/css/style.css?version=1.0">
<script src="/static/js/index.js?version=1.0"></script>
HTMLは常に最新なので、バージョンアップを忘れなければ(フラグじゃない)CSSとJSも新しいものが取得できるようになります。
④ 何もしないあなた
特にユーザ体験に影響がなければよいですが、もしユーザがユーザ視点で意味不明なサーバーエラーに巻き込まれる可能性がある場合は、なんらかAPIバージョニングの仕組みを検討した方がいいと思います。
おわりに
正直な話をすると先日初めて自分の作ったアプリがリリースされ、その後APIにバージョニング対策しないまま変更を入れてしまったんですよね。
お客様からクレームが来たという話は聞いていないですが、サーバーエラーを体験した人がいた場合は、
私の想像力不足でご迷惑おかけてしまい申し訳ない気持ちでいっぱいです。
初開発の人にとっては抜けがちな観点だと思うので、しっかり対策していきましょう!
自戒を込めて。