ことりんと一緒 Springもね - 8. リポジトリ層 - 補足:H2 Database

## 概要 / 説明
[ことりんと一緒 Springもね - 8. リポジトリ層](https://qiita.com/shinyay/items/37eaf852dce713d0b06b) では、リポジトリ層を設けて、データの永続化処理を抽象化して外部の永続化領域への操作を透過的に実施できるようにしました。

今回のケースでは、外部の永続化領域はインメモリでアプリケーションに組み込みで動作する [H2 Database Engine](http://www.h2database.com/html/main.html) を利用していました。

この H2 Database Engine には、データベース情報を確認するためのコンソールアプリケーションが組み込まれています。そちらを利用してデータベースの状態確認を行ってみます。

## 前提 / 環境
### ランタイムバージョン
- Kotlin : 1.3.21
- SpringBoot : 2.1.1.RELEASE

### Spring Dependencies
- Web
- JDBC
- JPA
- H2
- Actuator

### 開発環境
- OS : Mac
- IDE : IntelliJ IDEA
- Build : Gradle

## 手順 / 解説

### application.yml の設定
SpringBoot の application.yml に以下のようにH2データベースが使用できるように構成情報を定義します。

#### データソース
Springアプリケーションからデータベースに接続するためのデータソース定義を以下のように実施します。

```yaml
spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:app;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=TRUE
    username: guest
    password: guest
```

|構成要素|内容|
|-------|---|
|driver-class-name|H2DBのドライバーライブラリ<br>`org.h2.Driver`|
|url|データベース接続URL(※フォーマットについて後述)<br>`jdbc:h2:mem:app;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=TRUE`|
|username|データベース接続ユーザ名|
|password|データベース接続パスワード|

##### H2データベース接続URLフォーマット
H2データベースは、インメモリで動作するアプリケーション組み込み型の使用や、リモートサーバとして稼働するサーバモード、またファイルシステムにデータを書き出す動作など様々な動作モードがとれます。それぞれの動作モードに合わせた接続URLフォーマットとなります。

|動作モード|URLフォーマット|サンプル|
|--------|-------------|-------|
|組み込みモード：インメモリ(プライベート)|`jdbc:h2:mem:`|jdbc:h2:mem:|
|組み込みモード：インメモリ(Named)|`jdbc:h2:mem:<DB名>`|jdbc:h2:mem:app|
|組み込みモード：ローカルファイル|`jdbc:h2:[file:][<ファイルパス>]<DB名>`|jdbc:h2:file:/data/sample|
|インメモリDBのドロップ防止|DB_CLOSE_DELAY=-1|jdbc:h2:mem:app;DB_CLOSE_DELAY=-1|
|サーバモード：TCP接続|jdbc:h2:tcp://<サーバアドレス>[:<ポート>]/[<ファイルパス>]<DB名>|jdbc:h2:tcp://localhost:8084/data/sample|
|サーバモード：TLS接続|jdbc:h2:ssl://<サーバアドレス>[:<ポート>]/[<ファイルパス>]<DB名>|jdbc:h2:ssl://localhost/mem:test|
|VM終了時のDB接続切断|DB_CLOSE_ON_EXIT=TRUE|jdbc:h2:mem:app;DB_CLOSE_ON_EXIT=TRUE|


#### H2データベース
H2 データベースのコンソール画面を表示させるには以下の設定を行います。

```yaml
spring:
  h2:
    console:
      enabled: true
```

### H2 データベースのコンソール画面の表示
アプリケーションを起動した後、H2 データベースコンソール画面にアクセスしてみます。

```bash
$ ./gradlew bootRun

> Task :bootRun

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)
:
:
:
2019-02-26 16:05:13.358  INFO 7073 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 15 endpoint(s) beneath base path '/admin'
2019-02-26 16:05:13.457  INFO 7073 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-02-26 16:05:13.460  INFO 7073 --- [           main] i.p.s.simple.SimpleApplicationKt         : Started SimpleApplicationKt in 5.577 seconds (JVM running for 5.998)
<==========---> 83% EXECUTING [2m 46s]
> :bootRun
```

- `http://localhost:[設定したポート番号]/h2-console` へアクセスし、H2 データベースの接続ユーザ/パスワードを入力して接続を行います。


<img width="475" alt="h2-console-login.png" src="https://qiita-image-store.s3.amazonaws.com/0/127983/be8851f3-04e7-00ef-d835-0f5c9f9a7c3d.png">

<img width="904" alt="H2-console.png" src="https://qiita-image-store.s3.amazonaws.com/0/127983/a765ee41-9384-2cb5-f43b-57734f66f218.png">

## まとめ / 振り返り
SpringBoot と組み合わせて手軽に利用できるH2データベースを操作してみました。
データベースの機能自体に依存しないアプリケーション開発の場面では、インストール作業が不要で、簡単に使えるH2データベースは利用できる場面がいろいろとあるのではないでしょうか。

### 今回のソース
- [shinyay/spring-just-rest-kotlin/tree/first-repository-layer](https://github.com/shinyay/spring-just-rest-kotlin/tree/first-repository-layer)