Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

Spring Bootでデータベースにアクセスしよう

Spring Bootで作るマイクロサービス 第5回

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2019/07/01 11:00

 前回、サンプルアプリケーションを通じて、Spring MVC(Webインターフェース)で利用する基本的なアノテーションについて紹介しました。今回も前回利用したサンプルアプリケーションを通じて、Spring Bootでのデータベースを扱う際の設定や基本的操作について紹介します。

目次

サンプルアプリケーションの概要

 サンプルアプリケーションは、前回と同様で、図1に示す簡単な住所録管理アプリケーションです。

図1:サンプルアプリケーションのイメージ
図1:サンプルアプリケーションのイメージ

 このアプリケーションでは、表1のAPIを提供します。

表1:提供するAPI
エンドポイント HTTPメソッド 概要    
/contact/add  POST 新規に連絡先データを登録する
/contact/list  GET 登録してあるデータ一覧を取得する
/contact/item/{id} GET 指定したidの連絡先データ情報を取得する
/contact/item/{id} POST 指定したidの連絡先データ情報を更新する
/contact/item/{id} DELETE 指定したidの連絡先データを削除する

Spring Bootでデータベースを扱う

 Spring Bootでデータベース操作をする場合には、表2に示すSpring JDBCもしくは、Spring DATA JPAがあります。

表2:Springで提供しているデータベース関連のプロジェクト
名称   利用するスターター   概要    
Spring JDBC  org.springframework.boot:spring-boot-starter-jdbc プログラム内にSQLを記述してデータベース操作を行う
Spring Data JPA  org.springframework.boot:spring-boot-starter-data-jpa ORMの仕組みを用いてデータベース操作を行う

 Spring JDBC、もしくはSpring Data JPAのどちらを選ぶかは、プロジェクトでの好みにもよりますが、JPAを使ったプログラムは、複雑なテーブル構造やバイナリデータなども含んだテーブルなどを扱う際や性能問題にぶつかった場合に問題解決が難しく、直接SQLを扱うSpring JDBCではプログラムが煩雑になりやすいといった問題があります。

 データベースを利用する上ではプログラムしやすいことだけではなく、運用も重要になるので、これらのプロジェクトを使わず、既に使い慣れたライブラリを使っても良いでしょう。

 今回のサンプルでは、Spring DATA JPAを用いた簡単な操作について説明します。また、データベースでは組み込みのH2データベースを用いるので、リスト1のようにGradleのビルドファイルに指定します。

[リスト1]Spring Data JPAを利用する場合のGradleビルドスクリプト(build.gradleの抜粋)
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // (1)Spring Data JPAを使う設定
    : (省略)
    runtimeOnly 'com.h2database:h2' // (2)H2データベースを使う設定
}

 (1)では、Spring Data JPAのスターターを指定します。このスターターを指定することで、依存しているHikariCPやHibernate ORMなどの関連するライブラリも含まれます。

 ただし、データベースのドライバに関するライブラリは含まれないため、(2)のように別にH2のライブラリを指定する必要があります。

接続するデータベースへの設定を行う

 Spring Bootではデータベースへの接続設定は設定ファイル(application.properties)を用います。リスト2はサンプルコードで使用している設定です。

[リスト2]データベースへの接続設定(src/main/resources/application.propertiesの抜粋)
spring.datasource.type=com.zaxxer.hikari.HikariDataSource // (1)使用するデータソースのクラス名(省略した場合と同じ設定)
spring.datasource.driver-class-name=org.h2.Driver         // (2)データベースドライバのクラス名
spring.datasource.url=jdbc:h2:mem:contacts                // (3)JDBCでの接続URL
spring.datasource.username=h2user                         // (4)データベースへの接続ユーザ
spring.datasource.password=                               // (5)データベースへの接続パスワード

 (1)では、使用するデータソースクラスを指定します。Spring Boot 2.xではHikariCPがデフォルトで使われますので、指定しない場合と同じ設定になっています。

 ただし、Spring Boot 1.xを使っている場合には、デフォルトで使われるデータソースが変更されているのでバージョンアップをする場合には注意が必要です。

 (2)はデータベースのドライバの設定をします。(3)ではJDBCでの接続URLを設定します。(4)(5)でデータベースへの接続ユーザとパスワードを設定します。

 これらの設定は、サンプルなのでh2のインメモリデータベースを使うようにしていますが、実際は外部のデータベースを使うことが多いと思います。

 また、今回設定している項目はJDBCとしてデータベースに接続するために必要な設定のみですが、実際には、図2のようにデータソースの実装としてコネクションプール機能があるので、それらの設定も行えます。

