【Java初心者向け】クリーンアーキテクチャとは?設計原則と実装例を丁寧に解説

こんにちは。ゆうせいです。
今日は「クリーンアーキテクチャ(Clean Architecture)」というソフトウェア設計の考え方を、Javaのコード例を交えながら、やさしく解説していきます。

プログラムを書いていて、「このコード、後から修正しにくそう…」と思ったことはありませんか?
クリーンアーキテクチャは、長く保守できるコードを書くための考え方なんです。


クリーンアーキテクチャとは?

クリーンアーキテクチャの概要

クリーンアーキテクチャは、ソフトウェアを分割して責任を明確にするための設計方法です。
提唱者は「ロバート・C・マーチン(通称 Uncle Bob)」という著名なソフトウェアエンジニアです。

このアーキテクチャでは、システムを同心円状に分割します。内側ほどビジネスロジックに近く、外側ほどインフラやUIなど可変的なものになります。

代表的な4層の構造

 ---------------------------
  |    外部インターフェース  | ← Web API, CLIなど
  ---------------------------
  | アプリケーションユースケース | ← サービス層
  ---------------------------
  |   ドメインモデル層     | ← エンティティ
  ---------------------------
  |  インターフェースの抽象 | ← Repositoryインターフェースなど
  ---------------------------
 

中心から外には依存していいけれど、外から中心には依存してはいけないのが重要なルールです。


各層の役割を解説(Javaコード付き)

① エンティティ(Entities)

ビジネスルールを表現する層。データと振る舞いを持つドメインモデルです。

public class User {
    private String id;
    private String name;

    public User(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public boolean isValid() {
        return name != null && !name.isEmpty();
    }
}

エンティティはどの技術にも依存しないのがポイント!


② ユースケース(Use Cases)

アプリケーション固有の操作の流れ(手続き)を定義します。

public class CreateUserUseCase {
    private final UserRepository repository;

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

    public void execute(String id, String name) {
        User user = new User(id, name);
        if (user.isValid()) {
            repository.save(user);
        }
    }
}

「ユーザーを作る」という処理の流れを記述します。


③ インターフェース(Interface Adapters)

ユースケースを外の世界(WebやDB)とつなぐ層です。DTO(データ転送オブジェクト)などもここに登場します。

public class UserController {
    private final CreateUserUseCase createUserUseCase;

    public UserController(CreateUserUseCase createUserUseCase) {
        this.createUserUseCase = createUserUseCase;
    }

    public void handleRequest(String id, String name) {
        createUserUseCase.execute(id, name);
    }
}

Webリクエストを受け取って、ユースケースを呼び出す役割ですね。


④ 外部システム(Frameworks & Drivers)

Webサーバー、データベース、ファイルなどです。ここから内側には依存しません。

public class UserRepositoryImpl implements UserRepository {
    @Override
    public void save(User user) {
        // データベースに保存する処理(仮)
        System.out.println("Saved user: " + user.getName());
    }
}

インターフェース(UserRepository)に依存し、実装はここで完結します。


依存関係逆転の法則(Dependency Rule)

ポイント

  • 外から内へ依存するのではなく、内側のビジネスルールがインターフェースを定義し、外側が実装します。
  • これにより、ビジネスロジックを他の要素から切り離すことができます。

例えるなら?

学校の先生(ユースケース)が「テストを出してください」と言うときに、「黒板」や「プリンタ」は選ばないですよね?
「テストを出す」という目的(抽象)だけを伝えて、どの方法で出すかは後から決めるのです。これが依存関係逆転のイメージです。


クリーンアーキテクチャのメリットとデメリット

メリットデメリット
テストしやすい最初の構成が面倒
保守性が高い小規模アプリには過剰なことも
技術に依存しない学習コストが高い

クリーンアーキテクチャ導入の手順(簡易版)

  1. エンティティ(ドメイン)から先に作る
  2. ユースケースを設計する
  3. インターフェース(Repositoryなど)を定義する
  4. 外部との接続部分を実装する

まとめと今後の学習の指針

クリーンアーキテクチャは、「きれいなコード」ではなく、「長く使える設計」を意識したアーキテクチャです。

最初は設計が複雑に感じるかもしれませんが、テストのしやすさ将来の変更に強い構造を体験すると、メリットが実感できるはずです。

次に学ぶと良いトピックはこちら:

  • DI(依存性注入)とDIコンテナ(Springなど)
  • SOLID原則(特に単一責任の原則)
  • ポートとアダプタアーキテクチャ(ヘキサゴナルアーキテクチャ)

それでは、クリーンなコードライフを!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。