Edited at

Serviceとはなにか

More than 3 years have passed since last update.

(参考:MVCモデルにおけるサービスの役割について教えて下さい


サービスとは

サービスというのは、処理をするモノのことです。

たとえば、アプリケーションでユーザーのパスワードをハッシュ化して記録する場合、そのハッシュ化処理を1つのクラスに独立させたとしましょう。このクラスは「PasswordEncoderサービス」です。要するに、ライブラリでも何でも、処理を提供するクラスはサービスだと言ってしまえます。また、このPasswordEncoderサービスは、ユーザーの情報を保存する時に、Modelの内部で利用されることもあれば、他の理由でControllerから使われることもあり得ます。


サービスを利用する場面

サービスをどう使うのかという点では、先ほどのPasswordEncoderでもそうでしたが、いくつか考えられます

Controllerに記述していた共通処理を何かの観点でまとめるのに使う

Modelに記述していた共通処理を何らかの観点でまとめるのに使う

テンプレートのために必要な共通処理を何らかの観点でまとめるのに使う

Controllerの共通処理のためには、Controllerの基底クラスを作り、そこに共通メソッドを作るという方法もありますが、これはあまり良い方法ではありません。個々のControllerからコードが減る代わりに、基底クラス側に複雑性が集中してしまったりします。

「サービス」というものを直接扱えるフレームワークであれば、単に個々の処理に対応するクラスを作り、必要な箇所で利用できうようにフレームワークに指示する、という共通した手順で使えます(例えばSymfonyのサービスコンテナ)。CakePHPの場合は、使う箇所によってヘルパーだったり、と個別の仕組みが用意されていたりしますが、そういったものを超えて、自分で作ったクラスを使えるようにすれば、いろいろと対応の幅が広がります。


サービスはModelなのか?

前節のように、MVCのパーツのどの部分の処理でも、それをサービスにまとめることは可能です。サービスというのは、単なる「処理を提供するもの」だからです。この意味で、サービスというのは、ModelだとかControllerだとか、そういった構造とは基本的に関係のないものということになります。


サービスレイヤー(ユースケースレイヤー)


  • ControllerとModelの間に挟んで、Modelの操作をまとめる層のように使う

という使い方もあります。これは部品として使うというよりも、MVCというアーキテクチャ(作り方)に構造を追加するという目的になります。専門的な言葉では、サービスレイヤー、またはユースケースレイヤーと呼ばれます。こういった作り方で、プロダクションコードの見通しを良くすることができます。


マイクロサービス?

昨今話題になる「マイクロサービス」という言葉で表されるサービスは、ここで説明した「1つのクラス」というのよりももっと大きな単位を指しています。例えば1つの企業の中の「会員管理サービス」などを1つのサービスというカタマリで捉えます。

「サービス」という言葉はとても汎用的で、この言葉を基準にして調べても膨大な事柄がでてきてしまいます。なので、何のために使うのかという目的から理解されていくのが、よいと思います。


まとめ


  • サービスというのは単なる処理/クラス

  • MVCの「モデル」とサービスとは、直接的には関係がない

  • 「サービス」は用語として混乱しているので、目的から理解しよう