オレオレ開発の友、Gotham始めました

なんか最近、自分が欲しいなあと思っているのが(仕事では求められてないんだけどw)、優れたフレームワークというよりかは開発の友なんです。みなさんはどうやってJavaアプリケーション作ってますかね?どこらへんがボトルネックですか?環境依存ですか?まどろこしいですか?測れますか?自動化できますか?
思えばRailsフルスタックっぷりにビビっときて、最近ではPerlのMENTAをみて、そして身近なところではSpringRooに期待してたのですが、ちょっと想像してたのとちがって、じゃ、自分用の開発ツール作ろうかなと思ったのが動機です。

で、作るにあたってはせっかくなのでポリシーを設けました。

速・小・単純

なんかこれだけみると男としてふがいないような感じでちょっぴり恥ずかしいのですがwま、こんなところです。自分にピッタリかも、ウフ。今、ソフトウェアスタックはありもののFWでとりあえず試し始めました。ある程度は独自のものに切り替えようかと考え中です(しないかもしれないけど)。現時点で依存ライブラリは5,6個です。各レイヤで1個ぐらいです。なんかね機動性を鈍らせているひとつに依存ライブラリが多いことってあるじゃないですか。気軽にライブラリのバージョンアップあげられますか?Mavenどうですか?しっくりきてますか?いち早く、アプリつくって人に見せたいのにmavenの環境作ったりノウハウためたり、工夫したり、ってちょっと遠回りしててイヤなんですね。依存ライブラリ少なかったらそこらへんの作業も減るかなぁと。
で、スタックのトップバッターはwinstoneです。組み込みServletコンテナとしてお世話になることにしました。だからGothamではpropertiesファイル1個用意はしますがTomcatとかはなくてもとりあえずOK。webアプリの起動は以下のとおり。

Alfled.deploy("web",8080); //"web"はwebアプリのclassがあるフォルダ。ここにWEB-INFとかも置いておく
Alfled.run();

これをstatic void mainとかに書いて実行すればOK!Groovyで実行したいひともそのまま使えます。僕はGroovy使わんけど。
開発の友、Gothamと対話するインタフェースは今のところ2つです。ひとつは上記に書いた通り、Alfledです。彼はwebアプリ起動、デプロイなどに関することを依頼することになります。もうひとつはRobinです。彼にはDB周りです。webアプリの中でも登場可能ですが、普段でも

Robin robin = new Robin();
robin.createTable(Car.class);

ってやるとCarテーブルを作ったりします。Carクラスにアノテーションはるのですが、ちょっと悩み中です。ここでもスタックその2はH2です。H2には便利な機能が多くてCSVからのデータ読み込み、出力などが簡単にできるのでまるっと委譲できるので楽チンです。
Data AccessにはDBUtilsを今はそのまま使ってます。クラスが全部で21個しかないんですね。htmlテンプレートエンジンにはFreemarkerです。web部分にはclickを今は使っていますが、変える可能性大です。何かがNGというよりかは単純にServletプログラミングをしたいだけなんです。ただそのまま昔のように書いてたら時間もかかるは、ミスもあるはで大変なので、そこらへんは最近の技術つかって何か工夫する予定です。で、DIは今はGuice使ってます。これもAPTベースで独自DIっぽく変えたいなぁと思ってるのですがScopeの扱いを考え中。うまくキャッシュ機構とからめるとScopeって無視できなくて。他にもメッセージング、Domain(業務固有領域)部分、スケールな仕組みなどもおいおい考えます。
 
というわけで上記2つのAlfled,RobinのAPIもそうなんですが、基本的にはJava,Java,Javaです。Javaでなんでも指示できるようにしたいと思っています。やっぱJava楽しいっす。