【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)
ポイント
- 外から内へ依存するのではなく、内側のビジネスルールがインターフェースを定義し、外側が実装します。
- これにより、ビジネスロジックを他の要素から切り離すことができます。
例えるなら?
学校の先生(ユースケース)が「テストを出してください」と言うときに、「黒板」や「プリンタ」は選ばないですよね?
「テストを出す」という目的(抽象)だけを伝えて、どの方法で出すかは後から決めるのです。これが依存関係逆転のイメージです。
クリーンアーキテクチャのメリットとデメリット
メリット | デメリット |
---|---|
テストしやすい | 最初の構成が面倒 |
保守性が高い | 小規模アプリには過剰なことも |
技術に依存しない | 学習コストが高い |
クリーンアーキテクチャ導入の手順(簡易版)
- エンティティ(ドメイン)から先に作る
- ユースケースを設計する
- インターフェース(Repositoryなど)を定義する
- 外部との接続部分を実装する
まとめと今後の学習の指針
クリーンアーキテクチャは、「きれいなコード」ではなく、「長く使える設計」を意識したアーキテクチャです。
最初は設計が複雑に感じるかもしれませんが、テストのしやすさや将来の変更に強い構造を体験すると、メリットが実感できるはずです。
次に学ぶと良いトピックはこちら:
- DI(依存性注入)とDIコンテナ(Springなど)
- SOLID原則(特に単一責任の原則)
- ポートとアダプタアーキテクチャ(ヘキサゴナルアーキテクチャ)
それでは、クリーンなコードライフを!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール

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