Liftとは
では、Webアプリケーションフレームワーク「Lift」の紹介に入ります。
Liftは、David Pollak氏を中心に、Apache Licence 2.0のもとでオープンソースとして公開され、現在も活発に開発が続けられています。
LiftのソースコードはGithub上(http://github.com/dpp/liftweb/tree/master)にホストされています。また、Google Group上で活発な議論が行われおり、まだまだこれからも発展していくと思われます。
執筆時点(2009年8月7日)での正式リリース版はLift 1.0ですが、Scala 2.8のリリース後(おそらく2009年9月)にScala 2.8に対応したLift 1.1がリリースされる予定です。
Liftのコンセプトは、"The Simply Functional Web Framework"。直訳すると、「簡潔な関数型Webフレームワーク」でしょうか。
「関数型Webフレームワーク」というフレーズは、Liftの特徴を実によく表しています。Liftは、先述したXMLリテラルや関数オブジェクトなどのScalaの言語仕様を非常にうまく利用して、簡潔な記述でWebアプリケーションを構築できるようになっているのです。
また、Liftは、先行する多くの優れたWebアプリケーションフレームワーク(Ruby on Rails - Ruby、Django - Python、Seaside - Smalltalk、Apache Wicket - Java)から機能/コンセプトを取り入れています。
Ruby on Railsからはキックスタートの早さと規約による設定(Convention over configuration)を、Djangoからは充実したAdminサイトの機能とビルトイン関数を、Seasideからは細やかなセッション状態の保持を、Apache Wicketからはコンポーネントモデルとデザイナと協業できるテンプレートシステムを、といった具合です。
そして、LiftはフルスタックのWebアプリケーションフレームワークです。
Webアプリケーションを開発するためには、HTTPサーバーやアプリケーションサーバー、データベースなどのミドルウエア、O/Rマッパーやテンプレートエンジンなど様々なライブラリが必要になります。
しかし、Liftは上記の環境一式を全て提供します。開発者は、Liftを利用し始めてすぐに動作させ、プログラムを書き始めることが可能なのです。
比較的新しいフレームワークですが、海外のみならず、日本国内でも開発事例があり、実際の案件でも利用されています。
Liftの特徴
もう少し詳しく、Liftの機能について解説します。
1. フルスタックのWebアプリケーションフレームワーク
先ほども述べましたが、LiftはフルスタックのWebアプリケーションフレームワークです。Webアプリケーションの開発に必要なものは全て含まれています。
アプリケーションサーバとしてJettyが付属していますし、データベースはH2 Database Engineが同梱されています。もちろん、テンプレートエンジンやO/Rマッパーも含まれています。
2. Snippetアプローチ
Liftが他のフレームワークと決定的に異なる点は、このSnippetアプローチというアーキテクチャでしょう。Snippetとは、小さなプログラムの断片を意味しますが、LiftのSnippetはテンプレートに対して動的な出力を提供するコンポーネントという意味合いです。
一般的なWebアプリケーションフレームワークはMVC(Model-View-Control)アーキテクチャを採用していることが多いですが、LiftではMVCのCに相当するコントローラは、少なくとも開発者が意識すべきものとしては存在しません。
Liftはテンプレートを解釈して出力を生成する過程で、Snippetを呼び出して動的な出力の生成やModelの操作を行うのです。
いうなれば、Viewを中心としたアーキテクチャなのです。
CoCによる設定
Webアプリケーションの設定にXMLを採用することで、大量のXMLファイルを管理/更新しなければならないXML地獄に陥った経験をお持ちの方も多いでしょう。
こうしたXML中心の設定に対してのアンチテーゼとして、規約による設定(CoC:Convention over Configuration)を採用するフレームワークが増えてきました。
また、Javaによるフレームワークの中には、設定ファイルによる定義はIDEによる補完やリファクタリングの恩恵を得られないため、Javaのプログラム内で設定を記述すべきであるという考え方もあります(Google GuiceやApache Wicketなど)。
Liftでは、双方のアプローチを採用しています。
URLに対してのマッピングやデータベースへの接続設定はScalaのプログラム内で、データベースのテーブルへのマッピングやテンプレートとSnippetの紐付けなどはCoCで行うようになっています。
3. 高機能なO/Rマッパー
一般的なWebアプリケーションでは、データの永続化にデータベースを利用することがほとんどでしょう。Liftに付属しているO/R マッパーは、CoCによる簡単なModelの定義で、柔軟なデータ操作が可能です。付属のO/R マッパー以外に、JPA(Java Persistence API)も利用できます。
また、データベースのスキーマとModelに定義されているプロパティを同期する、schemifyという機能がサポートされており、スキーマを拡張しながらの開発が可能です。
4. maven 2によるクイックスタート
Liftのプロジェクトを作成するためには、コマンドラインからmaven 2のコマンドを入力するだけでOKです。
コンパイルや開発用サーバーの起動もmaven2のコマンドで起動できます。もちろん、EclipseやNetBeansなどのIDEを利用した開発もサポートしています。
5. ユーザー管理、SiteMap、ACLなどの組み込み
Webアプリケーションでよく使われる機能である、ユーザー管理やメニューを作成するSiteMap、アクセスコントロール(ACL)がデフォルトで組み込まれています。
また、これらの設定はScalaのプログラム内で行いますので、Scalaの言語機能を利用して柔軟な設定が可能ですし、動作をカスタマイズすることもできます。
6. jQueryを利用したAjax
最近のWebアプリケーションではAjaxを利用したユーザーインターフェースを採用することが多いかと思われます。
LiftにはjQueryが標準で含まれており、Snippetと組み合わせることで簡単にAjaxを利用したアプリケーションを作成することができます。AjaxでのリクエストをSnippetに処理させることができますし、Scalaのプログラム内からJavaScriptを発行することができます。
7. Cometサポート
Cometは、サーバで発生したイベントをリアルタイムでブラウザに通知する技術です。通常はJavaScriptによってサーバーとコネクションを継続させることで実現します。
Cometを利用することで、チャットのようにリアルタイムで通知が必要なアプリケーションをWebアプリケーションとして実現することが可能なのです。
Liftでは、組み込みの機能でScalaのActorライブラリを利用したCometアプリケーションの作成をサポートする機能が備わっています。
8. Liftコンソール
Ruby on RailsやDjangoなどのLL言語のフレームワークでは、フレームワークの設定や実際の動作を確認できる対話型インターフェイスが利用できるものが多くあります。
Liftでも対話型インターフェースが利用できますので、データベースにアクセスして動作確認しながらビジネスロジックをプログラミングすることができます。図2は、Liftコンソールを利用して、データベース内のUserテーブルを検索した様子です。
こうして機能を見てみると、最近のWebアプリケーション開発で必要な機能はほとんどそろっていることが分かると思います。