0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Spring Bootで環境ごとに設定を自動切替する方法【CI/CD対応】

Last updated at Posted at 2025-05-19

はじめに

Spring Bootではapplication.propertiesを使って設定を記述しますが、本番環境と開発環境では設定が異なるのが一般的です。
そのため、プロファイル(例:dev, prod, test)ごとに設定ファイルを分けるのがベストプラクティスです。
さらに、プロファイルの切り替えを自動化することで、GitHubにコードをpushするたびに、Railwayが自動でエラーチェックを行い、問題がなければそのまま本番環境にデプロイされるCI/CDの仕組みを構築することができます。

設定ファイルの分割

私は以下の3つに設定を分けました:

ファイル名 用途
application-test.properties 開発用(テスト)
application-dev.properties 開発用(ローカル)
application-prod.properties 本番用(デプロイ先用)

application-test.properties(テスト)

#== テスト環境用の設定 ==

# H2のURLの設定(PostgreSQL互換モード)
spring.datasource.url=jdbc:h2:mem:testdb;MODE=PostgreSQL
# H2のユーザー名
spring.datasource.username=sa
# H2のパスワード
spring.datasource.password=

# アプリ起動時にスクリプトを常に実行
spring.sql.init.mode=always
# スキーマ定義用SQL
spring.sql.init.schema-locations=classpath:schema-test.sql
# 初期データ投入用SQL
spring.sql.init.data-locations=classpath:data-test.sql

# マッパーXMLファイルの場所
mybatis.mapper-locations=classpath:mapper/*.xml
# エンティティクラスのパッケージ
mybatis.type-aliases-package=com.ozeken.expensecalendar.entity

アプリ起動時にスクリプトを常に実行

alwaysにしておくと、スキーマと初期データを毎回読み込むため、開発中やテスト時に、毎回初期状態で始めたい場合に便利です。

スキーマ定義用SQL、初期データ投入用SQL

-test用のスクリプトを使用するための設定です。

◉H2データベースを使用する理由

  • インメモリで動作が早い
  • インストールが不要(依存関係を追加すればすぐに使用可能)
  • 実行終了時に自動でデータが消える
  • PostgreSQLなどとある程度互換性がある(実運用と近い形でテストできる)

application-dev.properties(ローカル)

#== ローカル開発環境の設定 ==

#Postgresのドライバの設定
spring.datasource.driver-class-name=org.postgresql.Driver
#PostgresのURLの設定
spring.datasource.url=jdbc:postgresql://localhost:5432/expensecalendar_db
#Postgresのユーザ名の設定
spring.datasource.username=springuser
#Postgresのパスワードの設定
spring.datasource.password=oo554ta

#SQLスクリプトの初期化の設定
spring.sql.init.mode=always

#Log表示設定
logging.level.com.ozeken.expensecalendar=DEBUG

# MyBatisのマッパーXMLの場所を指定
mybatis.mapper-locations=classpath:mapper/*.xml
# MyBatisで使うエンティティのパッケージ指定
mybatis.type-aliases-package=com.ozeken.expensecalendar.entity

# Thymeleafのキャッシュを無効にする
spring.thymeleaf.cache=false

Log表示設定

DEBUGに設定して詳細を確認可能です。

Thymeleafのキャッシュを無効にする

テンプレートファイルを変更したら即時反映されたほうがよいため、falseにします。

SQLスクリプトの初期化の設定

テストプロファイルと同じ理由です。

◉postgreSQLを使用する理由

本番環境でも使用するデータベースのため移行時の不具合を防ぐことができます。

-devの注意点

-devは実際のパスワードが記述してあるため、.gitignoreに入れてGitの管理から外してください。
不正ログインに繋がります。

application-prod.properties(公開)

# == 公開用の設定 ==
spring.datasource.url=${JDBC_DATABASE_URL}
spring.datasource.username=${JDBC_DATABASE_USERNAME}
spring.datasource.password=${JDBC_DATABASE_PASSWORD}
spring.datasource.driver-class-name=org.postgresql.Driver

#SQLスクリプトの初期化の設定
spring.sql.init.mode=never

# マッパーXMLファイルの場所
mybatis.mapper-locations=classpath:mapper/*.xml
# エンティティクラスのパッケージ
mybatis.type-aliases-package=com.ozeken.expensecalendar.entity

# Thymeleafのキャッシュを有効にする
spring.thymeleaf.cache=true

URL・ユーザー名・パスワードの設定

デプロイの際、環境変数から取得するためプレースホルダーにしておきます。

◉テスト/ローカルと異なる設定⇩

SQLスクリプトの初期化の設定

本番環境ではテーブルの作成、初期データの投入をするのを防ぎたいため、neverにします。

Thymeleafのキャッシュを有効にする

テンプレートを初回読み込み後、メモリにキャッシュされるため
再読み込みは行われません。
そのためパフォーマンスが向上します。

それぞれのプロファイルに適用する方法

-test

@ActiveProfiles("test") //←この部分
@WebMvcTest(CalendarViewController.class)
public class CalendarViewControllerTest {

このようにTestクラスの上にアノテーションで指定します。

-dev

-dev適用方法.png

eclipseの実行構成でVM引数(コマンドライン引数)に指定します。

-prod

-prod適用方法.png

RailwayのダッシュボードでVariables(環境変数)に指定します。

まとめ

このようにプロファイルごとに設定を分けておくことで、環境ごとの切り替えを自動化できます。
さらに、GitHubにコードをpushするたびに、Railwayが自動でエラーチェックを行い、問題がなければそのまま本番環境にデプロイされるCI/CDの仕組みを構築することができます。

最後まで読んでいただきありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?