このガイドでは、Spring Data MongoDB を使用して、ドキュメントベースのデータベースである MongoDB (英語) にデータを保存および取得するアプリケーションを構築するプロセスを順を追って説明します。

構築するもの

Spring Data MongoDB を使用して、Customer POJO(Plain Old Java Object)を MongoDB データベースに保存します。

必要なもの

このガイドを完了する方法

ほとんどの Spring 入門ガイドと同様に、最初から始めて各ステップを完了するか、すでに慣れている場合は基本的なセットアップステップをバイパスできます。いずれにしても、最終的に動作するコードになります。

最初から始めるには、Spring Initializr から開始に進みます。

基本スキップするには、次の手順を実行します。

完了したときは、gs-accessing-data-mongodb/complete のコードに対して結果を確認できます。

Spring Initializr から開始

すべての Spring アプリケーションでは、Spring Initializr (英語) から始める必要があります。Initializr は、アプリケーションに必要なすべての依存関係をすばやく取り込む方法を提供し、多くの設定を行います。この例では、Spring Data MongoDB 依存関係のみが必要です。

次のリストは、Maven を選択したときに作成される pom.xml ファイルを示しています。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.2.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>accessing-data-mongodb</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>accessing-data-mongodb</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-mongodb</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

次のリストは、Gradle を選択したときに作成される build.gradle ファイルを示しています。

plugins {
	id 'org.springframework.boot' version '2.3.2.RELEASE'
	id 'io.spring.dependency-management' version '1.0.8.RELEASE'
	id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
	testImplementation('org.springframework.boot:spring-boot-starter-test') {
		exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
	}
}

test {
	useJUnitPlatform()
}

MongoDB のインストールと起動

プロジェクトをセットアップしたら、MongoDB データベースをインストールして起動できます。

Mac を Homebrew とともに使用する場合、次のコマンドを実行できます。

$ brew install mongodb

MacPorts を使用すると、次のコマンドを実行できます。

$ port install mongodb

Redhat、Ubuntu、Debian、CentOS、Windows など、パッケージ管理を備えた他のシステムについては、https://docs.mongodb.org/manual/installation/ (英語) の手順を参照してください。

MongoDB をインストールしたら、次のコマンド(サーバープロセスも起動します)を実行して、コンソールウィンドウで起動できます。

$ mongod

次のような出力が表示されます。

all output going to: /usr/local/var/log/mongodb/mongo.log

単純なエンティティを定義する

MongoDB は NoSQL ドキュメントストアです。この例では、Customer オブジェクトを保存します。次のリストは、Customer クラス(src/main/java/com/example/accessingdatamongodb/Customer.java 内)を示しています。

package com.example.accessingdatamongodb;

import org.springframework.data.annotation.Id;


public class Customer {

  @Id
  public String id;

  public String firstName;
  public String lastName;

  public Customer() {}

  public Customer(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  @Override
  public String toString() {
    return String.format(
        "Customer[id=%s, firstName='%s', lastName='%s']",
        id, firstName, lastName);
  }

}

ここに、idfirstName および lastName の 3 つの属性を持つ Customer クラスがあります。id は、主に MongoDB による内部使用向けです。また、新しいインスタンスを作成するときにエンティティを設定する単一のコンストラクターがあります。

このガイドでは、一般的な getter と setter は簡潔にするために省略されています。

id は MongoDB ID の標準名に適合するため、Spring Data MongoDB にタグ付けするための特別なアノテーションは必要ありません。

他の 2 つのプロパティ firstName と lastName にはアノテーションが付けられていません。これらは、プロパティ自体と同じ名前を共有するフィールドにマップされると想定されています。

便利な toString() メソッドは、顧客に関する詳細を出力します。

MongoDB はデータをコレクションに保存します。Spring Data MongoDB は、Customer クラスを customer というコレクションにマップします。コレクションの名前を変更する場合は、クラスで Spring Data MongoDB の @Document (英語) アノテーションを使用できます。

単純なクエリを作成する

Spring Data MongoDB は、MongoDB へのデータの保存に重点を置いています。また、クエリを導出する機能など、Spring Data Commons プロジェクトから機能を継承します。基本的に、MongoDB のクエリ言語を学ぶ必要はありません。少数のメソッドを記述でき、クエリが自動的に記述されます。

これがどのように機能するかを確認するには、次のリスト(src/main/java/com/example/accessingdatamongodb/CustomerRepository.java 内)が示すように、Customer ドキュメントを照会するリポジトリインターフェースを作成します。

package com.example.accessingdatamongodb;

import java.util.List;

import org.springframework.data.mongodb.repository.MongoRepository;

public interface CustomerRepository extends MongoRepository<Customer, String> {

