sohatach's blog

http://github.com/soha

Spring BootからのSpring Dataを使ってみる。

個人的には最近Scala大好きになりつつあり、できることならScalaで仕事をしたいところですが、
現実には、やはり現場の実態を考えるとJavaにせざる得ない様々な事情もあるため、
Javaで使用するフレームワーク(Spring)について調べてみました。
DIコンテナとしてのSpring Frameworkは、以前から使っていましたが、
たくさんプロダクトがあり、把握しきれていないものも多く
改めてSpring BootやSpring Dataのあたりを勉強しています。
最近のやり方をきちんとマスターすれば、そんなにめんどくさくないものになってる気がしています。

Spring Bootとは

関連するプロダクトが増えすぎて、複雑になってしまったSpringアプリケーションの開発を簡単に実現するためのプロダクトだそうです。
http://projects.spring.io/spring-boot/

Spring Dataとは

様々なデータストアに対するアクセスを抽象化するライブラリ。
今回は、JavaRDBMSアクセス仕様であるSpring Data JPAを使う。
QueryDSLのtypesafeクエリに対応しているようなので、こちらをぜひとも活用したいところ。

調べたこと

Spring Bootについては、以下のサイトなどを参考にさせていただきました。
確かに簡単にSpringによるWebアプリが作れるようです。

・Spring Boot 入門
http://www.techscore.com/blog/2014/05/01/spring-boot-introduction/

・Spring Bootで高速アプリ開発
http://dev.classmethod.jp/server-side/java/springboot/


ここまでは良いものの、データベースを使ったより実践的な作り方が知りたかったため、少し調べてみました。
Springでは、データベースアクセスにSping Dataというプロダクトを使用するようであり、
上記サイトにて以下のサンプルが紹介されていました。
https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-data-jpa

これを読んでみます。
ソースを追いやすくするために、Eclipseにインポートします。

git clone https://github.com/spring-projects/spring-boot.git
cd spring-boot\spring-boot-samples\spring-boot-sample-data-jpa
mvn eclipse:eclipse

Eclipseプロジェクトファイルが生成されるため、Eclipseにインポートできるようになります。

どこから見ていったらいいかわからなかったため、とりあえずテストを実行してみました。

mvn test

ずらずらと処理が行われ、3つほどあったテストがすべて通りました。
データベースにアクセスするテストなので、テスト実行時に自動的にテーブルなども作成してくれたようです。(hqsldb)


調べた結果以下のことがわかりました。

CityなどのEntityクラスとそれに対応するRepositoryインターフェース(CityRepository)があり、
インターフェースにメソッドを定義するだけで、(実装メソッドを書かずに)クエリが発行できるようです。
RepositoryインターフェースがいわゆるDAOクラスに相当するものと考えられそうです。
上記サンプルでは、CityServiceImplクラスで、CityRepositoryとHotelRepositoryクラスを使うなどの実装になってました。


Spring Dataの基本的な使い方については、以下のサイトが非常に役に立ちました。

・intra-mart Accel Platform / TERASOLUNA Global Framework プログラミングガイド
第3版 2014-04-01
Spring Data JPAを使用したプログラミング方法
http://www.intra-mart.jp/download/product/iap/development/tgfw_programming_guide/texts/application/database/programing/jparepository/index.html

ある特定のネーミングルールに従いメソッド名を定義すると、Spring Data JPAの機能によってメソッド名から実行するQuery(JPQL)が生成されます。

List findByEmailAddressAndLastname(String emailAddress, String lastname);

select u from User u where u.emailAddress = ?1 and u.lastname = ?2

のようなクエリに自動変換されるとのことです。
SQLを直接書く必要がない。

Queryアノテーションを使用すれば直接クエリを書くこともできるようです。

@Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);

都度都度クエリを全部書く必要のあるMyBatisなどと比べるとこちらの方が楽そうです。



DBアクセスなどの設定の書き方がプロパティファイルだったり、XMLだったり、アノテーションだったり、
application.propertiesに書くべきなのか、persistence.xmlに書くべきなのかなど
https://github.com/spring-projects/spring-data-jpa-examples/tree/master/spring-data-jpa-example
こちらのサンプルでは、persistence.xmlにDB接続情報が書いてあるようです。)
結局どう書くのがいいのかよくわかっていないところがありますが、
動かしながら理解していきたいと思います。できれば個人的には、XMLはなくしていきたいところ。。。
Spring BootからSpring Data(QueryDSL)使ってXMLのないWebアプリを作ってみたい。