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*3、IntelliJではデフォルトでのサポートが用意されています。Thymeleafに関しては、今のところeclipse・IntelliJともにサポート機能無し。またサンプルソース・日本語ドキュメント等に関してもJSP、Velocityは多いですよね。Freemarker・Thymeleafに関してはちらほらブログで紹介されている方を見る程度。
パフォーマンス
定性的な比較だけではつまらないのでベンチマークを取ってみました。計測に用いたコードはhorimislime/spring-template-benchmarkにあります。テスト環境には
- Macbook Pro(QuadCore i7 2.2GHz)
- Jetty6.1.10
を使いました。コードの内容はコントローラ側で適当にリストへ要素を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と僅差ながらいちばん多くのリクエストを処理できています。
まとめ
最後に、勝手ながらテンプレートエンジンの比較表を作ってみました。
機能性 | 汎用性 | 記法 | 資料等の充実度 | パフォーマンス | |
JSP | ◎ | △ | △ | ◎ | ◯ |
Velocity | ◯ | ◎ | ◯ | ◯ | ◯ |
Freemarker | ◯ | ◎ | ◯ | △ | ◎ |
Thymeleaf | △ | ◯ | ◎ | △ | ◎ |
Freemarkerとかもtaglib使えば機能多いんじゃね?とかThymeleafは汎用性もなにも・・とツッコミどころはあるかと思いますがw参考程度という事で。
個人的には上にも書いたように、フロントさんとスムーズに仕事が進められそうなThymeleafにはすごく魅力を感じています。パフォーマンス面でも現時点で十分速いようなので、今後はツールやドキュメントの充実に期待です。