SpringMVCで使えるテンプレートエンジンを比較してみた #jsug

この記事はSpring Framework Advent Calendar 2012 : ATND24日目の記事になります。
前回はKouhei_TokiさんのWebアプリケーションでSpring Integrationを使用する場合のスレッドでした。

Spring自体に関する話ではありませんが、仕事でSpringMVCなwebアプリを作るにあたりどのテンプレートがどういった特長あるんだっけ?といった疑問を抱くことがあったのでまとめてみます。

Springで使えるテンプレートエンジン

よく使われているテンプレートは大体以下の4つかと思います。

  • JSP
  • Velocity
  • Freemarker
  • Thymeleaf(new!)


まだstable版が出てから1年少しと新しいThymeleaf以外は、springframeworkでのサポートがされています。(Thymeleafもライブラリをmaven centralから取得出来ます)

機能性

JSPはカスタムタグを使ったり、view側でゴリゴリjavaコードを書けたり割となんでもできてしまいます。(viewでロジックを書きまくるのが良いのかはさておき・・)
一方他の3つは計算式やループ処理、条件文といった機能に絞られており、Thymeleafはフロント側でのescape処理といった機能も省かれています。

汎用性

JSPサーブレット環境でしか利用できませんが、VelocityやFreemarkerはwebアプリケーション以外の場面でも使えます。例えばJavaプログラムからメールの送信をする際、メール文をテンプレートエンジンで作成することも可能です*1

ナチュラルな記法

Thymeleafは資料にもあるようにとにかくHTMLに近い形でテンプレートを記述可能になっています。リスト変数をループで回す際も、テンプレートエンジン独特のタグを使わず以下のように記述できます。

<tr th:each="person : ${persons}">
	<td th:text="${person.name}">Name</td>
	<td th:text="${person.age}">Age</td>
</tr>


またThymeleafで記述したコードはそのままHTMLドキュメントとしてブラウザに表示できます。上記の場合、サーブレットから渡される変数部分の記述は無視され"Name"、"Age"が表示されます。そのため、サーブレット側の処理の実装を待たずしてマークアップエンジニアが先にテンプレートを記述し、表示の確認を進めることができます。
JSPやVelocity、Freemarker等ではプログラムチックになりがちなソースがピュアHTMLな感じに書けるので、ここは大きな違いかと思います。

ドキュメント・ツールの充実度

これに関してはJSPが充実。Velocity、Freemarkerもeclipseでは補完プラグイン*2*3IntelliJではデフォルトでのサポートが用意されています。Thymeleafに関しては、今のところeclipseIntelliJともにサポート機能無し。またサンプルソース・日本語ドキュメント等に関してもJSP、Velocityは多いですよね。Freemarker・Thymeleafに関してはちらほらブログで紹介されている方を見る程度。

パフォーマンス

定性的な比較だけではつまらないのでベンチマークを取ってみました。計測に用いたコードはhorimislime/spring-template-benchmarkにあります。テスト環境には

を使いました。コードの内容はコントローラ側で適当にリストへ要素を50個詰め込み、view側でテーブルに値を出力するといったものになっています。

@RequestMapping(value = "/", method = RequestMethod.GET)
public String index(Model model) {

	List<Person> persons = new ArrayList<Person>();
	
	for (int i = 1; i < 100; i++) {
		Person person = new Person();
		person.setName("person" + i);
		person.setAge(i);
		person.setHeight(170.5f);
		person.setWeight(60.5f);
		
		persons.add(person);
	}
	model.addAttribute("persons", persons);

	return "index";
}


速度計測はab - Apache HTTP server benchmarking tool - Apache HTTP Serverを用いました。以下のコマンドで1秒に何リクエストを捌けるか算出します。

ab -n 500 -c 10 http://localhost:8080/spring-template-benchmark

結果

以下、各テンプレートで1秒間に処理することができたリクエスト数です。いずれもViewResolverのcacheを無効の状態で数値を測りました。結果、FreemarkerがThymeleafと僅差ながらいちばん多くのリクエストを処理できています。

f:id:horimislime:20121223235602p:plain

まとめ

最後に、勝手ながらテンプレートエンジンの比較表を作ってみました。

機能性 汎用性 記法 資料等の充実度 パフォーマンス
JSP
Velocity
Freemarker
Thymeleaf


Freemarkerとかもtaglib使えば機能多いんじゃね?とかThymeleafは汎用性もなにも・・とツッコミどころはあるかと思いますがw参考程度という事で。 個人的には上にも書いたように、フロントさんとスムーズに仕事が進められそうなThymeleafにはすごく魅力を感じています。パフォーマンス面でも現時点で十分速いようなので、今後はツールやドキュメントの充実に期待です。