【Spring Boot】三層アーキテクチャとは?をやさしく解説

Java入門・実践
スポンサーリンク
スポンサーリンク

はじめに

Spring Boot のコードを書いていると、
Controller / Service / Repository という
3 つの層をよく目にします。

「なんとなく分けてるけど、理由は?」
「三層アーキテクチャって何?」
「どこに何を書けばいいの?」

そんな疑問を持つ方に向けて、 三層アーキテクチャを
やさしく・実務寄り で整理していきます。

まずは全体像から見ていきましょう。

三層アーキテクチャとは

一言でいうと、

「役割ごとにコードを 3 つの層に分けて、見通しと保守性を高める設計」

です。

  • Presentation(表示・受付)
  • Application(業務処理)
  • Data Access(データアクセス)

Spring Boot では、
Controller / Service / Repository
として実装されることが多いです。

三層アーキテクチャの全体像

┌──────────────────────┐
│ Controller(表示層) │ ← リクエストを受け取る
└───────────┬──────────┘

┌───────────▼──────────┐
│ Service(業務層) │ ← ビジネスロジック
└───────────┬──────────┘

┌───────────▼──────────┐
│ Repository(データ層) │ ← DB とのやり取り
└──────────────────────┘

この 3 つが役割分担することで、
コードが読みやすく、変更に強くなります。

Controller(表示層)

役割

  • リクエストを受け取る
  • パラメータを受け取る
  • Service を呼び出す
  • レスポンスを返す

書かないこと

  • 業務ロジック
  • DB アクセス
  • 計算処理

Java
@RestController
public class UserController {

    private final UserService service;

    public UserController(UserService service) {
        this.service = service;
    }

    @GetMapping("/users/{id}")
    public UserResponse getUser(@PathVariable Long id) {
        return service.findUser(id);
    }
}

Controller は“受付係”です。

Service(業務層)

役割

  • ビジネスロジック
  • 複数の Repository を組み合わせる
  • トランザクション管理
  • バリデーション(業務的なもの)

書かないこと

  • HTTP の処理
  • DB の直接操作

Java
@Service
public class UserService {

    private final UserRepository repository;

    public UserService(UserRepository repository) {
        this.repository = repository;
    }

    public UserResponse findUser(Long id) {
        User user = repository.findById(id)
                .orElseThrow(() -> new UserNotFoundException("not found"));
        return new UserResponse(user.getName(), user.getAge());
    }
}

Service は“司令塔”です。

Repository(データ層)

役割

  • DB とのやり取り
  • SQL / ORM の実行
  • データの永続化

書かないこと

  • 業務ロジック
  • HTTP の処理

Java
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

Repository は“データの窓口”です。

三層アーキテクチャを使うメリット

役割が明確になる

Controller にロジックを書かない、
Service に SQL を書かない、
というルールでコードが整理されます。

テストしやすい

  • Service の単体テスト
  • Repository のテスト
  • Controller のテスト

層ごとにテストできるため、品質が上がります。

変更に強い

  • DB を変えても Controller は影響を受けない
  • 画面を変えても Service はそのまま
  • ロジックを変えても Repository はそのまま

層が分かれていることで影響範囲が小さくなります。

実務でよくあるアンチパターン

Controller にロジックを書いてしまう

→ 画面が増えると地獄になります。

Service がただの“中継役”になる

→ ロジックが薄すぎると層の意味がなくなります。

Repository に業務ロジックを書く

→ DB に依存した設計になり、変更に弱くなります。

三層アーキテクチャをもっと活かすポイント

DTO を使う

Controller と Service の間で
リクエスト / レスポンスを明確にできます。

例外クラスを使う

Service 層で例外を投げ、
ControllerAdvice でまとめて処理できます。

トランザクション管理

Service 層に @Transactional を付けるのが基本です。

まとめ

三層アーキテクチャとは、
「Controller / Service / Repository に役割を分ける設計」
です。

  • Controller → 受付
  • Service → 業務ロジック
  • Repository → データアクセス
  • 役割が明確になり、保守性が上がる
  • テストしやすく、変更に強い

難しく聞こえますが、
「受付・司令塔・データ係」
と理解できれば十分です。


decopon
decopon

三層アーキテクチャを理解すると、
Spring のコードが一気に読みやすくなります。
役割が整理されるだけで、設計の迷いが減り、
開発がとてもスムーズになります。
あなたの開発が、今日より少しだけ楽になりますように。

moco
moco

受付係と司令塔とデータ係…役割分担ってかわいいね。

コメント

タイトルとURLをコピーしました