目的
環境依存値をアプリケーション内に埋め込むのではなく外部化しましょうという話はもはや常識になっていますが、特にSpringBootの場合は様々な方法があります。公式ガイドでも1章まるまるその話題に費やしています。
環境ごとにプロパティファイルを分けるとか、いや、せっかくSpringBootなんだからConfigurationサーバを使うべきだとかいろいろ流儀はあると思いますが、今回はThe Twelve-Factor Appに従って環境変数を考えてみます。
アプリケーション内で環境変数を参照するためには@Value
アノテーションを使う方法がありますが、JPAのようにapplication.propertiesに設定をゴリゴリ書く場合はその方法は使えません。そこで、application.properties内で環境変数を使う方法がありました。
方法
${環境変数:デフォルト値}
の形式で記述します。
hoge.fuga = ${FOO:bar}
いや、当たり前でしょとは言わないでください。意外にこれ、ガイドにきちんと書いてなかったりします(書いてあったらごめんなさい)。
個人的には、環境によってビルドパラメータを変えるとか、あるプロパティはソースコード内で取得して、別の値はフレームワークにまかせて、というのは健全ではないと思っているので、設定を集約できるのはいいことだと思っています。
また、デフォルト値を入れられるのもいいです。例えばDB接続でUT時はデフォルトでlocalhost、IT以降は基盤が提供する環境変数が示すホストにつなぐということが、プロパティファイルを切り替えずにできるわけです。
はやりのKubernetes(k8s)でも便利です。k8sではServiceのホスト名とポート名が同じネームスペース内であれば環境変数で参照できますので、マイクロサービスのディスカバリーとしても使えます。
以上です。