はじめに
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
eclipseの実行構成でVM引数(コマンドライン引数)に指定します。
-prod
RailwayのダッシュボードでVariables(環境変数)に指定します。
まとめ
このようにプロファイルごとに設定を分けておくことで、環境ごとの切り替えを自動化できます。
さらに、GitHubにコードをpushするたびに、Railwayが自動でエラーチェックを行い、問題がなければそのまま本番環境にデプロイされるCI/CDの仕組みを構築することができます。
最後まで読んでいただきありがとうございました。