プログラマとプロマネのあいだ

プログラマもやるし、プロマネもやるし、たまに似非アーキとか営業っぽいこともやる

英語ディクテーション学習Webアプリ(8)

taka-2.hatenablog.jp

前回の続き。

プロファイルでの環境差異の吸収

ローカルはオンメモリデーターベース、Heroku上ではPostgreSQLとなり、環境差異を吸収する必要が出てくるので、Spring Bootのプロファイルを調べて導入しないといけません。

 というわけで調べました。

-Dspring.profiles.active=dev

というVM引数を渡すと、プロファイルを切り替えられます。dev環境のプロパティファイルは、application-dev.propertiesに書けば反映されます。Heroku環境で、このVM引数の渡し方はイマイチ分からなかったので、productionをdefaultとして、開発環境では上記のようにdevプロファイルとして起動することで解決しました。

これで、開発環境はh2database、本番環境はPostgreSQLで切り替え可能になりました。ちなみにHeroku上のPostgreSQLは無料で簡単に作れます。しかし、無料枠では1万行までしか扱えないなどの制限があるようです。

f:id:taka_2:20171028235145p:plain

ちなみに、spring bootで設定情報をソースの外に出す方法についてはもっと色々あって、下記を参照すると良いようです。

24. Externalized Configuration

PostgreSQLjdbc URL/username/passwordは、バージョン管理したくないので、環境変数(HerokuのConfig Vars)に設定しています。

データベース差異の吸収

データベースへの初期データ投入は、spring bootの機能で、data.sqlを用意しておくと起動時に実行してくれるという仕組みを利用していますが、h2databaseとPostgreSQLで微妙に文法が違うことが災いして、1つのdata.sqlで対応できないことが判明しました。

ここで役立つのがspring.datasource.platformという設定。これを使って、dev環境は、spring.datasource.platform=h2にして、data-h2.sqlを用意。production環境は、spring.datasource.platform=postgresqlにして、data-postgresql.sqlを用意、という風に分けることが可能です。同じようなSQLをコピペすることにはなりますが、いったん回避できました。