Spring Bootでアクティブなプロファイルによってプロパティファイルを読み替える方法

こんにちは、さるまりんです。

Spring Bootで開発していると、状況に応じて異なるプロパティを使い分けたい場合があります。
例えば、テスト時には異なるデータベースに接続したい場合や、APIのスタブを提供する環境では本来の処理をスキップしたクラスをロードしたい場合などが考えられます。

Spring Bootのjarファイルを実行する際に、次のようにどのプロファイルを有効にするかを指定できます。

java -jar -Dspring.profiles.active=production someapp.jar

または

java -jar -Dspring.profiles.active=dummy someapp.jar

この方法を利用して、プロパティファイルを読み替えてみましょう。

以下は、二つのクラスの冒頭部分です。

SomeConfig.java

@Profile("!dummy")
@Configuration
@PropertySource("classpath:some.properties")
public class SomeConfig {
    // クラスの内容
}

DummySomeConfig.java

@Profile("dummy")
@Configuration
@PropertySource("classpath:somedummy.properties")
public class DummySomeConfig {
    // クラスの内容
}

これらのクラスでは、@Configurationアノテーションと @PropertySourceアノテーションを使ってプロパティファイルを読み込むクラスを作成しています。
さらに、@Profileアノテーションを用いて、特定のプロファイルが有効なときにそのクラスを使用するかどうかを指定しています。

SomeConfigクラスは@Profile("!dummy")が、DummySomeConfigクラスは@Profile("dummy")がそれぞれ指定されています。
つまり、DummySomeConfigdummyプロファイルが有効なときに使用され、SomeConfigはその反対で、dummyプロファイルが有効でないときに使用されます。

これにより、同じ名前のプロパティであっても、異なる値を使い分けることができます。

たとえば、APIスタブを作成する際に、スタブを提供する環境ではダミーのサービスクラスで固定値のレスポンスを作成し、それ以外の環境では実処理を含むサービスクラスでレスポンスを作成するためにこの機能を利用しました。

もっと適切で簡単な方法があるかもしれませんが、今回はこの方法で解決しました。

Spring Bootにはさまざまな機能があるので、便利に使いつつも、事故がないように注意したいですね。

読んでくださってありがとうございました。
それではまた!