はじめに
前回の記事では、MongoDBを使ったアプリケーション開発の前提知識として、MongoDBの基本概念と基本操作を解説しました。今回は実際にSpring Data MongoDBというフレームワークを用いて、MongoDBを操作するアプリケーション開発を行っていきます。
Spring Data MongoDBとは
Spring Data MongoDBの前に、まずSpring Dataについて触れておきたいと思います。Spring Dataとは、Javaのフレームワークとして著名なSpring Frameworkのサブプロジェクトの一つです。従来、SpringではデータアクセスをサポートするコンポーネントとしてSpring JDBCを提供したり、O/RマッパーとしてHibernateやJPAをサポートしていました。しかし、あくまでもデータストアとしてRDBMSが利用されることを前提としていました。ところが、昨今ではNoSQLに代表されるように、RDBMS以外のさまざまなデータストアが提供されています。
Spring Dataの目指すところは端的に言うと、Springのプログラミングモデルをベースとして、このようなさまざまなデータストアに対しインターフェースの抽象化と共通化を提供することです。SpringのプログラミングモデルとはDIやAOP、それにPOJOを利用したデータアクセスです。実際にはSpring Dataプロジェクトはさらにサブプロジェクトとしてサポートするデータベースに応じて開発・提供が行われています。サポートされているデータベースは、Spring Dataの公式ページで確認できます。
リストを見ると分かりますが、本連載で扱うMongoDBのようなNoSQLと呼ばれるデータベースの他にも、HadoopなどのMapReduceフレームワークやRDBもサポートしています。今回の記事では、このうちMongoDBをサポートしているSpring Data MongoDBを利用していきます。Spring Data MongoDBではテンプレート、オブジェクトマッピング(Javaオブジェクトとデータストアとのマッピング)、リポジトリをサポートしています。
環境
今回の記事における筆者の環境は以下のようになっています。今回はこの環境を前提として解説を行いますので、必要に応じて適宜読み替えてください。
- OS:Mac OSX Mountain Lion
- Javaバージョン:1.7.0_15
- Spring Tool Suite:3.1.0.RELEASE
- Spring Framework:3.2.1.RELEASE
- Spring Data MongoDB:1.2.0.RELEASE
- MongoDB:2.2.2
なお、今回はIDEとして純粋なEclipseではなく、Spring Frameworkを利用したアプリケーション開発に最適化されているEclipseをベースのIDEであるSpring Tool Suite(以下、STS)を利用しています。STSでの作業は必須ではありませんが、Springを利用したプロジェクトの初期セットアップなどが比較的簡単に行えますので、Springベースのアプリケーション開発をする場合はおすすめです。
また、前回MongoDBをインストールした環境上で作業を行います。
プロジェクトのセットアップ
まずはSpring Dataを利用したプロジェクトをセットアップします。今回はSTSを利用しているので、Springのテンプレートプロジェクトを使ってセットアップしていきます。STSに用意されているSpringのテンプレートプロジェクトを利用すると、Springを利用する場合の標準的なフォルダ構成やMavenのセットアップを簡略化することができます。
[File]-[New]-[Spring Template Project]を選択し、表示されているテンプレートの中から「Simple Spring Utility Project」を選択して「Next」をクリックします。続いて、プロジェクト名および起点となるトップレベルパッケージの名称を入力して「Finish」をクリックします。プロジェクトが作成されたら、続いてpom.xmlを編集してSpring Data MongoDBに関する依存関係の設定を追記します。
<dependencies> (省略) <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.2.0.RELEASE</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>2.2.2</version> </dependency> </dependencies>
続けて、利用するSpringのバージョンを執筆時点の最新版である3.2.1.RELEASEを利用するように変更します。STSを使ってセットアップした場合、Springのバージョンはプロパティとして指定されているので、その値を修正します。
<properties> (省略) <spring.framework.version>3.2.1.RELEASE</spring.framework.version> </properties>
STSのテンプレートプロジェクトでセットアップを行うと、ログライブラリとしてlog4jがセットアップされますが、設定は用意されずこのままでは十分なログが出力されません。そこでSpringが利用するロギング用のインターフェースであるslf4jを追加し、log4j用の設定ファイルを最低限の内容でsrc/main/resources/log4j.propertiesとして用意します。
<dependencies> (省略) <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.2</version> </dependency> </dependencies>
log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %5p %40.40c\:%4L - %m%n
Configurationクラスの用意
ここからはMongoDBを利用するにあたって、接続などの設定を行います。今回はXML形式での設定ではなく「Java-based container configuration」という方法で設定します。簡単に説明すると、各種設定を従来のXML形式で行うのではなくJavaのクラスとして用意し、アノテーションベースで設定を行っていきます。以下のようなクラスを用意します。なお、本稿では前回インストールしたMongoDBを利用します。
@Configuration public class AppConfig { @Bean public MongoFactoryBean mongo() { MongoFactoryBean mongo = new MongoFactoryBean(); mongo.setHost("localhost"); return mongo; } @Bean public MongoTemplate mongoTemplate(Mongo mongo) { MongoTemplate mongoTemplate = new MongoTemplate(mongo, "example"); return mongoTemplate; } }
上記のコードではMongoFactoryBeanでMongoDBへの接続情報を設定し、それを利用する形でMongoTemplateの登録を行っています。
MongoTemplateとは、Spring Data MongoDBが提供するテンプレートクラスです。MongoOperationsインターフェースを実装しており、MongoDBへのCRUDに関する操作やJavaオブジェクトとMongoDBのドキュメントとのマッピングを提供します。今回は接続先としてローカル環境にインストールされたMongoDBの"example"というデータベースに接続するように設定しています。
なお、前回説明したのと同様、データベースはこの時点では存在していなくても構いません。必要に応じて自動的に作成されます。