Springのプロファイル切り替え方法を解説!初心者向けapplication.ymlの使い方
新人
「Springのプロファイルって何ですか?devとかtestとか聞いたことはあるんですけど…」
先輩
「プロファイルは、開発・テスト・本番など環境ごとに設定を切り替えるための仕組みだよ。Springではdev、test、prodといった名前で使い分けるのが一般的だね。」
新人
「環境ごとの切り替えって、具体的にどこでどうやるんですか?」
先輩
「それを設定するのがapplication.ymlファイルなんだ。詳しく説明していくよ。」
1. Springのプロファイルとは?
Spring Frameworkでは、プロファイル(Profile)という仕組みを使って、アプリケーションの設定を実行環境に応じて切り替えることができます。たとえば、開発環境(dev)ではログを詳細に出力し、本番環境(prod)ではログを抑えるなど、環境に合わせた設定が可能です。
プロファイルは以下のようなケースで使われます:
- 開発・テスト・本番環境ごとにDB接続設定を変更したい
- 特定のクラスやBeanを環境によって読み込ませたい
- 実行環境に応じた外部APIエンドポイントの切り替え
このように、環境ごとに柔軟な設定を実現するのがSpringのプロファイルの目的です。
2. application.ymlでのプロファイル設定
Spring Bootでは設定ファイルとしてapplication.ymlを使うのが一般的です。このapplication.ymlにプロファイルごとの設定を記述することで、実行時に自動で切り替わります。
基本の構成は以下のようになります。
spring:
profiles:
active: dev
---
spring:
config:
activate:
on-profile: dev
server:
port: 8081
---
spring:
config:
activate:
on-profile: test
server:
port: 8082
---
spring:
config:
activate:
on-profile: prod
server:
port: 8080
ポイントは3つあります:
spring.profiles.activeで現在の有効プロファイルを指定する---でYAMLのセクションを分けるspring.config.activate.on-profileで対象のプロファイルを定義する
上記のように設定しておくことで、例えばdevを指定すれば、開発用の設定だけが読み込まれるようになります。
プロファイルを使ったBeanの条件読み込み
プロファイルは@Profileアノテーションを使って、特定のBeanクラスを環境ごとに読み込むように制御することもできます。
@Configuration
@Profile("dev")
public class DevConfig {
@Bean
public DataSource dataSource() {
// 開発用データソース
return new HikariDataSource();
}
}
このようにして、開発環境用のデータソース設定だけをdevプロファイルが有効なときに読み込ませることができます。
PleiadesとGradleでのプロファイル切り替え
今回の開発環境はPleiadesでGradleプロジェクトを使用します。VMオプションにプロファイルを設定することで、実行時に使用するプロファイルを切り替えることができます。
Pleiadesで起動設定を開いて、VMオプションに以下を追加してください。
-Dspring.profiles.active=dev
これで、application.ymlの中からdevセクションの設定が有効になります。testやprodに切り替える場合は、値を変更するだけです。
プロファイルでログレベルやAPI設定を切り替える
ログ出力レベルや外部APIのURLなどもプロファイルごとに切り替えて管理できます。
---
spring:
config:
activate:
on-profile: dev
logging:
level:
root: DEBUG
api:
endpoint: https://dev-api.example.com
---
spring:
config:
activate:
on-profile: prod
logging:
level:
root: ERROR
api:
endpoint: https://api.example.com
このようにして、dev環境では詳細ログを出して、開発用APIに接続。本番環境ではエラーログのみ出力して、本番用APIを使う、という構成が実現できます。
3. application.ymlでプロファイルごとの設定を分ける方法
Spring Bootでは、application.ymlファイルを使って複数のプロファイル用の設定をひとつのファイル内で記述することができます。この方法により、ファイルを分割せずに設定をまとめて管理できるため、初心者にとっても扱いやすい方法です。
セクションを分けるには、---を使います。それぞれのセクションにspring.config.activate.on-profileを設定することで、対象のプロファイルが有効になったときだけそのセクションが反映されます。
spring:
profiles:
active: dev
---
spring:
config:
activate:
on-profile: dev
app:
message: "開発環境です"
---
spring:
config:
activate:
on-profile: test
app:
message: "テスト環境です"
---
spring:
config:
activate:
on-profile: prod
app:
message: "本番環境です"
このように設定すると、実行時にspring.profiles.activeで指定されたプロファイルに応じて、読み込まれる設定が自動で切り替わります。
4. プロファイルごとにDB接続やログ設定を分ける具体例
環境ごとに接続先のデータベースを切り替えることは、実際の開発において非常に重要です。開発用・テスト用・本番用のそれぞれのデータベースに対して、適切な接続設定をプロファイルで管理しましょう。
---
spring:
config:
activate:
on-profile: dev
spring:
datasource:
url: jdbc:mysql://localhost:3306/dev_db
username: dev_user
password: dev_pass
logging:
level:
root: DEBUG
---
spring:
config:
activate:
on-profile: test
spring:
datasource:
url: jdbc:mysql://localhost:3306/test_db
username: test_user
password: test_pass
logging:
level:
root: INFO
---
spring:
config:
activate:
on-profile: prod
spring:
datasource:
url: jdbc:mysql://db-server:3306/prod_db
username: prod_user
password: prod_pass
logging:
level:
root: ERROR
このようにしておくことで、環境ごとに異なるデータベースやログレベルが自動で適用されます。本番環境ではエラーのみをログに残し、開発環境では詳細なデバッグログを表示させる設定になっており、実運用にも即した構成です。
5. 実行時に使用するプロファイルを指定する方法
Spring Bootでは、どのプロファイルを有効にするかを実行時に指定することができます。Pleiadesを使っている場合は、実行構成のVMオプションにプロファイルの指定を追加しましょう。
具体的には、以下のようにオプションを指定します。
-Dspring.profiles.active=dev
この設定を追加する場所は、Pleiadesのメニューから以下のようにたどってください:
- プロジェクトを右クリック
- 「実行」→「実行構成」
- 「引数」タブの「VM引数」欄に上記を入力
この方法により、Gradleプロジェクトでapplication.yml内のdev設定のみが有効になります。
開発環境ではdev、テスト環境ではtest、本番ではprodと切り替えることで、それぞれの設定が自動で適用されるようになります。
また、コマンドラインからアプリケーションを実行する場合も、同様にプロファイルを指定することができます。
java -jar myapp.jar --spring.profiles.active=prod
このようにプロファイルの切り替えを適切に活用することで、開発から本番までの運用がより安全でスムーズになります。
application.ymlを分割して管理する方法
場合によっては、application.ymlファイルを1つにまとめず、プロファイルごとに別ファイルに分けたいこともあります。Spring Bootではこの方法もサポートされています。
例えば以下のようなファイルを用意することで、プロファイルごとの設定を完全に分離できます:
application-dev.ymlapplication-test.ymlapplication-prod.yml
この場合、メインのapplication.ymlには以下のように指定します。
spring:
profiles:
active: dev
すると、Spring Bootは自動でapplication-dev.ymlの内容を読み込んでくれます。ファイルを分けることで、設定の見通しが良くなり、管理しやすくなるという利点があります。
プロファイルと@Valueの組み合わせでプロパティを使う
プロファイルで分けた設定は、Springの@Valueアノテーションを使って読み込むことができます。たとえば以下のようにします。
@Controller
public class SampleController {
@Value("${app.message}")
private String message;
@GetMapping("/")
public String index(Model model) {
model.addAttribute("message", message);
return "index";
}
}
この場合、application.yml内でプロファイルごとに定義されたapp.messageが、現在のプロファイルに応じて自動で読み込まれます。これにより、コントローラ側のコードを変更せずに環境ごとの動作を切り替えることができます。
6. プロファイルを使うメリットとは?
Springのプロファイル機能を活用することで、開発から本番運用までの設定管理がとても効率的になります。特に複数人で開発するプロジェクトや、本番環境が厳しく制限されている業務システムでは、環境ごとの設定の切り替えが重要です。
プロファイルを使うメリットは次のとおりです。
- 設定ファイルの明確な分離:環境別に設定内容を明確に切り分けることができ、管理しやすくなります。
- 事故の防止:開発用の設定やテスト用の設定が本番環境に適用されてしまうミスを防げます。
- 自動切り替えが可能:起動時の指定だけで、対応する設定が自動で反映されるため、毎回変更する必要がありません。
- 柔軟な構成管理:ログ設定やAPIのエンドポイント、セキュリティの挙動なども簡単に切り替え可能です。
こうしたメリットにより、プロファイルを活用することで、運用ミスの防止や保守性の向上につながります。
7. プロファイルごとにコントローラやサービスを切り替える方法
プロファイルは設定ファイルだけでなく、Javaコード内のクラスやBeanにも適用することができます。Springでは@Profileアノテーションを使って、プロファイルごとに特定のコンポーネントを有効にできます。
ここでは、dev環境だけで利用するコントローラの例を紹介します。
@Controller
@Profile("dev")
public class DevOnlyController {
@GetMapping("/dev-info")
public String showDevInfo(Model model) {
model.addAttribute("info", "これは開発環境専用の画面です。");
return "dev-info";
}
}
このように@Profile("dev")を付けることで、devプロファイルが有効なときだけこのコントローラが読み込まれるようになります。
また、サービスクラスにも同様のアプローチが使えます。たとえば、テスト環境専用のダミーサービスを用意して、testプロファイルのときだけ有効にできます。
@Service
@Profile("test")
public class DummyUserService implements UserService {
@Override
public String getUserName() {
return "テストユーザー";
}
}
このようにすることで、プロファイルに応じてクラスの振る舞いを簡単に切り替えることができます。実行環境に合わせた構成が実現でき、開発効率や安全性が高まります。
8. 実践的な活用シーンの紹介
最後に、プロファイルを実際の開発現場でどのように活用するか、実践的な例を紹介します。特にdev環境でのみ使いたい機能として、「ダミーデータの自動投入」があります。
開発中は毎回テスト用のデータを登録するのが手間です。そこで、CommandLineRunnerなどを使って、アプリ起動時に自動でダミーデータを登録する仕組みを作ります。
@Component
@Profile("dev")
public class DummyDataLoader implements CommandLineRunner {
private final UserRepository userRepository;
public DummyDataLoader(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public void run(String... args) throws Exception {
User user1 = new User("taro", "taro@example.com");
User user2 = new User("hanako", "hanako@example.com");
userRepository.save(user1);
userRepository.save(user2);
}
}
このクラスは@Profile("dev")が付いているため、devプロファイルでのみ有効になります。本番環境では実行されないため、安全です。
さらに、次のような状況でもプロファイルは便利です。
- 開発環境では簡易認証、本番環境ではOAuth認証を使用したい
- 外部APIの接続先を開発・本番で変えたい
- セキュリティ設定をプロファイルで切り替えたい
このように、プロファイルはただの設定切り替えにとどまらず、実装や運用の柔軟性を大きく高めるための重要な手段になります。