ひがやすを技術ブログ

電通国際情報サービスのプログラマ

Slim3の環境設定機能

環境設定はwarアーカイブ内で持ちたくない.JNDIで取得するべき.そのための利用しやすいObjectFactoryを用意してもらえるといいのかも

Configurerの目的がいまひとつピンときませんでした。環境切り分け用であれば、SpringはJNDIを簡単に使えるのでそちらを利用したいところです。特に、本番環境用設定は設定ファイル上には持ちたくないので、セキュリティ的にはJNDIが最も安心だと思っています。環境面での切り替え用途だけではなく、APサーバ提供機能に対する切り分けという意味でも便利ですし。

Slim3の資料はこちら。
http://jsug.googlegroups.com/web/slim3.ppt?gda=TdayYzwAAABCmnn5cQjQR2l7OdNDgO501qg1jqxANuq4CRYYyzE6PaOfm6yDD3t3iM6guxGxRbRhNKlgHwxd66RgHfBM_wS5
shinさんもda-yoshiさんも環境設定はJNDIで取得すべきと書いているけど良くわからないなぁ。二人とも私の説明を直接聞いていないので、私のいっていることが伝わっていないのかもしれないし、私が勘違いしているのかもしれない。
そのため、Slim3の環境設定周りを説明しておきます。Springでは、環境設定をプロパティに書いてBean設定ファイルで参照することがポピュラーな手法(なはず)です。
例えば、プロパティファイルに


db.userName=scott
とかいてあるとすると設定ファイルで次のように参照できます。

<value>${db.userNname}</value>

この方法だと、単体テストするときと総合テストするときと本番で設定を変えなければいけないときに、そのぞれの環境用にプロパティファイルを用意してプロパティファイルの中身を入れ替えるか、Bean設定ファイルで利用するプロパティファイルを変更する必要があります。
環境ごとにファイルを変更するのは、できる限り避けたいので、環境ごとにslim_env_環境名.propertiesを用意しておいて、WARの外からコンテキストパラメータを使って環境名を指定するようにします。
Tomcatならコンテキスト設定用のアプリケーション名.xmlで次のように設定します。

<Parameter name="slim.env" value="環境名"/>

他のアプリケーションサーバだと設定画面から設定できるようになっているはず。
slim_env.propertiesの内容をslim_env_環境名.propertiesで上書きできるので、本番用の設定をslim_env.propertiesに書いておいて、個別の環境用の設定をslim_env_環境名.propertiesに書くのが推奨される使い方です。アプリケーションサーバ上で動かさないときには、TestCase上で環境名を設定できるようにします。
アプリケーションサーバで動かさないこともあるわけだから、JNDIで取得するのはつらいと思うけどね。また、アプリケーションサーバ外で動くJNDIの実装を使うこともできるけど、どのJNDIに接続するのかをパラメータで設定(環境設定)する必要があり、堂々巡りの予感。


Slim3の場合は、本番の時には下記のようなプロパティ(slim_env.properties)


#slim.ds.user=
#slim.ds.password=
#slim.ds.driverClassName=
#slim.ds.url=
slim.ds.jndi=datasource/oracle
JUnitのテストの時には下記のようなプロパティ(slim_env_ut.properties)

slim.ds.user=scott
slim.ds.password=tiger
slim.ds.driverClassName=oracle.jdbc.driver.OracleDriver
slim.ds.url=jdbc:oracle:thin:@xxx:1521:xxx
# slim.ds.jndi=
にしておいて、TestCase#setUp()でEnv.setName("ut")とすることで、簡単に環境を切り替えることができます。
DataSourceConfigureは、slim.ds.jndiが設定されていれば、JNDIからDataSourceをlookup()し、そうでなければアプリケーションサーバを使わないデータソースの実装に切り替えます。アプリケーションサーバを使わないデータソースの実装はS2DBCPを移植する予定です。


同様にTransactionConfigureは、各アプリケーションサーバの実装クラスがあれば、そのJTAを使い、なければ、アプリケーションサーバを使わないJTAの実装に切り替えます。アプリケーションサーバを使わないJTAの実装はS2JTAを移植する予定です。


この方法だとBean設定ファイルはどのプロジェクトでもほとんど一緒になるはず。各プロジェクトごとの作業はslim_env.properitesのデータソースの設定を雛形をみながら書き換えるだけになります。