SpringBootの@Serviceアノテーションとは?
まずは、公式Javadocを見てみます。
アノテーション付きクラスが「サービス」であり、ドメイン駆動設計(Evans、2003)によって「カプセル化された状態でモデル内に単独で存在するインターフェースとして提供される操作」として最初に定義されたことを示します。
また、クラスが「ビジネスサービスファサード」(コア J2EE パターンの意味で)または類似のものであることを示す場合もあります。このアノテーションは汎用のステレオタイプであり、個々のチームはセマンティクスを絞り込み、必要に応じて使用できます。このアノテーションは @Component の特殊化として機能し、クラスパススキャンを通じて実装クラスを自動検出できます。
アノテーション型 Service
重要なことは、機能的には@Serviceは@Componentであるということです。つまりDI対象である通常のコンポーネントと変わりません。
しかし、近年のWebアプリケーションでは、Contoller->Service->Repositoryというアーキテクチャが一般的であるため、@Componentを付与するクラスの中でも、特にServiceであることを明示するために、@Serviceが使えるようになっています。
「汎用のステレオタイプであり、個々のチームはセマンティクスを絞り込み」とあります。「セマンティクス」とは「意味」「語義」と翻訳されますが、Webアプリケーションの中で@Serviceを使うときは、チーム内で「サービス」が表す意味を決めて使っていきましょうということです。
Contoller->Service->Repositoryというアーキテクチャをとるときは、「サービス」が表すことは、単純に「ビジネスロジックの置き場」ということになるでしょう。これは『「ビジネスサービスファサード」(コア J2EE パターンの意味で)または類似のものである』に該当します。
また、ドメイン駆動設計の考え方を取り入れるときは、@Serviceを付与するべきクラスは『「カプセル化された状態でモデル内に単独で存在するインターフェースとして提供される操作」』にするのが典型であると書いています。
ドメイン駆動設計を採用するにしろ、コア J2EE パターンを採用するにしろ、チーム内で@Serviceの意味するところ、つまり@Serviceを付与するべきクラスの債務(役割)をちゃんと決めて使いましょうということです。
SpringBootの@Serviceクラスの使われ方
@Serivceを付与したクラスは、SpringBootアプリケーションの起動時に、コンポーネントスキャンによって認識され、DIコンテナに登録されます。
DI可能(@Autowired可能)なコンポーネントとして扱うことができるようになります。
主に@Controllerを付与したコントローラー層から呼び出して使用することになります。