@Repositoryアノテーションは、**データの永続化層(データアクセス層)**において、データベースとのやり取りを担当するクラスに付与するためのアノテーションです。Springアプリケーションでは、リポジトリクラスがデータベース操作の役割を担い、他のクラスが直接データベース操作を行うことを避ける設計が推奨されています。@Repositoryを付与されたクラスは、データの保存、更新、削除、検索といった操作を担います。
@Repositoryの主な役割
- データベース操作を行うクラスであることを示す:
@RepositoryはSpringに対して、このクラスがデータ操作の役割を持つことを示します。通常、DAO(Data Access Object)やリポジトリ(Repository)パターンに沿ったクラスに付与します。 - 例外の統一管理:
@Repositoryが付与されたクラスで発生するデータベース関連の例外(SQLExceptionなど)は、SpringによりDataAccessExceptionにラップされます。この仕組みにより、例外の処理をよりシンプルに行えます。 - Spring Data JPAの自動実装:
@Repositoryは、Spring Data JPAとの組み合わせにおいて重要です。Spring Data JPAでは、リポジトリインターフェースに@Repositoryを付与することで、JPAエンティティに対するCRUD操作を自動的に実装します。
使用例
次に、@Repositoryアノテーションを用いたシンプルな使用例を示します。
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// 追加のカスタムメソッドを定義することもできます
User findByUsername(String username);
}
この例では、UserRepositoryというインターフェースが@Repositoryアノテーションでマークされており、JpaRepositoryを継承することで、データベース操作を実行するための標準的なCRUDメソッド(findAll、save、deleteなど)を自動で利用できるようになっています。
- インターフェースの拡張:
JpaRepositoryを継承することで、通常のCRUD操作が自動的に実装されます。また、必要に応じてfindByUsernameなどのカスタムメソッドを追加することも可能です。 - エンティティクラス:この例では、
Userというエンティティクラス(データベースのテーブルに対応)が存在すると仮定しています。
@Repositoryと例外処理
@Repositoryを使うと、データベースアクセス時の例外がDataAccessExceptionにラップされてSpringの例外として統一されます。たとえば、データベース操作でSQLExceptionが発生しても、リポジトリクラスの呼び出し側では、Springの例外として統一的に処理できるため、例外処理が簡潔になります。
他のアノテーションとの役割の違い
Springでは、@Repository以外にもデータベース操作を行うためのアノテーションが存在します。以下に、@Repositoryと他の代表的なアノテーション(@Service、@Controller)の役割の違いをまとめます。
| アノテーション | 役割 | 主な用途 |
|---|---|---|
@Controller | リクエストを受け取り、ビューを返す | コントローラー層 |
@Service | ビジネスロジックを実行する | サービス層 |
@Repository | データベース操作を行う、例外をラップする | データアクセス層 |
Spring Data JPAを使った場合の@Repositoryのメリット
Spring Data JPAを使用すると、リポジトリの実装をSpringが自動的に生成するため、コード量が削減され、標準的なCRUD操作に対応するためのコードを書く必要がなくなります。また、Spring Bootアプリケーションでは、Spring Data JPAのリポジトリインターフェースに@Repositoryを付与することで、エンティティの永続化を簡単に管理できます。
まとめ
@Repositoryはデータアクセス層のクラス(データベース操作を行うクラス)に付与し、例外を統一的に扱うことができます。- Spring Data JPAでは、
JpaRepositoryを継承したリポジトリインターフェースに@Repositoryを付与することで、CRUD操作が自動で実装されます。 @Repositoryはサービス層やコントローラー層とは異なる役割を持ち、データベース操作の責任を明確にするため、これらの層とは分けて使用することが推奨されます。
このように@Repositoryを使用することで、データベース操作の責任範囲が明確になり、アプリケーションの構成が整理されるため、保守性や可読性が向上します。

