Rubyで書かれたWebアプリケーション・フレームワーク,Ruby on Railsが話題になってからすでに1~2年がたちますが,今でもフレームワークは高い注目を集めています。でも,ちょっとしたWebサイトなら,フレームワークなんて使わなくても自分で書いたほうが速いよ!と思っている人もいるかもしれません。Webアプリケーション・フレームワークを使うことで,いったいどのようなメリットがあるのでしょうか?

 一言でいうなら「手抜きができる」ということです。最近のフレームワークは,Webアプリケーションを構成するのに不可欠なコードを自動生成する機能を備えています。データの「読み,書き,変更,削除」を行う簡単なデータベース・アプリケーションなら,コードを1行も書かずに作ることも可能です。こうしたWebアプリケーションを一から書いたことがある方なら,「読み,書き,変更,削除」の機能を実装するだけでも結構手間がかかることをご存じでしょう。

 実際にWebアプリケーション・フレームワークを使って開発を行う際には,自動生成機能によってとりあえず動くものを手に入れ,必要な機能,例えばユーザー認証などの機能を付け足していく形で進めていきます。フレームワークを使った開発はいつも同じ流れで行えるので,慣れるにつれて効率よくプログラミングができるようになります。何人かで開発を進めるときにも全員が同じやり方で作業を進められます。既存のアプリケーションのコードに変更を加える場合にも,大まかな流れがすぐに理解できます。

 また,多くのプログラマが同じフレームワークを使っていると,フレームワーク自体がより使いやすく進化していくというメリットもあります。使い方のノウハウが蓄積され,悪いところがあれば大勢の手で直されていきます。セキュリティ面の問題も多くのユーザーの目でいち早く見つけ出されて,ユーザー全員にフィードバックされます。不便な機能は誰かが周辺ツールを開発して解決してくれるかもしれません。実際に,Ruby on Railは世界規模の巨大な利用者/開発者コミュニティを生み出しています。

 良いことずくめのようですが,フレームワークを使うにはちょっとしたコツがあります。「MVC」というパターンを意識することです。Mはモデル(Model),Vはビュー(View),Cはコントローラ(Controller)を示します。コントローラはWebアプリケーションの制御をつかさどる司令塔です。ビューは「見た目」すなわちWebページの部分です。モデルはデータの処理を行う部分であり,Webアプリケーションではデータベースとの接続が大きな役割になります。これらの機能でWebアプリケーションの開発がどう変わるのかを,もう少し詳しく見ていきましょう。

図   [画像のクリックで拡大表示]

Controller:制御をつかさどる司令塔

 コントローラは,WebページとWebページとの間の切り替え(ページ遷移)などの情報を集中管理するプログラムです。いわばWebアプリケーションの司令塔の役割を果たす機能であり,どんなWebアプリケーション・フレームワークもコントローラを必ず持っています。

 Webアプリケーションでは,ユーザーがWebブラウザを操作することで画面が切り替わっていきます。つまり,Webアプリケーションの開発とは「ユーザーのどの操作により,どの画面に切り替えるかを決めていく作業」だと言い換えることができます。

 インターネットのWWW(World Wide Web)のシステムは,あるWebページからどのWebページへと遷移するかの情報を,そのページの中にハイパーリンク(HTMLのa要素)として埋め込むことで成り立っています。入力フォームを持つようなWebサイト,すなわちWebアプリケーションでは,form要素のaction属性に遷移先を記述しますが,これもハイパーリンクと同じようなものです。つまり,ハイパーリンクで網の目のようにつながったWebページの集合全体が,WWWの制御の流れを表しているのです。

 インターネットの初期では,Webコンテンツといえば文書が中心でした。ですから,ハイパーリンクの仕組みはわかりやすく,ユーザーに広く支持されました。

遷移先の情報を一括管理

 ところが,Webアプリケーションでは,遷移先の情報がアプリケーション内に存在するWebページに散らばっていると,とても保守性が悪くなります。以下のような例で考えてみましょう。

図
[画像のクリックで拡大表示]

 Webアプリケーションで,データを入力して[送信]ボタンをクリックすると,データ登録完了ページが表示される機能があったとします。ところが,ユーザーの登録ミスが頻発することがわかりました。そこで,ユーザーが入力した内容を確認する画面を登録前に表示することにしました。

 この場合,どのような作業を行う必要があるのでしょうか。まず,データ入力ページから登録完了ページへの画面遷移を,データ入力ページからデータ確認ページへの画面遷移に変更する必要があります。そのうえで,データ確認ページから登録完了ページへのリンクを作ることになります。

 こうした変更が度重なると,手作業で遷移先を変更するのは非効率的です。また,ページ遷移の流れに大規模な変更を加える場合は,手作業で行っていると誤りが生じてしまうかもしれません。

 そこで,遷移先のページに関する情報を個々のWebページから取り除き,すべて1カ所で管理するために生まれたのがコントローラです。

 Webアプリケーションを構成する個々のWebページからは,必ずコントローラに飛ぶようにします。ほかのページに遷移する必要があるときにも,常にコントローラにリクエストを送ります。そのページは,具体的な遷移先がどこかを知らなくてかまいません。

 一方,コントローラには,個々のページからリクエストがあったら次にどこへ遷移すべきかを教えておきます。このように,ページ遷移の制御をコントローラが完全に掌握していると,ページ遷移を変更したい場合もコントローラの動作を変更するだけで済むようになります。一般的には,こうした情報は設定ファイルに書き込んでおき,コントローラがその情報を読み込むといった仕組みを取ります。

 具体的な動作を「Apache Struts(以下,Struts)」というJavaのフレームワークのコントローラで見てみましょう。Strutsのコントローラは「アクション・サーブレット」というJavaサーブレットです。Strutsアプリケーションを構成するWebページは,次の画面に移る際には必ずアクション・サーブレットを呼び出します。

 遷移先の情報はstruts-config.xmlという名前のXML形式の設定ファイルに記述しておきます。アクション・サーブレットは,このファイルから遷移先情報を読み取ります。アクション・サーブレットはWebページからのリクエストを受けると,設定ファイルでそのページに関連付けられたアクション・クラスを調べ,対応する処理を実行します。リクエスト元のページが入力フォームなどの場合にはActionFormBeansと呼ぶオブジェクトなどを介してアクション・クラスに引き渡します。アクション・サーブレットはアクション・クラスが返したステータスに応じて遷移先ページを決定し,そのページをブラウザに送り返します。

 Strutsでは,アクション・サーブレットという1個のコントローラと設定ファイルでアプリケーション全体のページ遷移を制御します。ただ,Ruby on Railsをはじめとする最近のWebアプリケーション・フレームワークでは,内蔵されているコード・ジェネレータを利用し,機能ごとに生成した複数のコントローラを利用するのが普通です。