サンプルアプリケーションの概要
サンプルアプリケーションは、前回と同様で、図1に示す簡単な住所録管理アプリケーションです。
このアプリケーションでは、表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があります。
名称 | 利用するスターター | 概要 |
---|---|---|
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のビルドファイルに指定します。
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はサンプルコードで使用している設定です。
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のようにデータソースの実装としてコネクションプール機能があるので、それらの設定も行えます。
最近のORマッパーなどのライブラリを利用していると、プログラマがデータベースの接続を意識せずに利用できるため、コネクションプールの機能についてあまり実感がない方もいると思います。
コネクションプールは実際のデータベース接続を事前に行っておき、プログラム側が使う際にはそれらの接続を使いまわします。これによってデータベース接続にかかる時間やリソースの節約になります。
ただし、実際の運用時にはリソースに応じた設定が必要になり、リスト3のように指定可能です。
spring.datasource.hikari.connectionTimeout = 30000 spring.datasource.hikari.idleTimeout = 600000
また、主に表3の設定が行えます。ここでは省略した設定の詳細はHikariCPのサイトにあるので、こちらもご参照ください。
設定キー | 概要 |
---|---|
connectionTimeout | 接続時のタイムアウト。デフォルトは3万ミリ秒(30秒) |
minimumIdle |
アイドル状態での最低プールサイズ
|
maximumPoolSize | 最大接続数 |
idleTimeout | アイドル状態で生存できる時間。デフォルトは60万ミリ秒(10分) |
maxLifetime | 最大利用時間。デフォルトは180万ミリ秒(30分) |
connectionTestQuery | 接続しているかどうかの確認クエリの設定。ドライバがJDBC4をサポートしている場合には指定はいらない |
データベースの初期化設定
Spring Bootでは、データベースの初期化を起動時に行うことが可能です。リスト4は、初期化を行う際のサンプルコードです。
# (1)初期化を行うかの指定 spring.datasource.initialization-mode=always # (2)初期化を行う際のDDLの実行モード spring.jpa.hibernate.ddl-auto=update
(1)は初期化を行うかの指定です。「always(初期化を行う)」「embedded(組み込みDB時に行う)」「never(行わない)」の指定が可能です。 省略も可能ですが、その場合には、その他の指定に従い自動的に初期化が行われるか、行われないかが決まります。そのため、初期化指定を行っているのに実行されない場合があるので、利用する場合には明示的に指定を行った方が良いでしょう。
(2)では、DDLを実行する際のモードを指定します。指定できるのは表4の通りです。
設定値 | 説明 |
---|---|
none | 何も行わない |
validate | 検証のみ。実際の操作は何も行わない |
update | 必要なEntityに相当するテーブルがない場合のみ作成する |
create | 必要なEntityに相当するテーブルを作成する。既にテーブルが存在する場合にはテーブルが削除された後、新規に作成する |
create-drop | 必要なEntityに相当するテーブルを作成する。セッション終了時にはそれらのテーブルは削除される |
例えば、リスト5は“create”に指定した場合に自動的に流れるSQLのログを示したものです。
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」に指定されている必要があります。
ファイル名 | 説明 |
---|---|
schema.sql | スキーマを作成するためのファイル。クラスパス以下に保存(spring.datasource.schemaの設定でファイル名の変更が可能) |
data.sql | 初期データなどがある場合に、insert分を実行するためのファイル。クラスパス以下に保存(spring.datasource.dataの設定でファイル名の変更が可能) |