Works by

Ren's blog

@rennnosuke_rk 技術ブログです

【Spring】環境変数で適用するapplication.propertiesを切り替える

f:id:rennnosukesann:20181220183020p:plain

複数の application.properties の切り替え

Springフレームワークでは、アプリケーション内で使う設定を application.properties に書き込み、実行時に設定内容を反映させることができます。

application.properties
// DB接続先
spring.datasource.url=https://hoge.fuga...
spring.datasource.driver-class-name=db-hoge...
spring.datasource.username=hogeDB
spring.datasource.password=hogehoge

// Spring Batch のアプリ起動時の設定
spring.batch.job.enabled=false

...

application.properties には実行環境ごとに変化しやすいアプリ内で使用できる変数を記述しておくことで、アプリケーションの実装に変更を加えずにDBの接続先やロガーのデバッグレベルの設定などを変更することができます。

このような設定情報のプリセットを開発/UAT/本番など複数の環境用に用意して、各環境ごとに切り替えたいという場合がよくあります。

Springでは、適用したい application.propertiesapplication-dev.properties のように環境別に用意し、application.properties に以下のように記述することで application-dev.properties の設定をアプリに適用させることができます。

application.properties
spring.profiles.active = dev

application-dev.propertiesdev の部分には任意の名称を入れることができます。例えば、 application-hoge.properties ファイルの設定を適用したければ、application.properties に以下を追加します。

spring.profiles.active = hoge

これで application.properties の切り替えが行えるようになりました!

application.properties ファイルの切り替えを環境変数を用いて行う

ただ、デプロイごとにspring.profiles.active の値を変えるのは面倒です。また、application.properties をバージョン管理してる場合にいちいち変更差分が出て面倒です。

そこで、環境変数application.properties の切り替えを委譲します。 環境変数であれば、Dockerの Dockerfile やCloudFoundlyの manifest.yml など、個別のデプロイ環境用Configファイルに使用すべき application.properties を記述できるようになります。

環境変数 SPRING_PROFILE_ACTIVE があるとき、 application.properties 内では以下のように参照することができます。

application.properties
spring.profiles.active = ${SPRING_PROFILE_ACTIVE:local}

: の右隣の local はデフォルト値です。 SPRING_PROFILE_ACTIVE が設定されていない場合に、 local の文字列を spring.profiles.active に格納します。

これで環境変数経由で application.properties を切り替えられるようになりました。