アイエエエエ! ニンジャ!? ニンジャナンデ!?

ドーモ。ドクシャ=サン。ヨッチャンです。

Ninja Frameworkって知っていますか?日本では全くといって良いほど情報が無いです。しかし今後注目していきたいプロダクトです。

Ninja Frameworkとは?

JavaのFrameworkです。詳しい経緯は知りませんがPlay1の後継っぽいです。Play1からPlay2になったときにあまりにも変化が激しすぎるため作られたのがNinja Frameworkじゃないかなと考えてます。

既存のライブラリ等をうまく使っており、ビルド管理はMaven、ベースにDIコンテナのGuice、DBのO/RマッパーにJPA(実装はHibernate)、ViewにはFreeMarkerを採用しています。

柔軟性の高さ

ベースにGuiceを使っているだけあってソースを読むとDIコンテナとしての機能をうまく使っている印象です。疎結合でコアの部分もinterface化されており、プラガブルとなっています。プラガブルということはそこに自分で作ったクラスをバインドすることができ、プラグイン機構なしでプラグインが作れます。というかGuice最高です。

Google App Engineに公式対応

JavaでGAEといったらSlim3が有名でデファクトっぽいですが、最近息してないように見受けられる(個人的な感想ですよ)ため、他のFrameworkを探していました。私はScalaを使っているため、最初はPlay2を使いたかったのですが、GAEでは動かないため断念しました。(Play2難しいといった理由も…)他にも色々調べましたがScalaのFrameworkでは私の観測範囲では全滅でした。

Javaまで広げて調べたところ、Ninja Frameworkと出会いました。GAEのモジュールを導入するだけで使えるんです!公式がサポートしています。その場合DataStoreを使うため、JPAではなくObjectifyが標準になります。

気になるスピンアップの速度ですが、計測してないのでわかりません。

Scalaから使ってみる

JavaのFrameworkなのでもちろんScalaで使えます。ただしJavaで書かれているため、癖があったりします。例えば、FreeMarkerで変数を表示させる場合、hogeがJavaBeansもしくはpublicなフィールドだとすれば
${hoge.huga}
と書きますが、Scalaのオブジェクトだとランタイムエラーになります。これはScalaのフィールドアクセスは同名のメソッドで行うといった仕様のためです。よって
${hoge.huga()}
と大変イラッとする書きかたをする必要があります。@BeanPropertyアノテーションを付けるとgetter/setterが作成されますが、同名のメソッドも生成されるためそちらが優先されます。

そこでGuiceをつかったプラガブルな仕組みが役に立ちます。TemplateEngineをScalaに対応させたものにバインドさせるだけです。楽ですね!

他にはMavenでScalaをビルドできるようにするぐらいでしょうか。

というわけで、軽くNinja Frameworkについて触れてみました。英語の情報すらも公式以外あまりないですがそれが楽しめるならば触る価値はあると思いますし、実際作ってみると楽しいです。興味があったら是非触ってみて下さい。