Spring Session3系から、Redis接続時にNO_OP設定がデフォルトで不要になった

こんにちは。 エキサイト株式会社の三浦です。

Java / Spring Bootでセッションを扱う場合、Spring Sessionを使うことが多いのではないでしょうか。

その際、データ保存先にAWSなどのクラウド上のRedisを指定した場合には、以前はNO_OP設定というものが必要でした。

それがSpring Session3系からはデフォルト状態では不要になったので、今回はその説明をしていきます。

Spring Sessionとは

Spring Sessionを使うことで、Spring Bootで簡単にセッションを扱えるようになります。

使い方も簡単で、例えば依存管理にGradleを使い、データ保存先をRedisにするのであれば、以下の設定をするだけです。

build.gradle

// 別途、Spring Boot本体は必要です
implementation "org.springframework.session:spring-session-data-redis"

application.yml

spring:
  data:
    redis:
      host: # 接続先のRedisのホスト
      port: # 接続先のRedisのポート

もちろんローカルやオンプレで作成したRedisだけではなく、AWSのElastiCacheなどで作成できるマネージドなRedisも使うことができるのですが、その際注意点があります。

それは、NO_OP設定です。

Spring SessionとNO_OP設定

Spring Sessionには、セッションのデータが削除されたり期限切れになった時などにイベントを発火してくれる機能があります。

docs.spring.io

この機能を使うためには、Redisに対して config というコマンドを使って設定を行う必要があるのですが、例えばAWS上のRedisなどではこの config コマンドは使えないため、そのままだとエラーになってしまいます。

そのため以前は、NO_OP設定というものをSpring Sessionに対して設定し、上記の設定が行われないようにする必要がありました。

@Bean
ConfigureRedisAction configureRedisAction() {
    return ConfigureRedisAction.NO_OP;
}

Spring Session3系とNO_OP設定

しかし実は、それはSpring Session2系のお話です。

3系からは、ガラリと変わりました。

github.com

github.com

Spring Session3系から、イベント発火等を行わない RedisSessionRepository というものがデフォルトで使われるようになりました。

その結果、NO_OP設定はデフォルト設定では不要になりました!

なお、もしイベント発火等が必要な場合は、 RedisIndexedSessionRepository というものを使う必要があります。 こちらを使う場合は、これまでどおりNO_OP設定が必要です。

最後に

シンプルにRedisでセッションを扱うだけなら、イベント発火等は使う必要はありません。

初めて、あるいは久しぶりにSpring Sessionを使う人にとってはちょっとしたハマりポイントだと思うので、一見シンプルなことですが結構ありがたい変更だと思います。

使いやすくなったSpring Sessionを、ぜひ使っていきましょう!