Spring Bootでapplication.ymlを使い分ける方法を解説!初心者向けプロファイル設定入門
新人
「Spring Bootでapplication.ymlってよく見かけますけど、これって何ですか?」
先輩
「application.ymlは、Spring Bootアプリの設定ファイルだよ。データベース接続やログレベルなどを定義できるんだ。」
新人
「設定って、ひとつのファイルに全部書くんですか?」
先輩
「実は環境ごとに分けて管理するのが普通だよ。例えばapplication-dev.ymlやapplication-prod.ymlのようにね。」
新人
「なるほど……それってどうやって使い分けるんですか?」
先輩
「よし、今日はapplication.ymlとプロファイル設定について丁寧に解説するよ!」
1. application.ymlとは?役割と仕組みを理解しよう
application.ymlは、Spring Bootの設定を一元管理するためのファイルで、設定の中心的な役割を担います。主に以下のような情報を定義します。
- サーバーポート番号
- データベース接続情報
- ログ出力の設定
- プロファイルの有効化
Spring Bootは起動時にapplication.ymlを自動で読み込み、そこに書かれた設定に従ってアプリケーションを構成します。ファイル名が固定で、src/main/resources配下に配置するのが基本です。
設定例を見てみましょう。
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: pass
profiles:
active: dev
このように、サーバーのポート番号やデータベース情報を明確に定義できます。
2. Spring Bootにおけるプロファイルとは?開発・本番の切り替えを理解しよう
Spring プロファイルは、環境ごとに異なる設定を簡単に切り替えるための仕組みです。例えば、開発環境ではローカルのDB、本番環境ではクラウド上のDBを使いたい場合、プロファイルを使えば設定を分離できます。
Springでは、application-プロファイル名.ymlという形式のファイルを用意しておくことで、指定したプロファイルに応じてそのファイルを読み込んでくれます。
例として、application-dev.ymlを作成し、開発用の設定を書くとこうなります:
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/devdb
username: devuser
password: devpass
本番環境用にapplication-prod.ymlを用意すれば、同様に別の設定を書けます。
server:
port: 80
spring:
datasource:
url: jdbc:mysql://prod-db-host:3306/proddb
username: produser
password: prodpass
そして、どのプロファイルを使うかはapplication.ymlで下記のように指定します:
spring:
profiles:
active: dev
このように設定すると、Spring Bootはapplication.ymlの内容を読みつつ、指定されたプロファイル(この例ではdev)の設定ファイルもマージして読み込みます。
設定ファイルの優先順位は以下のようになっており、プロファイル指定によって環境ごとの設定を柔軟に管理できます。
application-xxx.yml(プロファイル付き)が優先application.yml(共通設定)はすべてのプロファイルで適用
補足:プロファイル設定をGradle+pleiadesで動かすときのポイント
開発環境であるpleiadesでSpring Bootアプリを動かす場合、プロファイルの指定はVMオプションからも可能です。
Eclipse(pleiades)で設定するには、以下の手順で行います。
- プロジェクトを右クリック → 実行構成(Run Configurations)を開く
- 「Spring Boot App」→ 対象の起動設定を選択
- 「VM引数」欄に以下を追加:
-Dspring.profiles.active=dev
この指定により、pleiades環境でも明示的にdevプロファイルのapplication-dev.ymlが読み込まれます。
プロファイルを切り替えて確認すると、異なる設定でアプリが起動していることがわかるでしょう。
3. application-dev.yml / application-prod.ymlの作成方法
application-dev.ymlやapplication-prod.ymlは、Spring Bootのプロファイルごとの設定を管理するための個別のファイルです。これらのファイルはすべてsrc/main/resourcesディレクトリに配置し、共通の設定ファイルであるapplication.ymlとは明確に区別して管理します。
作成手順は非常にシンプルで、まずはリソースフォルダに以下のような名前でファイルを新規作成します。
application-dev.yml(開発環境)application-prod.yml(本番環境)
例えば、開発環境用にローカルのMySQLを使いたい場合は以下のように記述します。
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/devdb
username: devuser
password: devpass
jpa:
hibernate:
ddl-auto: update
show-sql: true
一方、本番環境用には次のように設定します。
server:
port: 80
spring:
datasource:
url: jdbc:mysql://prod-server:3306/proddb
username: produser
password: prodpass
jpa:
hibernate:
ddl-auto: validate
show-sql: false
このように、プロファイルごとに使用するポートやデータベース、SQL出力設定などを完全に分離して記述できるため、環境に応じた安全かつ最適な設定を行うことが可能になります。
4. 起動時にどのプロファイルを使用するか指定する方法
Spring Bootでは、アプリケーションの起動時に「どのプロファイルを使うか」を明示的に指定することで、読み込む設定ファイルを切り替えることができます。この方法は非常に柔軟で、様々なシーンで活用されています。
まず、基本的な指定方法として、application.yml内にspring.profiles.activeを記述する方法があります。
spring:
profiles:
active: dev
これにより、アプリケーションはapplication-dev.ymlを自動で読み込むようになります。
もう一つの方法として、コマンドラインやIDEのVM引数から指定するやり方もあります。特にpleiadesを使っている場合、Run ConfigurationsからVM引数を設定できます。
例:
-Dspring.profiles.active=prod
Gradleで実行する場合は、以下のようにプロファイルを指定することが可能です。
./gradlew bootRun --args='--spring.profiles.active=dev'
このようにコマンドで切り替えることで、CI/CDなど自動化された環境でも柔軟にプロファイルを使い分けることができます。
5. 実践編:開発用と本番用の設定ファイルを切り替える例
ここでは、実際にプロファイルを使って設定ファイルを切り替える流れを確認していきます。まずは共通の設定をapplication.ymlに記述し、各プロファイル特有の設定をapplication-dev.ymlやapplication-prod.ymlに記述します。
共通設定ファイル:
spring:
profiles:
active: dev
logging:
level:
root: INFO
開発用設定ファイル:
server:
port: 8081
spring:
datasource:
url: jdbc:h2:mem:devdb
driver-class-name: org.h2.Driver
username: sa
password:
本番用設定ファイル:
server:
port: 80
spring:
datasource:
url: jdbc:mysql://prod-db:3306/proddb
username: produser
password: prodpass
そして、起動時にVM引数として下記を指定すれば、本番設定が適用されます。
-Dspring.profiles.active=prod
この状態でアプリケーションを起動すると、application.ymlとapplication-prod.ymlが統合され、プロファイルprod用の構成で実行されます。
ポイントは、共通設定はapplication.ymlに書き、環境ごとの差分だけをプロファイルごとのファイルに書くことです。こうすることで、設定の重複を防ぎ、メンテナンス性が高まります。
また、プロジェクト内で@Controllerを使って画面に反映するデータを切り替えることも可能です。例えば、開発環境ではモックデータ、本番環境では実データを使用するように条件分岐できます。
@Controller
public class ProfileController {
@Value("${spring.datasource.url}")
private String dbUrl;
@GetMapping("/")
public String showProfileInfo(Model model) {
model.addAttribute("dbUrl", dbUrl);
return "index";
}
}
これにより、今どの設定ファイルが反映されているかを画面上で確認することも可能になります。
6. プロファイルごとに異なる値を設定する具体例
Spring application.yml 切り替えの活用で最も効果が出るのは、プロファイルごとに設定値を変えたいときです。特にapplication-dev.ymlとapplication-prod.ymlでは、次のような違いを持たせることが一般的です。
- 開発環境では組み込みデータベース(H2など)を使用
- 本番環境では本物の商用データベース(MySQLやPostgreSQL)を使用
- ログ出力のレベルやSQL表示有無を切り替える
以下はそれぞれの設定例です。
application-dev.yml(開発用)
spring:
datasource:
url: jdbc:h2:mem:devdb
driver-class-name: org.h2.Driver
username: sa
password:
jpa:
show-sql: true
properties:
hibernate:
format_sql: true
logging:
level:
root: DEBUG
application-prod.yml(本番用)
spring:
datasource:
url: jdbc:mysql://prod-db:3306/proddb
username: produser
password: prodpass
jpa:
show-sql: false
logging:
level:
root: WARN
このように、プロファイルによってログレベルやデータベース、SQLログの出力可否を分けることができます。プロファイル指定を適切に使うことで、開発時と本番時で安全かつ効率的な挙動に分離できます。
7. 設定ファイルの切り替えでよくある失敗とその対策
application-prod.ymlなどの設定ファイルを作っても、Spring Bootが意図した通りに読み込んでくれないことがあります。これは初心者によくあるつまずきポイントです。ここでは実行環境でよくあるトラブルと、その対策を紹介します。
① プロファイル名の誤記
例えば、application-prd.ymlのようにスペルミスすると、当然読み込まれません。指定したプロファイル名とファイル名は一致している必要があります。
正しくない例:
spring:
profiles:
active: prd
正しい例:
spring:
profiles:
active: prod
② ファイルの配置場所が間違っている
設定ファイルはsrc/main/resourcesの直下に配置する必要があります。サブフォルダに置くと、Spring Bootは認識できません。
③ pleiadesのVM引数が未設定
pleiadesで実行する際に、-Dspring.profiles.active=prodのようなVM引数を設定していないと、Springはapplication.ymlしか読み込みません。
VM引数の設定は、実行構成の中にある「引数」タブに以下のように追加します。
-Dspring.profiles.active=prod
④ Gradleでプロファイル指定が抜けている
Gradleから起動する場合にも、必ず--args='--spring.profiles.active=dev'のような明示的な指定が必要です。指定しないと、期待していたapplication-dev.ymlが無視されることになります。
./gradlew bootRun --args='--spring.profiles.active=dev'
8. 複数人で開発する場合のプロファイル運用ベストプラクティス
チームで開発する場合、各開発者がそれぞれ異なる設定で作業することがよくあります。例えば、ローカルデータベースのURLやログレベルなどが人によって異なる場合、設定の管理方法が重要になります。
推奨される方法は、以下の3ステップです。
application.ymlに共通設定だけを書く- 各開発者のプロファイルファイル(例:
application-taro.yml)を作る - VM引数や環境変数で各自のプロファイルを指定する
例えば、開発者の田中さんがローカルMySQLを使いたい場合、次のようなファイルを作成します。
# application-taro.yml
server:
port: 8090
spring:
datasource:
url: jdbc:mysql://localhost:3306/taro_db
username: taro
password: taropass
そして、田中さんの環境では起動時にこのように指定します。
-Dspring.profiles.active=taro
これにより、他の開発者の環境に影響を与えることなく、自分専用の設定で開発できます。
また、application-xxx.ymlはGitにコミットせず、個人の環境専用にしておくと、機密情報や環境差異を安全に管理できます。Git管理から除外するには.gitignoreに追記します。
# .gitignore に追加
src/main/resources/application-taro.yml
このような運用にすることで、Springのプロファイル設定を活用しながらチーム開発をスムーズに進めることができます。設定の衝突や誤動作を未然に防ぐことができるのです。