初歩から学ぶSpring Session using Db2 第0回:環境セットアップ

# 0. はじめに  

Spring Sessionお試し用Webアプリは[こちら]( http://github.com/kyosuke-yamagata/spring-session-with-db2-demo/tree/master )で公開しています。

本記事で解説している手順を実施した後に、
Webアプリを起動させて
ブラウザから、/sessionDemoにアクセスすると
Db2上のテーブルにSession情報が永続化されます。

# 1. 導入 〜 Spring Sessionの魅力 〜 

「使った分だけ課金」ポリシーのクラウドサービスが多い昨今は
「立ち上がりっぱなし」転じて
「On-Memoryに状態を保持しっぱなし」Webアプリだと肩身が狭い。

 - 持て余しているリソース（CPU、Memory etc...）は、欲しい人に譲りたい。
 - 処理要求が無いのなら、休眠していて欲しい。

とはいえ、ステートフルにデータを扱いたい場合もあるので
休眠させるにしても、アレコレ検討が必要。
例えば、ログイン完了した後に、データ色々と持ち回りたいケース等。

つまり、クラウドNativeなWebアプリに望まれる要件は以下。

 - 処理が無いなら、休眠していて欲しい。
 - 休眠の前は、何処ぞにSessionデータ残したい。
 - 休眠が明けたら、以前のようにSessionデータ扱いたい。

---

_労せずして、なんとか出来ませんかねぇ？_

---

この種の悩みに答えてくれる機能が
Spring Frameworkの世界では、あらかじめ用意されている様子。  
  
その名も、Spring Sessionと言うらしい。ちょっと学んでみました。  

第0回目は、環境セットアップ方法の纏めです。


# 2.  Dockerインストール

[Docker公式HP]( https://www.docker.com/ ) からダウンロードできます。
お使いのOSに合わせて導入ください。

# 3.  Db2 Express-C Dockerイメージpull & 起動
Spring Sessionで、Sessionを永続化する先の環境セットアップです。

今回は、RDBMS製品として
IBM社のDb2 Express-Cを使います。

以下コマンドで、Dockerイメージをダウンロードしつつ
ポート番号・パスワード・DB名など指定して起動させます。

```text:Db2コンテナ起動
$ docker run -itd --name mydb2 --privileged=true -p 50000:50000 -e LICENSE=accept -e DB2INST1_PASSWORD=p@ssw0rd -e DBNAME=testdb -v [Dockerホスト側path]/database:/database ibmcom/db2
```

ついでに、Db2表領域をコンテナから外出しする用途で
Dockerホスト側のdirをマウントさせています。
コマンド内「Dockerホスト側path」を適宜、書き換えください。

その他、docker runオプション仔細は、[公式マニュアル](https://hub.docker.com/r/ibmcom/db2)ご参照。

# 4.  Db2稼働確認 & ログイン
正しく立ち上がっていれば
STATUS:Upになります。

```text:Db2コンテナ確認
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                          NAMES
cb23f39d4164        ibmcom/db2          "/var/db2_setup/lib/…"   45 hours ago        Up 47 seconds       22/tcp, 55000/tcp, 60006-60007/tcp, 0.0.0.0:50000->50000/tcp   mydb2
$ 
```

テーブルは何も無いことを確認。

```text:テーブル確認
$ docker exec -it mydb2 bash
[root@cb23f39d4164 /]# su - db2inst1
[db2inst1@cb23f39d4164 ~]$ db2 connect to testdb user db2inst1

db2 => list tables

Table/View                      Schema          Type  Creation time
------------------------------- --------------- ----- --------------------------

  0 record(s) selected.

db2 => quit

[db2inst1@cb23f39d4164 ~]$
```

# 5. Spring Session データ永続先テーブル作成

[Spring Session 公式](https://github.com/spring-projects/spring-session/tree/master/spring-session-jdbc/src/main/resources/org/springframework/session/jdbc)でSQLファイル配布してるので、ダウンロードして実行します。

以下、作業例のとおり
docker runで指定した、ホスト側dirに配置しておくと楽です。

```text:SQL実行
[db2inst1@cb23f39d4164 ~]$ db2 -tvf /database/sql/schema-db2.sql
CREATE TABLE SPRING_SESSION ( PRIMARY_ID CHAR(36) NOT NULL, SESSION_ID CHAR(36) NOT NULL, CREATION_TIME BIGINT NOT NULL, LAST_ACCESS_TIME BIGINT NOT NULL, MAX_INACTIVE_INTERVAL INT NOT NULL, EXPIRY_TIME BIGINT NOT NULL, PRINCIPAL_NAME VARCHAR(100), CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID) )
DB20000I  The SQL command completed successfully.

CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID)
DB20000I  The SQL command completed successfully.

CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME)
DB20000I  The SQL command completed successfully.

CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME)
DB20000I  The SQL command completed successfully.

CREATE TABLE SPRING_SESSION_ATTRIBUTES ( SESSION_PRIMARY_ID CHAR(36) NOT NULL, ATTRIBUTE_NAME VARCHAR(200) NOT NULL, ATTRIBUTE_BYTES BLOB NOT NULL, CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME), CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE )
DB20000I  The SQL command completed successfully.

[db2inst1@cb23f39d4164 ~]$
```

# 6. Spring InitializrでProject定義 & IDEでImport
Spring Initializrは[こちら](https://start.spring.io/)、ですが...
お試しWebアプリ用のProjectに [ pom.xml ](https://github.com/kyosuke-yamagata/spring-session-with-db2-demo/blob/master/demo/pom.xml)を付けたので割愛。


pom.xmlの、主要な箇所は以下です。

```text:pom.xml抜粋
#Spring Session本体
spring-session-core
spring-session-jdbc

#お試しWebアプリ用
spring-boot-starter-web

#db2接続の前提
jcc
HikariCP
```

だいぶ長くなりましたが、環境まわりセットアップは以上です。

# 7. Spring Session基本設定

まず[application.properties](https://github.com/kyosuke-yamagata/spring-session-with-db2-demo/blob/master/demo/src/main/resources/application.properties)に適宜、定義します。

主要バラメータのみ抜粋。
仔細は[application.properties](https://github.com/kyosuke-yamagata/spring-session-with-db2-demo/blob/master/demo/src/main/resources/application.properties)の各Commentご参照。

```text:application.properties
spring.session.store-type=jdbc

spring.session.jdbc.flush-mode=immediate
spring.session.jdbc.initialize-schema=never

server.servlet.session.timeout=30s

spring.session.jdbc.table-name=SPRING_SESSION
spring.session.jdbc.save-mode=always

spring.datasource.*
```

続いて、@EnableJdbcHttpSessionを使ってConfigクラスを用意。

```java:HttpSessionConfig.java
@EnableJdbcHttpSession
public class HttpSessionConfig {

	@Bean
	public PlatformTransactionManager transactionManager(DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource); 
	}
	
}
```

通常のSpring Webアプリと異なる箇所は、以上です。

# 8.終わりに
第0回は、環境セットアップ周りを中心に解説させて頂きました。

次回は、[お試し用Webアプリ]( http://github.com/kyosuke-yamagata/spring-session-with-db2-demo/tree/master )の挙動を交えつつ、Spring Sessionを紹介する予定。
乞うご期待です。