レイヤードアーキテクチャの正しい設計法|Javaで学ぶ保守性の高いシステム設計の基本

Java

「レイヤードアーキテクチャって聞いたことはあるけど、正しく説明できない…」
「Service に全部書いてしまって、コードがぐちゃぐちゃになっている…」

そんな悩みを持っていませんか?

レイヤードアーキテクチャは、Javaエンジニアにとって必須レベルの設計手法です。特に業務システム開発では、ほぼ標準と言っていいほど使われています。

この記事では、

  • レイヤードアーキテクチャの正しい考え方
  • 各レイヤーの責務
  • Javaでの具体的な設計例
  • 神クラスを生まないコツ
  • Javaを学ぶメリット

を、小学生でもわかるやさしい言葉で解説します。


レイヤードアーキテクチャとは?まずは全体像を理解しよう

レイヤードアーキテクチャとは、
アプリケーションを「層」に分けて整理する設計方法です。

イメージは「ケーキの層」です。

  • 一番上:画面やAPIの層
  • 真ん中:アプリの処理の流れを決める層
  • その下:ビジネスルールの層
  • 一番下:データベースなどの層

それぞれの役割をハッキリ分けることで、

  • コードが読みやすくなる
  • 修正しやすくなる
  • チーム開発がスムーズになる

という大きなメリットがあります。


レイヤードアーキテクチャの基本構造

一般的に、次のような四つの層に分かれます。

役割
プレゼンテーション層画面・APIとのやり取り
アプリケーション層処理の流れを制御
ドメイン層ビジネスルール
インフラストラクチャ層DBや外部サービス

とてもシンプルですよね。

しかし、正しく設計できている人は意外と少ないのが現実です。


正しい設計の大原則|依存方向を守れ

レイヤードアーキテクチャには、絶対に守るべきルールがあります。

上の層は下の層に依存する

下の層は上の層を知らない

これが大原則です。

たとえば、

  • Controller → Service を呼ぶのはOK
  • Service → Controller を呼ぶのはNG

下の層が上の層を知ってしまうと、依存関係がぐちゃぐちゃになります。

これがスパゲッティコードの始まりです。


各レイヤーの正しい責務

ここからが重要です。

プレゼンテーション層

役割は「受付係」です。

  • リクエストを受け取る
  • 必要なデータをServiceへ渡す
  • 結果を返す

ここにビジネスロジックを書いてはいけません。

悪い例

@PostMapping("/order")
public String order(@RequestParam int quantity) {
if (quantity <= 0) {
throw new IllegalArgumentException();
}
// 在庫計算ロジック
}

ビジネスルールはドメインに書くべきです。


アプリケーション層

役割は「司令塔」です。

  • 処理の流れを決める
  • トランザクション管理
  • ドメイン同士をつなぐ
public class OrderService {    private final ProductRepository repository;    public void orderProduct(int productId, int quantity) {
Product product = repository.findById(productId);
product.decreaseStock(quantity);
repository.save(product);
}
}

ここで重要なのは、ロジックの詳細は書かないことです。


ドメイン層

ここが心臓部です。

ビジネスルールはすべてここに書きます。

public class Product {    private int stock;    public void decreaseStock(int quantity) {
if (quantity <= 0) {
throw new IllegalArgumentException("数量が不正です");
}
if (stock < quantity) {
throw new IllegalStateException("在庫不足です");
}
stock -= quantity;
}
}

このように、在庫はマイナスにならないというルールはドメインに書きます。

これが正しい設計です。


インフラストラクチャ層

ここは「外の世界との接点」です。

  • データベース
  • 外部API
  • メール送信
public class ProductRepository {    public Product findById(int id) {
// DBアクセス処理
} public void save(Product product) {
// DB保存処理
}
}

SQLはここに閉じ込めます。


Javaでレイヤードアーキテクチャが強い理由

Javaは業務システムで圧倒的に使われています。

理由は、

  • 型が強い
  • 大規模開発に向いている
  • フレームワークが豊富
  • 長年の実績がある

特にSpring系フレームワークとの相性は抜群です。

レイヤード設計を理解したJavaエンジニアは、現場で非常に評価されます。


神クラスを防ぐ方法

初心者がやりがちなのが、

Serviceに全部書く問題

これを防ぐコツは、

  • ビジネスルールはドメインへ
  • 処理の流れだけをServiceに
  • DBアクセスはRepositoryに

役割を徹底的に分けることです。


DTOは分けるべき?

基本は分けることをおすすめします。

  • Entityはビジネスルール用
  • DTOは画面通信用

小さなアプリでは共通でも構いませんが、
本格的な業務システムでは分けたほうが安全です。


トランザクションはどこに書く?

基本はアプリケーション層です。

理由は、

  • 処理単位で管理できる
  • ドメインを汚さない

これも実務では非常に重要です。


レイヤードアーキテクチャを学ぶメリット

これを理解していると、

  • 設計レビューに強くなる
  • 面接で差がつく
  • 大規模案件で活躍できる

Javaエンジニアとしての市場価値が上がります。


絶対にJavaプログラマーになりたい人へ

まずは基礎を固めることが重要です。

独学で始めるなら、
👉 絶対にJavaプログラマーになりたい人へ。
https://amzn.asia/d/3E1CYbv

この本で基礎を固めてください。

設計の考え方も含めて、Javaの本質が理解できます。


それでも不安な人へ

  • コードレビューを受けたい
  • 本気でJavaエンジニアに転職したい
  • 実務レベルの設計を身につけたい

そんな人は
👉 サイゼントアカデミー
https://academy.cyzennt.co.jp

現役エンジニアからレビューを受けながら学べます。


まとめ|レイヤーを守るだけでコードは変わる

レイヤードアーキテクチャは難しくありません。

守るべきことはシンプルです。

  • 責務を分ける
  • 依存方向を守る
  • ビジネスルールはドメインへ

これだけで、あなたのコードは劇的に変わります。

Javaは今も第一線で使われる最強クラスの言語です。

正しい設計を身につけて、
市場価値の高いJavaエンジニアになりましょう。

コメント

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