はじめに
Spring Boot のアプリを作っていると、
Controller / Service / Repository の 3 つの層をよく目にします。
その中でも Repository 層 は、
「DB とやり取りする場所」というイメージはあるものの、
どこまで書くべきか迷いやすい層です。
この記事では、Repository 層の役割を
やさしく・実務寄り で整理していきます。
まずは全体像から見ていきましょう。
Repository 層とは
一言でいうと、
「データベースとのやり取りを担当する“データ係”の層」
です。
三層アーキテクチャでは、
- Controller → 受付
- Service → 業務ロジック
- Repository → データアクセス
という役割分担になっています。
Repository は、 アプリとデータベースの橋渡し をする層です。
Repository 層の役割を具体的に整理する
データの取得(SELECT)
最も基本的な役割です。
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}Spring Data JPA を使えば、 findById や findAll が自動で使えます。
データの保存(INSERT / UPDATE)
新規作成や更新も Repository の役割です。
userRepository.save(user);Service 層でロジックを組み立て、
Repository 層で保存します。
データの削除(DELETE)
削除も Repository の担当です。
userRepository.deleteById(id);クエリメソッドで検索条件を表現する
Spring Data JPA の便利機能です。
List<User> findByAgeGreaterThan(int age);SQL を書かなくても検索できます。
@Query で独自クエリを書く
複雑な検索は @Query を使います。
@Query("SELECT u FROM User u WHERE u.name LIKE %:keyword%")
List<User> search(@Param("keyword") String keyword);DB に依存する処理をまとめる
Repository は DB に近い層なので、
データアクセスに関する処理はここに集約 します。
例:
- ページング
- ソート
- ネイティブクエリ
- トランザクション境界の内側で必要な処理
Repository 層に書かないこと
業務ロジック
NG
if (user.getAge() < 20) { ... }これは Service の役割です。
入力チェック
NG
if (name == null) { ... }形式的なチェックは Controller / DTO、
業務的なチェックは Service です。
レスポンスの整形
NG
return new UserResponse(user);レスポンスの形は Controller が決めます。
外部 API の呼び出し
Repository は DB に集中します。
実務でよくあるアンチパターン
Repository にロジックを書きすぎる
→ DB に依存した設計になり、変更に弱くなります。
Service が薄くなり、Repository が太る
→ 三層アーキテクチャの意味がなくなります。
Controller から直接 Repository を呼ぶ
→ テストしにくく、ロジックが散らばります。
Repository 層をもっと活かすポイント
Spring Data JPA を使う
- save
- findById
- findAll
- delete
などが自動で使えるため、実装がシンプルになります。
クエリメソッドを活用する
findByEmailAndStatus(String email, Status status)@Query で柔軟に検索
複雑な検索も簡単に書けます。
ページング・ソートを活用
Page<User> findAll(Pageable pageable);まとめ
Repository 層は、
「データベースとのやり取りを担当する層」
です。
- データの取得
- 保存
- 更新
- 削除
- クエリメソッドや @Query の活用
- DB に依存する処理の集約
難しく聞こえますが、
「Repository はデータ係、Service は頭脳、Controller は受付」
と理解できれば十分です。

Repository 層の役割を理解すると、
三層アーキテクチャの全体像が一気にクリアになります。
データアクセスをきれいに分離するだけで、
設計もテストもぐっと楽になります。
あなたの開発が、今日より少しだけ楽になりますように。

データ係って、裏でこっそり支えてくれる感じがしてかわいいね…

コメント