見出し画像

システム日付取得の設計時考慮ポイント


はじめに

はじめまして。株式会社ラキール LaKeel DXコンサル4Groupに所属する土屋です。
私の所属するGroupでは、金融業務を中心にLaKeel DX上で動作するシステムの提案・設計・開発・保守を行っております。
今回投稿させていただくトピックは、業務システムで用いられる「システム日付」の取得について設計時に考慮すべきポイントをお伝えしたいと思います。

システム日付とは

システム日付とは「システムが動作する機器が保持し、OS等が返却する現在の日付」と定義できます。
業務システムを構築する際には様々なケースでシステム日付を用いて日付の判断、算出等を行います。
例えば、Webで商品の問合せを行う機能を提供するシステムだと、問合せを受け付けた「受付日」や、サービス事業者から実際に回答を行った「回答日」はシステム日付が用いられますし、現在の年齢は入力された「生年月日」をもとにシステム日付を用いて算出します。
設計書を作成する際、「受付日 = システム日付」 といった記述をするかもしれません。では開発する際、開発者は「システム日付」をどのように取得すると考えるでしょうか?
開発プロジェクトでシステム日付の取得に関する指針が提供されていなければ、開発者毎に異なったシステム日付の取得ロジックを作りこむ可能性があります。
取れる日付が同じであれば取得ロジックは開発者毎に異なっても問題ないのでは? と思われるかもしれませんが、「システム日付」に関しては設計時に取得方針を考慮しておかないと期待する日付が取得できない場合があります。

システム日付取得に関する考慮ポイント

  • タイムゾーンの考慮

世界各国には時差があります。時差があるため、同一タイミングにおいても地域によっては日付が1日ずれるケースがあります。
この時差の基準となる共通の時間が「協定世界時(UTC)」であり、このUTCを9時間進めた時間が「日本標準時(JST)」となります。
昨今のクラウド環境においては、「UTC」で取得したシステム日時(時間までの精度)をデータ保持し、必要に応じてJSTに変換して使うことが標準的な考え方になっていると思います。
日付を時間までの精度で保持するデータ型でデータ保持する場合は上記方式をとれますが、時刻を持たない日付だけのデータ型を用いる場合、タイムゾーンを意識せずにシステム日付を取得してデータ保持すると、期待する日付と1日ずれた日付が設定される懸念があります。
システム事故を防ぐ為、システム日付を取得する際はタイムゾーンを考慮してシステム内で統一した方式で日付を取得することが重要となります。

  • システム日付の取得場所に関する考慮

システム日付とはどこの機器で返却された日付を使うべきなのでしょうか?
利用者がシステムを利用するクライアント端末(PC・タブレット等)のOSが返却する現在日付でしょうか? それとも、業務アプリケーションが稼働するサーバのOS日付でしょうか?
また、サーバとひとくくりにしても、アプリケーションが稼働するWebアプリケーションサーバとデータを保持するDBサーバのどちらが返却するOS日付でしょうか?
システム日付自体はそのどちらからも取得することができます。但し、機器が異なればタイムゾーンが異なるケースもありますので同一日付が返却されない可能性があります。
後続する理由により、システム日付の取得については共通のシステム日付取得機能を用意して一元的に取得する方針で設計することをお勧めします。

システム日付取得ロジックを一元化すべき理由

業務システムは一般的に年間を通して特定のサイクル(日次、月次、年次等)で業務処理を行います。 例えば、月末に月次締処理のバッチが起動し、月初日にWebシステムで月次締め結果を確認するといったサイクルが考えられます。
このようなサイクルを持つ業務システムの挙動が正しく機能しているかを確認する為、特定のシステム日付から開始して随時日付を進めるサイクルテスト(日回しテスト)を総合テスト(システムテスト)や運用テストで実施します。
業務システムのシステム日付の取得方法が統一されておらず、バッチサーバや、Webアプリケーションサーバの各機能から個別にサーバのOS日付を取得するロジックとなっていると、サイクルテスト実施時に取得元のサーバのOS日付をそれぞれ変更する必要がでてきます。 但し、サーバのOS日付を変更することによってサーバ上で稼働する各種ミドルウェア、他アプリケーションに影響を与える可能性があるため、テストの為にサーバのOS日付を変更するのはハードルが高くなります。
システム日付の取得元を設定によりOS日付と外部ファイル(DB等)に切り替える事ができるような共通のシステム日付取得機能を用意し、システム日付は必ず同機能を経由して取得するとした場合、OS日付を変更することなく指定の日付で業務システムの動作・テストを実施することが可能となります。
サイクルテストはシステム開発工程の後半に行うテストとなりますので、設計段階で日付の統一した取得方法を考慮することが重要です。

LaKeelDXにおけるシステム日付の解決策

弊社製品のLaKeelDXには、マスタデータ管理やメール送信等のように一般的なアプリケーションでよく利用される処理を独立し、サービス化した機能の集まりを共通機能化して「LaKeel Components」として提供しています。同機能を利用することで同じような機能を毎回実装することがなく効率的な開発を行うことが可能となります。
「LaKeel Components」の中にはロケールや現在時刻に関する制御を集中管理するマイクロサービスとして、「LaKeel Time-Util」という機能があります。
システム日付を取得する機能を本マイクロサービス経由で取得することにより、ロケールや日付、時刻を任意に変更した値を取得できるように切り替えることが可能となります。