Quarkusプロジェクトにクリーンアーキテクチャを導入する方法を完全解説!初心者でも理解できる設計の基本
生徒
「Quarkusでアプリを作っているんですが、クラスが増えてきて構成が分からなくなってきました…」
先生
「それはよくある悩みですね。Quarkusでも、設計を意識しないとプロジェクト構成が複雑になります。」
生徒
「クリーンアーキテクチャって聞いたことはありますが、難しそうなイメージがあります。」
先生
「考え方は意外とシンプルです。Quarkusのプロジェクト構成に合わせて、分かりやすく整理していきましょう。」
1. クリーンアーキテクチャとは何か
クリーンアーキテクチャとは、アプリケーションを責務ごとに分離し、 変更に強く保守しやすい構造を作るための設計思想です。 Javaを使った開発現場でも広く使われており、 Quarkusプロジェクトでも非常に相性が良い考え方です。
この設計では、業務ロジックを中心に置き、 フレームワークや外部技術への依存を外側に追い出します。 その結果、Quarkusというフレームワークに強く依存しない 安定したプロジェクト構成を作ることができます。
2. Quarkusにクリーンアーキテクチャを導入するメリット
Quarkusプロジェクトにクリーンアーキテクチャを導入することで、 クラスやパッケージの役割が明確になります。 初心者が途中参加しても理解しやすく、 チーム開発にも向いた構成になります。
また、Quarkus特有のREST APIやDIの仕組みを 外側のレイヤーに閉じ込めることで、 将来的な仕様変更や技術変更にも柔軟に対応できます。 長期運用を考えるプロジェクトほど効果を発揮します。
3. クリーンアーキテクチャの基本レイヤー構成
クリーンアーキテクチャでは、主に四つのレイヤーを意識します。 内側から順に、エンティティ、ユースケース、インターフェース、 フレームワークという構成です。 Quarkusプロジェクトでは、これをパッケージ構成として表現します。
com.example
├─ domain
│ └─ model
├─ usecase
├─ interfaceadapter
│ └─ resource
└─ infrastructure
この構成により、どのクラスがどの役割を持つのかが一目で分かります。 Quarkusのプロジェクト構成にクリーンアーキテクチャを組み込む際の基本形です。
4. ドメイン層の役割と設計
ドメイン層は、アプリケーションの中心となる業務ルールを表現します。 ここには、エンティティや値オブジェクトなど、 業務そのものを表すクラスを配置します。 Quarkusのアノテーションは使用しません。
package com.example.domain.model;
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
この層は、Quarkusに依存しない純粋なJavaコードで構成します。 そのためテストもしやすく、再利用性も高くなります。
5. ユースケース層で業務処理をまとめる
ユースケース層は、アプリケーションの振る舞いを定義する場所です。 どのような処理を行うのかを整理し、 ドメイン層のオブジェクトを使って業務を実行します。
package com.example.usecase;
import com.example.domain.model.User;
public class UserUseCase {
public User create(String name) {
return new User(name);
}
}
この層もQuarkusには依存しません。 処理の流れが明確になり、ビジネスロジックの把握が簡単になります。
6. インターフェース層とQuarkus REST API
インターフェース層では、外部とのやり取りを担当します。 QuarkusのREST APIは、この層に配置します。 HTTPリクエストを受け取り、ユースケース層を呼び出す役割です。
package com.example.interfaceadapter.resource;
import com.example.usecase.UserUseCase;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
@Path("/users")
public class UserResource {
@Inject
UserUseCase useCase;
@GET
public String get() {
return useCase.create("sample").getName();
}
}
Quarkusのアノテーションはこの層に限定します。 これにより、フレームワーク依存を外側に閉じ込められます。
7. インフラ層の考え方
インフラ層は、データベースや外部サービスとの連携を担当します。 Quarkusのデータベース接続や設定クラスなどは、 この層にまとめると分かりやすくなります。
クリーンアーキテクチャでは、 内側の層が外側の層に依存しないことが重要です。 依存関係の向きを常に意識することで、 Quarkusプロジェクト構成が破綻しにくくなります。
8. 初心者が意識したい導入時のポイント
クリーンアーキテクチャを一気に完璧に導入しようとすると、 かえって複雑に感じることがあります。 最初はパッケージ分割を意識するだけでも十分です。
Quarkusのプロジェクト構成を整理しながら、 少しずつ責務分離を進めることが大切です。 設計を意識する習慣が身につくことで、 将来の大規模開発にも対応できる力が自然と身につきます。