RIA時代のシステム構築

最近の仕事では顧客側が当然のように画面機能にRIA的要件を求めてくるようになりました。私個人はJavaScript本体やjQueryの勉強などをやってきたので、こういった要求にも何とか応えられているのですが、サーバサイドJava開発プログラマーとしてアサインされた開発者の人達には、こういったクライアント機能の実装が苦手な人が結構多いように感じています。こちら側が基盤機能としてのJavaScriptライブラリを提供しても、うまく使いこなせなかったり、JavaScriptの基本的なDOM操作が出来ない開発者が多いのです。
サーバサイドJava開発では、長らくJavaScriptはオマケ的な扱いを受けてきて、あまり真面目に勉強してこなかったJava開発者は多いと思います。でも、もうそれでは顧客要求に応えられなくなりつつあります。JavaScriptを避けたとしても、結局はFlexSilverlightのようなRIA技術を使うことになるでしょう。最早、以前のようなクラシックなWebアプリケーションでは顧客はOKを出してくれない時代となってしまいました。
以前からこの日記で書いてきたことですが、RIA時代の到来が避けられないのであれば、真正面からそれを受けて立つのが技術者としての責務ではないかと考えています。多機能な画面は顧客が望んでいることなのですから、開発者としては新たな技術を学ぶ羽目になっても、その機能実現手段をしっかり自分のものにしたいと考えています。そして、システム開発自体をRIAを利用する前提で一から考え直す時期に来ていると思っています。
まずは、サーバサイドとクライアントサイドにシステムを明確に分断します。クライアントサイドはJavaScriptライブラリを使ったり、FlexSilverlightなどのPluginを前提とします。動的な画面作成は全てこれらクライアントサイドにお任せします。
サーバサイドからは今までのView機能を分離します。JSPやサーバ管理のHTMLテンプレートは基本的に使いません。クライアント側は一覧データや選択データなどをサーバサイドにHTTPリクエストとして問い合わせ、サーバ側はそれをJSONデータやXMLデータとして返します。View用の細かい変換はクライアント側で行うので、サーバ側は基本的にDBスキーマを元にしたModelを単位とした個別 or 結合データを返すことになります。個人的にはRailsActiveRecordJavaJPAのようなスキーマレベルで規約化されたModelを、RESTful WebServiceで処理するのが、この形に最も向いていると感じています。SQLベースのO/Rマッパーでもいいんですけど、それならサーバサイドはDBの呼び出し機能だけにして、実装はストアドでやった方が早いんじゃないかって気がしてます。Viewも処理せず単にSQL実行するだけなら、Javaはいらないんじゃないかというのが自分の個人的な感想です。
基本はこれでいけると思っているのですが、今までのクラシックなWebアプリケーションフレームワークが培ってきた様々な機能を、どう実現していくかが課題として残っています。例えばパラメータのバリデーション、セキュリティ機能等々・・・
バリデーションは、基本的にはサーバサイドかなぁ・・・RailsHibernateのようにModel側に定義するのが最も効率的でしょうか? Scripting実行機能を使って、サーバとクライアントでバリデーションを共有するとか出来たら面白いかも・・・
セキュリティ関連はとりあえず既存の仕組みの延長になると思うのですが、サーバサイドをステートレスと考えると、毎回全てのサーバアクセスに対してセキュリティチェックをかけることになります。ここら辺は、DBやO/Rマッパーのキャッシュ機能の重要性が増してきそうですね。
今のところ、自分が考えている組み合わせは・・・

こんな形です。RailsはクラシックWebフレームワークの中で唯一真正面からREST対応を考えているFWで、RIAに対しても最も先進的だと感じています。・・・ただし、ViewのHelper前提の機能が多過ぎるのが難点ですが・・・
Spring+AspectJは本当に何でもアリの多機能AOPを提供してくれるし、Jerseyにもバッチリ対応できます。JAX-RSが定義するResourceクラスはコンストラクタに渡すパラメータ等が存在するので、逆にAspectJでないと完全対応は難しいと感じています。
肝となるjQuery UIですが、統合的なUIライブラリとしてはまだまだ非力だと感じています。ただし、母体となるjQueryが超強力で、JavaScrpitの言語的常識まで覆すような柔軟で解りやすくて拡張性の高い機能を提供しているのが強みですね。
自分がここでクラシックと呼んでいるWebアプリフレームワークの殆どは、クライアントサイドを分離するのではなく、多機能なViewのHelperや、javaScriptをサーバサイド言語で管理するような仕組みを採用しているように感じています。私個人は、クライアント機能はクライアントサイドに任せるべきという考えですが、そうでない方向性が現在のサーバサイド開発の主流なんでしょうね(一部FlexをターゲットにしているFW等もありますけど、主流とは言い難いし・・・)。まぁ、主流じゃない考えを思いめぐらせるのもまた自由ということで・・・