【Web】3層アーキテクチャ vs 3レイヤーアーキテクチャ vs MVC


Webアプリーケーション開発では、さまざまな設計パターンが使用されます。その中でも3層アーキテクチャやMVCは非常に有名なものですが、それぞれがどの層を担当しているのか、分かりづらいという事実もあります。そのため、今回の記事では3層アーキテクチャ、3レイヤーアーキテクチャ、MVC、それぞれの違いについてまとめていきます。
　
# 層（Tier） vs レイヤー（Layer）
層とレイヤーの違いについて見ていきます。

>層とレイヤーは同じではありません。 「レイヤー」とは、ソフトウェアの機能部を指しますが、「層」とは、他の部分から分離してインフラストラクチャーで実行されるソフトウェアの機能部を指します。  
（引用元）[「3層アーキテクチャーとは」](https://www.ibm.com/jp-ja/topics/three-tier-architecture)

:::note warn
TierとLayerは、和訳するとどちらも「層」になります。そのため、同じ意味で使用されることも多いみたいですが、本記事では上記の通り、層（Tier）とレイヤー（Layer）を区別します。　
:::

## 層（Tier）とは
層（Tier）は、ソフトウェアの物理的な分離を示す概念です。アプリケーションAとアプリケーションBが異なるサーバー上で動いている時、A層とB層という2つの層が存在することになります。このように、層はサーバーの構成を表す概念です。　

![スクリーンショット 2024-08-07 14.07.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576475/9a2ff793-73d4-7c2e-bf62-651190ff8c15.png)


## レイヤー（Layer）とは
レイヤー(Layer)は、ソフトウェアの機能的な分離を示す概念です。同一サーバー上に存在するアプリケーションを、「ユーザーとやり取りするプログラム」と「データベースとやり取りするプログラム」に分離して考える場合、2つのレイヤーが存在することになります。このように、レイヤーは機能ごとにプログラムを分離します。

下の図からも分かるように、層の中に多数のレイヤーが存在します。
　
![スクリーンショット 2024-08-07 14.09.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576475/d235b4e8-5ae7-e551-9474-9d00ca202322.png)
　
# 3層アーキテクチャ （3-Tier Architecture）
3層構造と呼ばれることもありますが、本記事では3層アーキテクチャと呼ぶことにします。3層アーキテクチャは、**プレゼンテーション層**、**アプリケーション層**、**データ層**の3つの層に分かれます。　
　
![スクリーンショット 2024-08-10 13.20.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576475/5b8ea619-7f1a-b332-e66a-ecf7efdbee15.png)
 

## プレゼンテーション層
プレゼンテーション層は、クライアントサイド・サーバーサイドにまたがって存在し、唯一ユーザーと直接やり取りする層です。具体的には、クライアントサイドプレゼンテーション層のWebブラウザを介して、ユーザーに対してデータを表示したり、ユーザーからの入力データを受け取ったりします。そして、Webブラウザは、サーバーサイドプレゼンテーション層に位置するWebサーバに対して、HTTPリクエストを送信します。　
　
Webサーバは、受信したHTTPリクエストを処理して、ただ単にクライアントにHTMLや画像ファイルを送り返す（HTTPレスポンス）こともあれば、アプリケーション層にビジネスロジックの実行を依頼することもあります。

アプリケーション層に処理を依頼した場合、Webサーバはアプリケーション層から実行結果を受け取り、クライアントサイドにHTTPレスポンスを送り返します。すると、HTTPレスポンスを受信したWebブラウザは、その結果を画面に表示します。

:::note info
**Webサーバの役割とWebサーバソフト**
クライアントからのリクエストが静的コンテンツであれば、HTMLやCSSを返します。動的コンテンツの場合は、APサーバに処理を依頼し、その処理結果をWebブラウザに返します。
また、Webサーバには、クライアントとHTTPを使用してやり取りする機能を提供するWebサーバソフトがインストールされています。Webサーバソフトには、Apache HTTP ServerやNginxなどがあります。
:::



## アプリケーション層
アプリケーション層は、ビジネスロジックを担当し、プレゼンテーション層とデータ層の仲介役として機能します。この層には、アプリケーションサーバ（APサーバ）が設置されます。　
　
APサーバは、Webサーバから送られてきたリクエストに対して、Javaなどのアプリケーションプログラムを実行して、ビジネスロジックの処理を行います。例えば、ユーザー情報の更新やショッピングカートへの商品の追加などの処理が行われます。
これらのビジネスロジック処理の多くは、データの取得や更新を含みます。そのため、APサーバはデータ層とやり取りすることで、データの取得や更新などの処理を行ってもらいます。具体的には、JavaなどのプログラムがSQLでDBサーバに命令を出すことで、データベースからデータを取得します。

そして、データ層から受け取った処理結果をWebサーバに送り返します。

:::note info
**APサーバの役割とAPサーバソフト**
APサーバは、アプリケーションプログラムを実行するためのサーバで、動的コンテンツの生成を可能にします。
またAPサーバには、上述の処理を可能にするAPサーバソフトがインストールされています。APサーバソフトには、Apache Tomcatなどがあります。
:::

## データ層
データ層には、データベースサーバ（DBサーバ）が設置されます。DBサーバは、DBMS（データベース管理システム）というデータベースに対して処理を行うソフトウェアと、物理的にデータを保持するデータベースで構成されます。
　
DBサーバでは、データのCRUD操作（保存、取得、更新、削除）が行われます。具体的には、アプリケーションプログラムが出力したSQLのクエリを、DBMSが解釈して、データベースに対して処理を行います。これにより、APサーバから送られてきたユーザーの会員情報などをデータベースに保存したり、会員情報の更新を行うことができます。

そして、処理結果をAPサーバに送り返します。

:::note info
**DBMS**
DBサーバ上で実行されるDBMSには、MySQLやPostgreSQLなどがあります。
:::

# ビジネスロジックとは？
先ほど出てきたビジネスロジックですが、単語だけ聞いてもすごくイメージがしづらいです、、
　
私たちは普段、ECサイトや動画配信サービスなど多くのサービスを使用していますよね。ECサイトだったら、ショッピングカートへの商品の追加、割引クーポンの適用、発送日の指定など様々な機能を利用しています。当たり前ですが、問題なく商品の合計金額が計算されたり、発送日の指定などを行うことができます。これらのサービスに必要不可欠な処理がビジネスロジックに該当します。

# 3レイヤーアーキテクチャ (3-Layer Architecture)
こちらも3層アーキテクチャと呼ばれることがありますが、本記事では、[「3層アーキテクチャーとは」](https://www.ibm.com/jp-ja/topics/three-tier-architecture)を参照し、**3レイヤーアーキテクチャ**と呼ぶことにします。

3層アーキテクチャは、物理的に3つのサーバを設けることで3つの層を構成しました。一方で、3レイヤーアーキテクチャは、APサーバ内で動くプログラムを、それぞれの関心毎に以下の3つレイヤーに分けます。つまり、3レイヤーアーキテクチャはアプリケーション層に存在します。

![スクリーンショット 2024-08-11 13.27.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576475/075ea545-0c62-0215-4d7b-a8aae2f6f689.png)

 

## プレゼンテーション層（プレゼンテーションレイヤー）
プレゼンテーション層は、ユーザーインターフェースを担当します。アプリケーションの利用者が人間であれ、その他のプログラムであれ、この層がアプリケーションの利用者とやり取りを行い、ビジネスロジック層との仲介役になります。**Controller**がその役割を担います。

## ビジネスロジック層（ビジネスロジックレイヤー）
ビジネスロジック層は、プレゼンテーション層とデータアクセス層の仲介役として機能し、ビジネスロジックを担当します。
プレゼンテーション層から処理の依頼を受けたビジネスロジック層は、データアクセス層とやり取りして必要なデータを取得・処理します。その後、処理結果をプレゼンテーション層に返します。
　
ビジネスロジックは、**Service**が担当します。Controllerメソッドの内部でServiceメソッドが呼び出されます。


## データアクセス層（データアクセスレイヤー）
データアクセス層は、ビジネスロジック層と連携してデータの取得・保存を行います。実際には、データアクセス層がSQLを実行することで、データベースに対して命令を出します。そして、DBから取得したデータをビジネスロジック層に返します。

Serviceメソッド内で、**DAO**や**Repository**のメソッドが呼びされます。

# MVC
MVCという設計パターンも存在します。MVCは、3レイヤーアーキテクチャのプレゼンテーション層周辺のアーキテクチャです。
　
![スクリーンショット 2024-08-11 13.09.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576475/60e667e6-cf14-fdcc-75db-78dd8bd2ea88.png)
　

## Model
Model（モデル）は、アプリケーションが扱うデータの管理・保持とビジネスロジックを担当します。

Modelがこの2つの処理を行うと、ファットモデルというModelの役割が多すぎる問題が発生するので、Modelはデータ管理のみを担当し、Serviceがビジネスロジックを行うことで役割を分担することができます。

## View
View（ビュー）は、ユーザーインターフェースを担当します。Viewは、Modelから提供されたデータをユーザーに表示し、ユーザーからの入力をコントローラに渡します。

## Controller
Controller（コントローラ）は、ユーザーからのリクエストを処理し、それに基づいてModelとViewの制御を行います。ModelとViewの間の仲介役として機能します。 
 
## MVCをもう少し詳しく
ここでModel、View、Controllerがやり取りする様子を見てみます。
　
![スクリーンショット 2024-08-10 16.18.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576475/d9923aaa-90a4-ad2a-b810-68b2f9f55517.png)
 　 
 
1. ユーザーからの入力
ユーザーがまずViewで操作を行います。
　
2. ViewからControllerへ
Viewはユーザーからの入力を受け取ると、それをControllerに渡します。
　
3. Controllerの処理
Controllerはユーザーからの入力を受け取り、それを解釈して適切なModelにビジネスロジックの処理を要求します。
　
4. Modelによるビジネスロジック
Modelがビジネスロジックを実行する過程で、必要に応じてデータを更新し、そのデータをModelが保持します。そして、処理結果をコントローラに返します。
　
5. ControllerからViewへの通知
Controllerは、Modelから受け取った結果をもとに、Viewに更新を指示します。
　
6. Viewの更新
Viewは、更新されたデータをModelから取得し、画面を更新します。
 　
7. Viewが更新されたUIを表示
Viewは、更新されたUIを表示します。

　
詳細は以下：

https://www.geeksforgeeks.org/mvc-design-pattern/

# まとめの図
以下が、3層アーキテクチャ（3-Tier Architecture）、3レイヤーアーキテクチャ（3-Layer Architecture）、MVCのまとめの図になります。
　
![スクリーンショット 2024-08-14 14.27.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576475/e3b12d07-81f5-2c45-be5a-da35c224ac03.png)


# 参照 
https://qiita.com/os1ma/items/7a229585ebdd8b7d86c2


https://atmarkit.itmedia.co.jp/fjava/javafaq/j2ee/j2e04.html#:~:text=%E2%97%8F%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%82%B5%E3%82%A4%E3%83%89%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%EF%BC%9A%20Client,Web%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%8C%E3%81%93%E3%82%8C%E3%81%AB%E3%81%82%E3%81%9F%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

https://qiita.com/JavaLangRuntimeException/items/fcb3dc2e2c49bf1ee293

https://qiita.com/mi-1109/items/a8e5cfa0637ba2925b59


https://zenn.dev/i3design/articles/031e5c0a46fe4c

https://www.baeldung.com/cs/layers-vs-tiers

https://dev.to/3bdelrahman/understanding-layers-tiers-and-n-tier-architecture-in-application-development-1hlb


https://medium.com/@sudipdevdev/n-tier-and-n-layer-architecture-f149f8184a60