Javaフレームワーク調査2015 - Spring編
結論からいうと、Play Frameworkがちょっと思ったより独自色+カジュアルな感じだったので、今回はSpring使う方向で考えています。 なのでフェアな比較記事路線ではなく、実際に使う上での懸念事項などをまとめたメモになります。
概要
- 当初はDIコンテナだったが、併用が想定されていたStrutsの出来が悪いため独自のMVCフレームワークも作られ、結果的にフルスタックになっている。ただしプロジェクトごとに使いたい機能を一部分だけ使うことができる。
メリット
- Spring Bootによって導入が簡単になった。
- 一部分だけを使えるので、一度学習するといろんなプロジェクトで利用/応用できる。
- ネット上の情報は非常に多い。Spring MVCも海外ではStruts以上に使われている。
デメリット
- Java EEなみに大きなプロジェクトで、全容を把握しづらい。
- 学習コストはそこそこ高い。
メリットでもありデメリットでもある点
- 一つの目的に対して幾つものソリューションがあるため取捨選択が大変だが、選択肢が多いことで守備範囲が広くつぶしがきく。
各論
DIコンテナ
- Spring Frameworkの要。僕は(多くの人がそうであるように)DIコンテナそのものの概念をSpringによって知ったくらいなので、DIコンテナとしての信頼性は高いと思っている。
- そもそもDIコンテナは「オブジェクト同士を疎結合にすること」と「オブジェクトの生成を一元管理すること」を目的にするためのものだと思うが、これを利用する副作用としてソースを一見して何が行われているのかわかりにくくなる。より正確に言うと「ビジネスロジックは見やすくなるが、ソースの実行順序は追いにくくなる」と思う。アノテーションと設定ファイル地獄になる。
- 思想的にはDDD(ドメイン駆動設計)が念頭にあるのではないかと思われるが、僕自身はDDDにはそれほど明るくない。
- バグを減らすためには実装時にはDIコンテナに任せるオブジェクトと、逐次newするオブジェクトを分けたほうがいいのではないかとなんとなく思う。ただしそのルールづくりが大変かもしれない。じゃないとその手法によってかえってバグが生まれるかもしれない。
Webフレームワーク
Spring MVC
- ベターStruts。SpringのDIを使って開発する場合、普通はこれを使うのだろう。
JSF
- Spring MVCを使わない場合の選択肢として有力なのは多分JSFだと思う。僕の理解では、Servlet寄りでMVCを提供するのがStrutsやSpring MVCだとすると、JSP寄り(HTML寄り)でMVCを提供するのがJSFという感じ。
- Java EEの一部だが単独で使用可能。
それ以外
Spring Web Flow
- ちょっと横道にそれて軽く調べた感じだと、Spring MVCであれJSFであれStrutsやTapestryであれ素のServlet/JSPであれ併用できる、画面遷移コントローラー(?)。
- 今のところ利用方法もメリットもさっぱりわからないが、ダークホースのにおいがする。
Spring Data REST
データアクセス
Spring Data JPA
- O/Rマッパー。
- JPAをSpring流儀で使いやすくしたもの。JPAの実装としてはHibernateを使用している。
- JPAの(Hibernateの)特徴をそのまま引き継ぐので、よくも悪くもJPAの(Hibernateの)評価と同じ。
- 僕はO/Rマッパー嫌いを自認している。僕にとって一般的な(JPA/Hibernate型の)O/Rマッパーを嫌う点として、以下のものがある。
- テーブル設計先行プロジェクト、あるいは既存プロジェクトへの適用が困難な点。
- 生成されるSQLのチューニングが難しい点。
- 複合主キーを使えない(使いにくい)点。
- 1対多の結合オブジェクトにおいて、1+多のクエリーが発行されてしまう点(俗にいうN+1問題)。
MyBatis
- MyBatis-Spring によってSpringとの連携が可能な、オルタナティブなO/Rマッパー。
- JPAとの最大の違いは、JPAのようにオブジェクトを定義することでSQLを自動生成するのではなく、逆にSQLを記述することでオブジェクトを生成する点。
- SQLはxmlに記述する。
- 僕は使ったことはないが、テーブル設計先行プロジェクトにおいての利用価値が高い点から、とても注目している。
- もうちょっと調査してみる。
Spring開発セット
Spring Roo
- Springでの開発効率を上げるためのコマンドラインツール。
- RADとあるが、DelphiやVBのようなものではない。
- Rooを使うとRooに依存したソースが生成される。その依存性は削除できるが削除するとRooからは利用できない。
- Rooが決め打ちで用意しているライブラリを必然的に使うことになり、選択の自由はあまりない(多分)。
Spring Boot
- Springの環境構築を容易にするためのSpringのスターターパック。
- 各モジュールはSpring Bootがあらかじめおすすめしているバージョンが組み合わせてあり基本的にはそれを使うことになる。
- 開発開始時点ではSpring Bootに用意されているものを利用しつつ、徐々にBoot外のものを利用していくこともできる。
- PHPやPerlにとってのXAMPPのようなものだと考えればいいか。
まとめ
- 現状では以下の構成で考えている。
- Apache HTTP Server
- Apache Tomcat
- Spring Framework (Spring Boot)
- Spring MVC
- MyBatis