JSFとJAX-RSの比較で思いついた説明
Java話が続いています。でも今回でしばらくJava話は打ち止めです。なぜならありえるえりあ勉強会(http://atnd.org/events/8956)に備えてLisp脳になる必要があるからです。Lisp脳になるには頭からJavaを追い出す必要があります。Javaのような不純な言語が頭に残っているとLisp脳にはなれません。
Java EEについて話す中(http://dev.ariel-networks.com/articles/JJUG/jjug-javaone/view)で、JSFとJAX-RSは同じような問題領域の規格です、と説明しました。もう少し良い説明を思いついたので書きます。
ふたつの説明の前にJava EEのWeb-tierとEnterprise-tierの区分けに触れます。
簡単に言うと、Web-tierはHTTPの世界と接点を持つアプリ用の規格です。Enterprise-tierはトランザクションの世界と接点を持つアプリ用の規格です。トランザクションの世界の裏に永続層がいるかどうかは基本的には隠蔽されていますが、一般には裏にデータベースがあるので、Enterprise-tierはデータベースの世界と接点を持つアプリと考えても問題ありません。
JSFとJAX-RSは、どちらもWeb-tierの世界の規格です。Web-tierには他にもサーブレットAPIやJSPなどありますが、それぞれがレイヤ別に棲み分けています。そんな中でJSFとJAX-RS(ついでに言うとJAX-WSもですがこれは無視します)がほぼ同レイヤというのが、冒頭の説明の趣旨です。
もっとも、ふたつの規格のボリュームは全然違います。JSFの方が遥かに大きな仕様です(規格書のページ数だけ見れば10倍近い差)。
ふたつの違いをHTTPの世界の見立ての違いで説明してみます。
JSFはHTTPの世界をページ遷移で見立てます。Struts以後の伝統的な見立てです。JSFはページ間の遷移をイベントで見立てます。
JAX-RSはHTTPの世界をRESTで見立てます。つまりURLと(HTTP)メソッドの世界です。
HTTPそれ自体は通信プロトコルに過ぎません。その世界をどう見立てるかは、どう抽象化するかということです。明らかにJSFの方が抽象度は高いです。と言うよりJSFに比べると、JAX-RSはHTTPの世界をダイレクトにAPIにマップしているだけにすら見えます。
普通、抽象度が上がるとアプリのコードは単純化します。JSFの方が抽象度が高いのでアプリが単純化しそうですが事実は逆です。JAX-RSアプリのコードの方がずっと単純になります。しかし、一般にソフトウェアの複雑さは消滅することはありません。単にどこかに移動するだけです。よくできたAPIやフレームワークは複雑度を下位に移動して隠蔽することで、消したように見せかけるだけです。
では、JAX-RSでの複雑さはどこに消えたのかと言うと、これはクライアント側(Webブラウザ側)に移動したと見るべきなんだと思います。ちなみに移動した複雑さに対しては次のような動きもあります(クライアントJavaScript向けのMVCフレームワーク)。今後、他にも似たものが色々と現れると思います。
先日書いたように(http://dev.ariel-networks.com/Members/inoue/jjug-javaone)、個人的にはページ遷移からRESTへ、と思っています。が、下記文書で、昔の自分は「ページ・ドリブン」に共感していました。5年経つと考えも変わるようです。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/web-tier/tbping