導入
自動構成の「賢い初期値」はありがたいですが、ポート番号を変えたい、DBの接続先を変えたい、といった調整は当然必要になります。これをJavaのコードに直接書き込むのは避けたいところです。
説明
Spring Bootは、src/main/resources/application.properties(または application.yml)というファイルの内容を読み込み、自動構成の初期値を上書きできるようにしています。
# application.properties
server.port=8081
spring.datasource.url=jdbc:postgresql://localhost:5432/shopdb
spring.datasource.username=shop_user
spring.datasource.password=secret
spring.jpa.hibernate.ddl-auto=update
同じ内容をYAML形式で書くこともできます(階層をインデントで表現でき、見通しが良くなります)。
# application.yml
server:
port: 8081
spring:
datasource:
url: jdbc:postgresql://localhost:5432/shopdb
username: shop_user
password: secret
jpa:
hibernate:
ddl-auto: update
環境(開発・本番)ごとに設定を切り替えたい場合は、プロファイル(profile) という仕組みを使います。application-dev.yml や application-prod.yml のようにファイルを分け、起動時にどのプロファイルを使うか指定します。
graph LR Base["application.yml<br/>(共通設定)"] --> Merge["起動時にマージ"] Dev["application-dev.yml<br/>(開発用の上書き)"] --> Merge Merge --> Run["実際に使われる設定"]
コード側で、この設定値をBeanのフィールドに取り込みたいときは @Value を使います。
@Component
class MailSettings {
@Value("${spring.mail.from}")
private String fromAddress; // application.yml の spring.mail.from の値が入る
}
「動作を変えるための値」をJavaのソースコードから切り離し、設定ファイル(や環境変数)に追い出しておく——これにより、コードを1行も変えずに、環境ごとに違う挙動をさせられるようになります。
やってみよう
自分のPCの開発環境と、実際にサービスを提供する本番環境とで、値が変わりそうな設定を3つ挙げてみましょう(ヒント: ポート番号、DBの接続先、ログの詳しさなど)。それぞれ application-dev.yml と application-prod.yml のどちらに書くべきか考えてみてください。