先日、檜山正幸さんのブログ記事「ハイパーリンクは何を繋ぐのか」にコメントを投稿した。「アプリケーション状態」に関する檜山さんの説明に誤りがあると思い、さらに、基本的概念の把握に誤りがあるのなら記事の結論が変わるかもしれないと思ったからだ。だが、それは僕の早とちりだったようだ。檜山さんと僕は同じ物を見ながら、おそらく、別々の言葉で説明しているだけなのだ。
それでも檜山さんの論旨にはしっくりこない部分があるので、いろいろ調べているうちに、逆に、僕のコメントの中に誤りが含まれていることに気づいてしまった。説明が長くなるので、ここで訂正しておきたい。
誤りとは「アプリケーション状態」がRESTに固有の概念であるかのように書いてしまったことだ。Roy T. Fieldingはrest-discussメーリングリストへのある投稿において「Application state exists regardless of the style used」と書いている。つまり、アプリケーション状態はアーキテクチャスタイルとは無関係に存在するものなのだ。
アプリケーション状態=セッション状態=トランザクション状態
アプリケーション状態とは何なのか。Royは別の投稿で「Application state in REST is what most distributed systems would call session state or transaction state, depending on which end of the system is being talked about」と書いている。ほとんどの分散システムでは「セッション状態」や「トランザクション状態」とよばれるもの、それをRESTではアプリケーション状態とよんでいる、というのだ。わざわざ別の用語を使うのは、セッション状態やトランザクション状態ではネットワークやデータベースの話だと誤解されかねないからだ。
山本陽平さんは、注目を集めた記事「ステートレスとは何か」で、ハンバーガーショップにおける客の注文状態を例に挙げ、いみじくも「これをアプリケーション状態、あるいはセッション状態と呼ぶ」と説明されている。
Webアプリのアプリケーション状態はリンクをたどらなくても遷移する
同じく山本さんの「REST と ROA」(PDF)では、以下の3つがアプリケーション状態の例として挙げられている。
- 今、どの Web ページを表示しているか
- どのチェックボックスを選択し
- どのユーザで認証しているか
チェックボックスの例に注目すると、Webアプリケーションにおいては、あるアプリケーション状態から別のアプリケーション状態に遷移するに際して、必ずしもサーバとのやりとりを経る必要はないと分かる。ただブラウザ上でチェックボックスを選択/解除するだけでも、アプリケーション状態が遷移するということだ。HATEOAS(アプリケーション状態エンジンとしてのハイパーメディア)などと聞くと、あたかもリンクをたどらないことにはアプリケーション状態が遷移しないかのように誤解してしまいそうだが、そんなことはないのである。