図2:コネクションプールと接続の関係
図2:コネクションプールと接続の関係

 最近のORマッパーなどのライブラリを利用していると、プログラマがデータベースの接続を意識せずに利用できるため、コネクションプールの機能についてあまり実感がない方もいると思います。

 コネクションプールは実際のデータベース接続を事前に行っておき、プログラム側が使う際にはそれらの接続を使いまわします。これによってデータベース接続にかかる時間やリソースの節約になります。

 ただし、実際の運用時にはリソースに応じた設定が必要になり、リスト3のように指定可能です。

[リスト3]HikariCPに関する設定(src/main/resources/application.propertiesの抜粋)
spring.datasource.hikari.connectionTimeout = 30000
spring.datasource.hikari.idleTimeout = 600000

 また、主に表3の設定が行えます。ここでは省略した設定の詳細はHikariCPのサイトにあるので、こちらもご参照ください。

表3:HikariCPを利用する際に設定できる項目
設定キー 概要    
connectionTimeout 接続時のタイムアウト。デフォルトは3万ミリ秒(30秒)
minimumIdle
アイドル状態での最低プールサイズ
maximumPoolSize 最大接続数
idleTimeout アイドル状態で生存できる時間。デフォルトは60万ミリ秒(10分)
maxLifetime 最大利用時間。デフォルトは180万ミリ秒(30分)
connectionTestQuery  接続しているかどうかの確認クエリの設定。ドライバがJDBC4をサポートしている場合には指定はいらない

データベースの初期化設定

 Spring Bootでは、データベースの初期化を起動時に行うことが可能です。リスト4は、初期化を行う際のサンプルコードです。

[リスト4]データベースの初期化処理指定(src/main/resources/application.propertiesの抜粋)
# (1)初期化を行うかの指定
spring.datasource.initialization-mode=always
# (2)初期化を行う際のDDLの実行モード
spring.jpa.hibernate.ddl-auto=update

 (1)は初期化を行うかの指定です。「always(初期化を行う)」「embedded(組み込みDB時に行う)」「never(行わない)」の指定が可能です。 省略も可能ですが、その場合には、その他の指定に従い自動的に初期化が行われるか、行われないかが決まります。そのため、初期化指定を行っているのに実行されない場合があるので、利用する場合には明示的に指定を行った方が良いでしょう。

 (2)では、DDLを実行する際のモードを指定します。指定できるのは表4の通りです。

表4:Entityに対応するテーブル初期化に対する指定
設定値 説明
none 何も行わない
validate  検証のみ。実際の操作は何も行わない
update 必要なEntityに相当するテーブルがない場合のみ作成する
create 必要なEntityに相当するテーブルを作成する。既にテーブルが存在する場合にはテーブルが削除された後、新規に作成する
create-drop 必要なEntityに相当するテーブルを作成する。セッション終了時にはそれらのテーブルは削除される

 例えば、リスト5は“create”に指定した場合に自動的に流れるSQLのログを示したものです。

[リスト5]"create"を指定した時に実行されるSQL(DDL)
Hibernate: drop table contact if exists
Hibernate: drop sequence if exists hibernate_sequence
Hibernate: create sequence hibernate_sequence start with 1 increment by 1
Hibernate: create table contact (id integer not null, address varchar(255) not null, name varchar(255) not null, tel varchar(255) not null, zip varchar(255) not null, primary key (id))

 実際の運用でnoneやvalidate以外を使う場合には実行されるSQLを細かく指定することは難しく、フィールドの順番や細かいデフォルトの指定などがある場合にはDDLファイルを指定して実行した方が便利なケースもあります。 その場合には、表5のようなルールでファイルをクラスパス以下に置くここで、自動で実行されます。ただし、spring.datasource.initialization-modeの値が「always」に指定されている必要があります。

表5:データベース初期化で実行されるファイル名
ファイル名 説明   
schema.sql  スキーマを作成するためのファイル。クラスパス以下に保存(spring.datasource.schemaの設定でファイル名の変更が可能) 
data.sql  初期データなどがある場合に、insert分を実行するためのファイル。クラスパス以下に保存(spring.datasource.dataの設定でファイル名の変更が可能)

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。個人紹介主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしど...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:Spring Bootで作るマイクロサービス
All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5