Spring Bootの環境変数の設定方法をやさしく解説!初心者向けapplication.propertiesの使い方
新人
「Spring Bootの開発をしているときに、application.propertiesの設定を環境によって変えたいんですが、どうすればいいんでしょうか?」
先輩
「それは環境変数を使う方法があるよ。Spring Bootでは、環境変数を活用して設定を柔軟に切り替えられるんだ。」
新人
「環境変数ってよく聞くけど、どういうものなんですか?」
先輩
「じゃあまず、環境変数とは何かから説明しようか!」
1. 環境変数とは何か?
プログラミングにおける環境変数とは、パソコンのOSやアプリケーションが外部から受け取る設定値のことです。たとえば、「どのデータベースに接続するか」「ログの出力レベルはどうするか」など、実行環境によって変わる情報を外部から注入するために使われます。
環境変数を使うことで、ソースコードに直接設定を書かずにすみます。そのため、本番環境と開発環境で異なる設定が必要な場合でも、同じコードで動作させることができます。
たとえば、開発環境では「localhost」に接続して、本番環境では「本番用のサーバーアドレス」に接続したい場合などに便利です。
また、パスワードやAPIキーなどの機密情報も環境変数で管理すれば、コード上に書かずにすむためセキュリティの面でも有利です。
2. Spring Bootで環境変数を使う理由と基本の仕組み
Spring Bootでは、設定ファイルとしてapplication.propertiesやapplication.ymlを使ってアプリの挙動を細かく制御できます。ここに書かれる内容は、環境変数によって上書きすることができます。
たとえば、次のようなapplication.propertiesがあるとします。
server.port=8080
spring.datasource.username=root
spring.datasource.password=secret
この設定を、環境ごとに変えたいとき、環境変数で上書きすることが可能です。Spring Bootは、実行時に自動で環境変数を読み込み、設定を差し替えてくれる仕組みを持っています。
たとえば、環境変数SPRING_DATASOURCE_PASSWORDを設定すると、上記のspring.datasource.passwordが自動的にその値で上書きされます。
実際に設定する方法は、使用するOSや開発環境によって少し異なりますが、Windowsの場合はコマンドプロンプトで次のように設定します。
set SPRING_DATASOURCE_PASSWORD=envpassword123
MacやLinuxでは、ターミナルで次のように書きます。
export SPRING_DATASOURCE_PASSWORD=envpassword123
こうすることで、application.propertiesに直接書かなくても、実行時にSpring Bootがこの値を読み取って使用します。
Spring Bootでは「環境変数の優先順位」が定められていて、基本的には以下の順番で値が決定されます:
- 1. コマンドライン引数
- 2. OSの環境変数
- 3.
application.propertiesやapplication.ymlファイル
つまり、application.propertiesに値を書いていても、環境変数で同じキーを指定すれば、そちらが優先されるということです。
これにより、同じSpring Bootアプリケーションでも、環境ごとの違いを柔軟に吸収できるのです。
なお、application.propertiesの中で環境変数の値を参照することも可能です。次のように書きます。
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD}
このように書いておけば、環境変数SPRING_DATASOURCE_PASSWORDが存在するときにその値が使われます。
設定ファイルを使いながら環境変数で一部を上書きできるというのは、Spring Bootが持つ柔軟な設定の仕組みの一部です。
3. application.propertiesやapplication.ymlで環境変数を使う方法
Spring Bootでは、環境変数をapplication.propertiesやapplication.ymlの中で参照して使うことができます。これによって、実行環境に応じて設定値を切り替えることができるため、開発環境・本番環境などで異なる値を安全に管理できます。
環境変数の値をプロパティファイル内で参照するには、次のような構文を使います。
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD}
この${変数名}という形式は「埋め込み構文」と呼ばれており、指定された環境変数が存在すればその値が使われます。
万が一、指定した環境変数が存在しない場合には、起動時にエラーとなることがあります。そこで、デフォルト値(環境変数が定義されていないときに使われる値)を指定することも可能です。以下のように書きます。
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD:defaultpass}
このように:の後ろにデフォルト値を書くことで、環境変数SPRING_DATASOURCE_PASSWORDが見つからない場合でもdefaultpassが代わりに使われます。
これは、環境に応じた安全な構成管理にとても役立ちます。
次に、application.ymlファイルでも同様の方法が使えます。構文はYAML形式に合わせてインデントに注意して書きます。
spring:
datasource:
password: ${SPRING_DATASOURCE_PASSWORD:defaultpass}
application.ymlは見た目がスッキリするため、複数階層の設定を管理するのに便利です。ただし、インデントが間違っていると正しく読み込まれないため注意が必要です。
このように、Spring Bootではapplication.propertiesやapplication.ymlで環境変数を自然に取り込むことができ、「Spring Boot 環境変数 設定方法」をシンプルに実現できます。
4. @Valueを使って環境変数をコントローラで読み込む方法
Spring Bootでは、@Valueアノテーションを使うことで、コントローラやサービスのクラスの中で環境変数やプロパティの値を読み込むことができます。ここでは、@Controllerを使って、HTMLページへ環境変数の値を渡す方法を説明します。
まず、コントローラを作成し、そこに@Valueアノテーションを使って環境変数の値を読み込みます。読み込んだ値は、Modelを通じてHTMLテンプレートに渡します。
次のようなコードになります。
package com.example.demo.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class EnvController {
@Value("${MY_ENV_VAR:デフォルト値}")
private String envValue;
@GetMapping("/env")
public String showEnv(Model model) {
model.addAttribute("env", envValue);
return "env-view";
}
}
この例では、MY_ENV_VARという環境変数を読み込んでいます。もし環境変数が設定されていない場合は、「デフォルト値」が使われます。
@Valueアノテーションは、Springのコンテナが自動的に読み込む仕組みになっているため、簡単に設定値を注入することができます。
続いて、HTML側(Thymeleafテンプレート)でこの値を表示する方法です。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>環境変数の表示</title>
</head>
<body>
<h1>Spring Boot 環境変数の読み込み</h1>
<p>現在の環境変数の値:<span th:text="${env}"></span></p>
</body>
</html>
このように、Spring Bootでは@Controllerと@Valueを使って、環境変数を安全にHTMLに表示できます。
この方法は、「application.yml 環境変数」や「@Valueで環境変数を取得」といったキーワードで検索されることが多く、現場でも非常によく使われる実装パターンです。
環境変数の内容は、ログインユーザー名やシステムモード(本番/テスト)など、環境に応じて変化する情報を柔軟に処理する場面にとても役立ちます。
また、@Valueを使う場合、記述ミスや変数未定義による起動失敗を防ぐためにも、デフォルト値を指定することを強くおすすめします。
Spring Boot 環境変数を使いこなすことで、開発から本番までのスムーズな移行や、セキュアな設定管理が実現できます。
5. 環境変数が使えない・反映されないときの原因と対処法
Spring Bootで環境変数を使っていると、値が反映されない・読み込めないといったトラブルが起きることがあります。こうした状況に遭遇したときにチェックすべきポイントと、その対処法について説明します。
まず多いのが、環境変数の設定が正しくできていないケースです。特にWindowsではsetコマンドで設定した変数が一時的で、別のコマンドプロンプトやIDE(Pleiadesなど)から起動すると、その値が引き継がれない場合があります。
環境変数が反映されない主な原因と対処法は以下の通りです。
- OSで環境変数を設定したが反映されない → IDEの再起動を行う
- キー名が正しくない →
application.propertiesや@Valueのキーを再確認 ${ENV_VAR}形式で指定したが値が空 → 環境変数の実体が設定されているか確認application.ymlのインデントミス → YAMLは空白や階層ミスで無効になる
たとえば、次のようにapplication.ymlに書いた場合、インデントのミスが原因で環境変数が読み込まれないことがあります。
spring:
datasource:
password: ${SPRING_DATASOURCE_PASSWORD}
インデントがスペース2個か4個で統一されているか、全角スペースが混ざっていないかなどを確認してください。
また、Spring Bootのアプリ起動時に環境変数の値がコンソールに表示されないように見えることもありますが、logging.levelの設定によっては省略されることがあります。必要に応じてログレベルを調整しましょう。
6. 環境ごとに設定を切り替える方法(開発用、テスト用など)
Spring Bootでは、application.propertiesやapplication.ymlの他に、application-{profile}.propertiesという形式でプロファイルごとの設定ファイルを作成することで、開発用・テスト用・本番用などの設定を簡単に切り替えることができます。
たとえば、以下のようなファイルを用意して、それぞれの環境に応じた設定を記述します。
- application-dev.properties
- application-test.properties
- application-prod.properties
次に、使用したいプロファイルを指定するために、application.propertiesに次のように記述します。
spring.profiles.active=dev
このように書くと、application-dev.propertiesの設定が有効になります。
application.ymlを使う場合は、プロファイルをネストして複数記述することができます。
spring:
profiles:
active: dev
---
spring:
config:
activate:
on-profile: dev
server:
port: 8081
---
spring:
config:
activate:
on-profile: prod
server:
port: 80
この形式では---(ハイフン3つ)で区切られたブロックごとにプロファイルを定義し、起動時に指定したプロファイル名に応じてそのブロックが適用されます。
プロファイルはコマンドラインからも指定できます。たとえば、Gradleでアプリを起動する場合には次のようにします。
./gradlew bootRun --args='--spring.profiles.active=prod'
このようにして、Spring Boot 環境変数 切り替えの仕組みを活用することで、同じソースコードでも異なる設定で安全かつ柔軟に運用できます。
7. Spring Bootで環境変数を管理する際のベストプラクティス
最後に、Spring Bootで環境変数を使う際に気をつけたいベストプラクティスを紹介します。これらは、プロジェクトの安全性・可読性・保守性を高めるためにとても大切なポイントです。
- 環境変数には機密情報(パスワード・トークンなど)を入れ、ソースコードに直接書かない
@Valueで読み込むときはデフォルト値を指定する- プロファイルを活用して環境ごとの切り替えを明確にする
application.ymlではインデントミスに注意する- プロジェクト内にサンプルの
.env.sampleファイルを用意し、必要な変数を共有する
また、複雑なプロジェクトでは、プロパティの定義を一元管理するために@ConfigurationPropertiesを使う方法もあります。初心者のうちは@Valueで十分ですが、設定項目が多くなると管理が大変になるため、将来的には検討してみましょう。
Spring Bootでは環境変数の優先順位やプロファイルの仕組みが整っており、「環境ごとに設定」や「環境変数 切り替え」などの要件にも簡単に対応できます。
設定ミスやセキュリティリスクを防ぐためにも、適切な命名規則や構成管理のルールをチーム内で決めておくとよいでしょう。
最後に、開発環境(Pleiades+Gradle)で実行する際には、各種環境変数が反映されるよう、プロジェクト設定やVMオプションなどに値を追加するのも有効です。たとえば、Pleiadesの実行構成の「VM引数」に次のように書くと、環境変数の代わりにプロパティを直接指定できます。
-Dspring.datasource.password=manualPassword
このようにして、Spring Boot環境変数の管理をしっかり行うことで、アプリケーションの安全性と柔軟性が大きく向上します。
まとめ
Spring Bootで環境変数を扱う方法は、開発環境・テスト環境・本番環境など、異なる条件でアプリケーションを運用する際に欠かせない知識です。特に、application.properties や application.yml による柔軟な設定管理、環境変数による機密値の制御、@Value を使ったコントローラ側での安全な読み込みなどは、実際の開発現場で繰り返し使われる重要スキルと言えます。今回の記事では、環境変数の基本から、Spring Boot における優先順位の仕組み、プロファイルによる設定切り替え、そして反映されないときの原因の探り方まで、実践的な内容を段階的に確認できました。こうした知識をしっかり押さえておくことで、コードを汚さずに安全で整理された構成管理ができ、将来的な拡張やチーム開発においてもトラブルを未然に防ぎやすくなります。
また、実際のプロジェクトでは、データベースパスワードや外部APIキーなど、外部に流出しては困る値を環境変数として管理するケースがほとんどです。Spring Boot が提供する埋め込み構文 ${ENV_VAR:default値} を使えば、環境変数が未定義の場合でも安全にデフォルト値を用意でき、起動時のエラーを回避しながら柔軟な設定を維持できます。さらに、YAML を使う場合はインデントが重要であり、階層構造が崩れると意図した値が読み込まれないこともあるため、丁寧な記述が求められます。
プロファイル機能を使って application-dev.properties や application-prod.properties を切り替えることで、異なる環境ごとの設定をわかりやすく分離できるのもSpring Bootの魅力です。起動時に spring.profiles.active を指定したり、Gradle の引数でプロファイルを切り替えたりと、実運用に合わせた柔軟な動作が可能です。こうした構成管理は「環境変数 Spring Boot」「application.yml プロファイル」「Spring Boot 設定切り替え」などの観点から見ても非常に重要で、開発者が押さえておくべき基本スキルとなります。
ここで、まとめとして環境変数を読み込む簡単なサンプルコードも掲載しておきます。記事内で紹介したクラス構成と同じようなスタイルで、Spring Boot の基本的な設定方法を再確認できる内容です。
package com.example.demo.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class EnvSampleConfig {
@Value("${APP_SAMPLE_VALUE:サンプル未設定}")
private String sampleValue;
public String getSampleValue() {
return sampleValue;
}
}
そして、この設定値を活用するコントローラ例も次に示します。Spring Boot の基本的な MVC 構造と、環境変数読み込みの実用例がわかるように構成しています。
package com.example.demo.controller;
import com.example.demo.config.EnvSampleConfig;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class SampleViewController {
private final EnvSampleConfig config;
public SampleViewController(EnvSampleConfig config) {
this.config = config;
}
@GetMapping("/sample-env")
public String showSample(Model model) {
model.addAttribute("value", config.getSampleValue());
return "sample-view";
}
}
このように、実際のプロジェクトでも環境変数の読み込みとテンプレートへの表示はよく行う処理です。特に環境変数の優先順位や、properties・ymlでの記述方法を知っておくと、実装時の迷いが減り、安定したアプリ運用につながります。環境ごとの差異を明確に保ちながら、安全で効率的な設定管理を行うことが、Spring Boot 開発における重要な基盤となるでしょう。
生徒「きょう学んだ環境変数の使い方、想像以上に便利ですね。特に application.yml や @Value での読み込み方法がよく理解できました。」
先生「そうだね。Spring Boot は環境ごとに設定を切り替える仕組みが整っているから、用途に合わせて柔軟に運用できるのが魅力なんだよ。」
生徒「環境変数が反映されない原因や、プロファイルの切り替え方も知れて役に立ちました。実際の開発で混乱しないように気を付けます。」
先生「特に環境変数はセキュリティと密接に関わるから、正しい設定方法を知っておくことが大事だよ。今回の内容をしっかり押さえておけば、現場でも安心して扱えるはずだ。」
生徒「次は @ConfigurationProperties も挑戦してみたいです!」
先生「いいね。段階を踏んで理解していけば、もっと複雑な設定管理にも対応できるようになるよ。」