endokのブログ

IT・プログラミングネタ

Spring Boot触ってみる その5 ープロファイルを利用した環境ごと設定の切り替えー

Spring Boot触ってみる その4 ーSQLServerへの接続ー - endokのブログ
の続き。

DB接続設定など、実行する環境に応じて切り替えたいパラメータがある。
Springでは"Profile"という仕組みで切り替えることができる。

その1(http://endok.hatenablog.com/entry/2016/06/04/124011)で作成したサンプルプロジェクトを引き続き利用する。

Profileの指定

jarファイルを実行する際の引数に、--spring.profiles.active=[プロファイル名]を指定する。

>java -jar SampleWebProject-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

STSを使ってSpring Boot Appとして実行する場合、[Run]→[Run Configurations..]のProfileという設定欄で切り替えることもできる。

または、application.propertiesで下記を指定する。

spring.profiles.active=[プロファイル名]

application.propertiesと実行時引数どちらも指定した場合、実行時引数の方が優先される。

application.propertiesの切り替え

application-[プロファイル名].propertiesという名前のファイルを用意しておくと、application.propertiesに加えて読み込まれる。
YAML形式を利用している場合はまた別の方法もあるようだが、今回は利用する予定がないため省略。

・application.properties

spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=testdb
spring.datasource.username=sa
spring.datasource.password=sqladmin
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver

・application-prod.properties

spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=proddb
spring.datasource.username=sa
spring.datasource.password=sqladmin
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver

というファイルを用意しておく。
プロファイルを何も指定しない場合、application-prodの方は読み込まれず、application.propertiesだけ読み込まれる。
そのため、接続先のデータベース名は"testdb"となる。
プロファイルに"prod"を指定した場合、application-prodも読み込まれ設定が上書きされるため、接続先のデータベース名は"proddb"となる。

設定クラスの切り替え

Spring Bootでは@Configurationアノテーションを使ってJavaコードとしてBean設定を行う。
その設定クラスも@Proflieアノテーションを使い、プロファイルを指定した切り替えを行うことができる。

コード

Beanとして生成するクラスとして下記SampleBeanクラスを用意する。

・SampleBean.java

public class SampleBean {

	private String profileName;

	public SampleBean(String profileName) {
		this.profileName = profileName;
	}

	public String getProfileName() {
		return profileName;
	}

}

設定クラスは

  • プロファイル指定なし
  • "local"プロファイル指定
  • "prod"プロファイル指定

の3種類を用意する。
それぞれ、SampleBeanのフィールドに別の文字列を設定するようにしておく。

・AppConfig.java(プロファイル指定なし)

@Configuration
public class AppConfig {
	
	@Bean
	SampleBean sampleBean(){
		return new SampleBean("デフォルト");
	}

}

・LocalAppConfig.java("local"プロファイル指定)

@Configuration
@Profile("local")
public class LocalAppConfig {
	
	@Bean
	SampleBean sampleBean(){
		return new SampleBean("ローカル");
	}

}

・ProductionAppConfig.java("prod"プロファイル指定)

@Configuration
@Profile("prod")
public class ProductionAppConfig {
	
	@Bean
	SampleBean sampleBean(){
		return new SampleBean("プロダクション");
	}

}

コントローラーでSampleBeanをinjectionして確認する。

・HelloController.java

	@Autowired
	SampleBean sampleBean;

	@RequestMapping(value = "/hello")
	public String index(Model model) {
				
		model.addAttribute("bean", this.sampleBean);
		
		return "hello";
	}

・hello.html

	<div>プロファイル名:<th:block th:text="${bean.profileName}"></th:block></div>

動作確認

プロファイル指定を切り替えてアクセスすると、それぞれ下記のような動作となる。

プロファイル指定なしでアクセスした場合→"デフォルト"と表示される
プロファイル指定"local"でアクセスした場合→"ローカル"と表示される
プロファイル指定"prod"でアクセスした場合→"プロダクション"と表示される

まとめ

こういった環境の切り替えは自前で用意するとなると結構面倒なものなので、標準で用意されているのはありがたい。
@ConfigurationPropertiesなど設定周りの仕組みは色々用意されているようで全体感を把握するにはまだまだかかりそう・・・。