  public Customer findByFirstName(String firstName);
  public List<Customer> findByLastName(String lastName);

}

CustomerRepository は MongoRepository インターフェースを継承し、動作する値のタイプと ID をそれぞれ Customer と String に差し込みます。このインターフェースには、標準の CRUD 操作(作成、読み取り、更新、削除)を含む多くの操作が付属しています。

他のクエリを定義するには、メソッドシグネチャーを宣言します。この場合、findByFirstName を追加します。これは、本質的にタイプ Customer のドキュメントを検索し、firstName で一致するドキュメントを検索します。

findByLastName もあります。これは、姓で人のリストを検索します。

典型的な Java アプリケーションでは、CustomerRepository を実装するクラスを作成し、自分でクエリを作成します。Spring Data MongoDB が非常に便利なのは、この実装を作成する必要がないという事実です。Spring Data MongoDB は、アプリケーションの実行時にその場で作成します。

これで、このアプリケーションを接続して、その外観を確認できます!

アプリケーションクラスを作成する

Spring Initializr は、アプリケーションの単純なクラスを作成します。次のリストは、Initializr がこの例(src/main/java/com/example/accessingdatamongodb/AccessingDataMongodbApplication.java 内)で作成したクラスを示しています。

package com.example.accessingdatamongodb;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AccessingDataMongodbApplication {

  public static void main(String[] args) {
    SpringApplication.run(AccessingDataMongodbApplication.class, args);
  }

}

@SpringBootApplication は、次のすべてを追加する便利なアノテーションです。

  • @Configuration: アプリケーションコンテキストの Bean 定義のソースとしてクラスにタグを付けます。

  • @EnableAutoConfiguration: クラスパス設定、他の Bean、およびさまざまなプロパティ設定に基づいて Bean の追加を開始するよう Spring Boot に指示します。例: spring-webmvc がクラスパスにある場合、このアノテーションはアプリケーションに Web アプリケーションとしてフラグを立て、DispatcherServlet のセットアップなどの主要な動作をアクティブにします。

