文書管理システムを SOA を用いて構築するには、まずシステムを構成するサービスを括り出す必要があります。
サービスを括り出すためのアプローチとしては、大きく分けて
の二つがあります。
トップダウンアプローチは、業務プロセス分析やモデリングの結果などを元にして、企業・組織としてのビジネスプロセス全体のあるべき姿をとらえ、それを構成するようなサービスを定義していくという大がかりな方法です。 これに対してボトムアップアップアプローチは、既存のアプリケーションやデータに着目してサービスを抽出しようという方法です。
今回は構築対象が文書管理システムという特定のものなので、ボトムアップアプローチを適用しました。
実際にサービスを括り出すにあたっては、いくつか注意しなくてはならない点があります。 その前にまず SOA やサービス化の目的について確認しておきます。
SOA において、システムをサービスに切り分けるのは次のような目的があります。
サービスの括り出しはこの目的に沿ったものでなければなりません。具体的には次のような注意をする必要があります。
上記の注意を念頭に、文書管理システムのサービスを括り出しました。
先に書いたように、今回はボトムアップアプローチをとりましたが、このアプローチではデータや既存のアプリケーションに着目してサービスを括り出します。今回の文書管理システムは新規のシステムなので既存のアプリケーションはありませんし、扱うものも「文書」というデータです。したがってデータに着目しました。
このシステムが扱うデータは、大きく次の2種類あります。
ということで、まず文書とそれに関連する管理情報を扱う機能を一つのサービスとして括り出します。具体的な機能としては文書の登録や検索、更新といったものがあります。これらを別々のサービスにしてしまうと相互依存関係になってしまいます。
次にユーザ情報ですが、これに関しては、ユーザ情報を取得する基本的なサービスと、それを利用する認証サービスなどの応用サービスに分けました。基本サービスを別にしたことで、将来 SOA による構成を他システムまで広げた時の再利用性が高まると考えられるからです。
さて、データに着目してサービスを括り出したのですが、実際には直接データと結び付いていない機能というものがあり、これらもサービス化する必要があります。今回のシステムでいえば、定期的に文書の承認状態を調べ、必要な通知を行うというバッチ処理のような機能があります。これはサービスとしてではなく、独立したアプリケーションとして作成することも可能です。しかし、サービス化しておけば BPEL を用いて自動実行したり、また必要があれば通常のサービス呼出によって GUI から実行させるようなことも簡単にできるので、サービスとして実装することにしました。
とまあ、文書管理システムのサービスの括り出しについてざっと書いてきましたが、実は今回サービスの設計を進めていくにあたって、問題が一つありました。 それはユーザインタフェース(画面)に関するもので、一言でいってしまうと「画面はサービスに含まれるのか?」ということです。
ご存知のようにSOAでは再利用を重視しています。しかもその再利用は、プログラムの一部を流用する、というようなものではなく、サービスをまるごと そのままの形で他からも利用する、という意味での再利用です。そのように考えると、ある機能(ビジネスロジック)とそれを扱うための画面を組み合わせてサービスと考える、ということもできそうな気がします。 逆に画面とビジネスロジックを分けてしまってビジネスロジックだけをサービスにしてしまうと、サービスの再利用にあたっていちいち画面を作らなければならない、ということになります。
とはいえ、やはり画面とビジネスロジックは分けて、ビジネスロジックの部分をサービスにすべきです。ロジックに画面がくっついていると、複数のロジックを 組み合わせるようなアプリケーションが作りにくいという技術的な問題も大きいのですが、それ以外にも再利用を進める上での障害があります。
SOAで既存のアプリケーションを統合し、あるアプリケーションでの処理の結果が別のアプリケーションの処理のきっかけになるというようなワークフロー的な使い方の場合には画面とロジックが一体のままでもよいでしょうが、一般的には画面とロジックは分離すべきだと思います。