daisuzz.log

Spring Frameworkの@Componentと@Controller,@Service,@Repositoryの違いを調べてみる

Springの@Component, @Controller, @Service, @Repositoryの違いについて気になったので調べてみます。

Stereotype Annotation

@Component, @Controller, @Service, @Repositoryなどは, Stereotypeアノテーションと呼ばれるものです。Stereotypeアノテーションとは、コンポーネントがアプリケーション内でどういう役割を担うかを表現するアノテーションです。 Springでは@Componentが付与されたクラスを、アプリケーション起動時にBeanとしてApplicationContextに登録します。@Controllerや@Service, @Repositoryなどはアノテーション内部で@Componentが付与されているため、@Componentと同じくクラスに付与することで、そのクラスはBeanとしてApplicationContextに登録されます。Stereotypeアノテーションは他にも@RestControllerや@Aspectなどがあります。

Spring Annotation Programming Model · spring-projects/spring-framework Wiki · GitHub

Spring Annotation Programming Model · spring-projects/spring-framework Wiki · GitHub

org.springframework.stereotype (Spring Framework 5.2.7.RELEASE API)

@Controller

@Controllerは、付与したクラスがMVCのコントローラの役割を持つことを表現します。機能面では@Componentと同じです。 @Controllerを使う場合は@RequestMappingや@ResponseBodyと一緒に使うことが多いと思います。ちなみに@ResponseBodyをコントローラクラスの描くメソッドに付与するのが面倒な場合は@RestControllerというstereotypeアノテーションを付与することで、デフォルトで@ResponseBodyアノテーションが各メソッドに付与されます。

Controller (Spring Framework 5.2.7.RELEASE API)

RestController (Spring Framework 5.2.7.RELEASE API)

@Service

@Serviceは、付与したクラスがDDD(ドメイン駆動設計)のサービスの役割、もしくはCoreJ2EEパターンの「ビジネスサービスファサード」の役割を持つことを表現します。裏側の複雑な処理を一つにまとめたシンプルなインターフェースを提供する役割と思ってもらえれば問題ないです。@Controllerと同じく機能面では@Componentと変わりません。Serviceという名前が汎用的なので、チームでどういう役割のときに付与するかは決めておいた方がよいです。

Service (Spring Framework 5.2.7.RELEASE API)

@Repository

@Repositoryは、付与したクラスがDDDのリポジトリの役割を持つことを表現します。また、PersistenceExceptionTranslationPostProcessorクラスをBean として登録することで、@Repositoryを付与したクラスで起きた例外をSpring独自のDataAccessExceptionという非チェック例外に自動で変換してくれます。

Repository (Spring Framework 5.2.7.RELEASE API)

PersistenceExceptionTranslationPostProcessor (Spring Framework 5.2.7.RELEASE API)

DataAccessException (Spring Framework 5.2.7.RELEASE API)