  • @ComponentScan: Spring に、com/example パッケージ内の他のコンポーネント、構成、およびサービスを探して、コントローラーを検出させるように指示します。

main() メソッドは、Spring Boot の SpringApplication.run() メソッドを使用してアプリケーションを起動します。XML が 1 行もないことに気付きましたか? web.xml ファイルもありません。この Web アプリケーションは 100% 純粋な Java であり、接続機能やインフラストラクチャの構成に対処する必要はありませんでした。

Spring Boot は、@SpringBootApplication クラスの同じパッケージ(またはサブパッケージ)に含まれている限り、これらのリポジトリを自動的に処理します。登録プロセスをさらに制御するには、@EnableMongoRepositories アノテーションを使用できます。

デフォルトでは、@EnableMongoRepositories は現在のパッケージをスキャンして、Spring Data のリポジトリインターフェースのいずれかを継承するインターフェースを探します。プロジェクトレイアウトに複数のプロジェクトがあり、リポジトリが見つからない場合は、basePackageClasses=MyRepository.class を使用して、Spring Data MongoDB にタイプ別に異なるルートパッケージをスキャンするように安全に指示できます。

Spring Data MongoDB は MongoTemplate を使用して、find* メソッドの背後でクエリを実行します。より複雑なクエリにはテンプレートを自分で使用できますが、このガイドではそれを扱いません。(Spring Data MongoDB リファレンスガイド (英語) を参照)

ここで、Initializr が作成した単純なクラスを変更する必要があります。データを設定し、それを使用して出力を生成する必要があります。次のリストは、完成した AccessingDataMongodbApplication クラス(src/main/java/com/example/accessingdatamongodb/AccessingDataMongodbApplication.java 内)を示しています。

package com.example.accessingdatamongodb;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AccessingDataMongodbApplication implements CommandLineRunner {

  @Autowired
  private CustomerRepository repository;

  public static void main(String[] args) {
    SpringApplication.run(AccessingDataMongodbApplication.class, args);
  }

  @Override
  public void run(String... args) throws Exception {

    repository.deleteAll();

    // save a couple of customers
    repository.save(new Customer("Alice", "Smith"));
    repository.save(new Customer("Bob", "Smith"));

    // fetch all customers
    System.out.println("Customers found with findAll():");
    System.out.println("-------------------------------");
    for (Customer customer : repository.findAll()) {
      System.out.println(customer);
    }
    System.out.println();

    // fetch an individual customer
    System.out.println("Customer found with findByFirstName('Alice'):");
    System.out.println("--------------------------------");
    System.out.println(repository.findByFirstName("Alice"));

    System.out.println("Customers found with findByLastName('Smith'):");
    System.out.println("--------------------------------");
    for (Customer customer : repository.findByLastName("Smith")) {
      System.out.println(customer);
    }

  }

}

AccessingDataMongodbApplication には、CustomerRepository のインスタンスをオートワイヤーする main() メソッドが含まれています。Spring Data MongoDB は動的にプロキシを作成し、そこに注入します。CustomerRepository をいくつかのテストで使用します。最初に、少数の Customer オブジェクトを保存し、save() メソッドのデモと使用するデータのセットアップを行います。次に、findAll() を呼び出して、データベースからすべての Customer オブジェクトをフェッチします。次に、findByFirstName() を呼び出して、彼女の名で単一の Customer をフェッチします。最後に、findByLastName() を呼び出して、姓が Smith であるすべての顧客を検索します。

デフォルトでは、Spring Boot はローカルでホストされている MongoDB のインスタンスへの接続を試みます。他の場所でホストされている MongoDB のインスタンスをアプリケーションにポイントする方法の詳細については、リファレンスドキュメントを参照してください。

実行可能 JAR を構築する

コマンドラインから Gradle または Maven を使用してアプリケーションを実行できます。必要なすべての依存関係、クラス、およびリソースを含む単一の実行可能 JAR ファイルを構築して実行することもできます。実行可能な jar を構築すると、開発ライフサイクル全体、さまざまな環境などで、アプリケーションとしてサービスを簡単に提供、バージョン管理、およびデプロイできます。

Gradle を使用する場合、./gradlew bootRun を使用してアプリケーションを実行できます。または、次のように、./gradlew build を使用して JAR ファイルをビルドしてから、JAR ファイルを実行できます。

java -jar build/libs/gs-accessing-data-mongodb-0.1.0.jar

Maven を使用する場合、./mvnw spring-boot:run を使用してアプリケーションを実行できます。または、次のように、./mvnw clean package で JAR ファイルをビルドしてから、JAR ファイルを実行できます。

java -jar target/gs-accessing-data-mongodb-0.1.0.jar
ここで説明する手順は、実行可能な JAR を作成します。クラシック WAR ファイルを作成することもできます。

AccessingDataMongodbApplication は CommandLineRunner を実装するため、Spring Boot の開始時に run メソッドが自動的に呼び出されます。次のようなものが表示されます(クエリなどの他の出力もあります)。

== Customers found with findAll():
Customer[id=51df1b0a3004cb49c50210f8, firstName='Alice', lastName='Smith']
Customer[id=51df1b0a3004cb49c50210f9, firstName='Bob', lastName='Smith']

== Customer found with findByFirstName('Alice'):
Customer[id=51df1b0a3004cb49c50210f8, firstName='Alice', lastName='Smith']
== Customers found with findByLastName('Smith'):
Customer[id=51df1b0a3004cb49c50210f8, firstName='Alice', lastName='Smith']
Customer[id=51df1b0a3004cb49c50210f9, firstName='Bob', lastName='Smith']

要約

おめでとう! MongoDB サーバーを設定し、Spring Data MongoDB を使用してデータベースにオブジェクトを保存したり、データベースからオブジェクトを取得したりする単純なアプリケーションを作成しました。具体的なリポジトリ実装を作成する必要はありません。

少ない労力でハイパーメディアベースの RESTful フロントエンドで MongoDB リポジトリを公開する場合は、REST で MongoDB データアクセスを参照してください。

関連事項

次のガイドも役立ちます。

新しいガイドを作成したり、既存のガイドに貢献したいですか? 投稿ガイドラインを参照してください (GitHub)

すべてのガイドは、コード用の ASLv2 ライセンス、およびドキュメント用の Attribution、NoDerivatives クリエイティブコモンズライセンス (英語) でリリースされています。