Webアプリーケーション開発では、さまざまな設計パターンが使用されます。その中でも3層アーキテクチャやMVCは非常に有名なものですが、それぞれがどの層を担当しているのか、分かりづらいという事実もあります。そのため、今回の記事では3層アーキテクチャ、3レイヤーアーキテクチャ、MVC、それぞれの違いについてまとめていきます。
層(Tier) vs レイヤー(Layer)
層とレイヤーの違いについて見ていきます。
層とレイヤーは同じではありません。 「レイヤー」とは、ソフトウェアの機能部を指しますが、「層」とは、他の部分から分離してインフラストラクチャーで実行されるソフトウェアの機能部を指します。
(引用元)「3層アーキテクチャーとは」
TierとLayerは、和訳するとどちらも「層」になります。そのため、同じ意味で使用されることも多いみたいですが、本記事では上記の通り、層(Tier)とレイヤー(Layer)を区別します。
層(Tier)とは
層(Tier)は、ソフトウェアの物理的な分離を示す概念です。アプリケーションAとアプリケーションBが異なるサーバー上で動いている時、A層とB層という2つの層が存在することになります。このように、層はサーバーの構成を表す概念です。
レイヤー(Layer)とは
レイヤー(Layer)は、ソフトウェアの機能的な分離を示す概念です。同一サーバー上に存在するアプリケーションを、「ユーザーとやり取りするプログラム」と「データベースとやり取りするプログラム」に分離して考える場合、2つのレイヤーが存在することになります。このように、レイヤーは機能ごとにプログラムを分離します。
下の図からも分かるように、層の中に多数のレイヤーが存在します。
3層アーキテクチャ (3-Tier Architecture)
3層構造と呼ばれることもありますが、本記事では3層アーキテクチャと呼ぶことにします。3層アーキテクチャは、プレゼンテーション層、アプリケーション層、データ層の3つの層に分かれます。
プレゼンテーション層
プレゼンテーション層は、クライアントサイド・サーバーサイドにまたがって存在し、唯一ユーザーと直接やり取りする層です。具体的には、クライアントサイドプレゼンテーション層のWebブラウザを介して、ユーザーに対してデータを表示したり、ユーザーからの入力データを受け取ったりします。そして、Webブラウザは、サーバーサイドプレゼンテーション層に位置するWebサーバに対して、HTTPリクエストを送信します。
Webサーバは、受信したHTTPリクエストを処理して、ただ単にクライアントにHTMLや画像ファイルを送り返す(HTTPレスポンス)こともあれば、アプリケーション層にビジネスロジックの実行を依頼することもあります。
アプリケーション層に処理を依頼した場合、Webサーバはアプリケーション層から実行結果を受け取り、クライアントサイドにHTTPレスポンスを送り返します。すると、HTTPレスポンスを受信したWebブラウザは、その結果を画面に表示します。
Webサーバの役割とWebサーバソフト
クライアントからのリクエストが静的コンテンツであれば、HTMLやCSSを返します。動的コンテンツの場合は、APサーバに処理を依頼し、その処理結果をWebブラウザに返します。
また、Webサーバには、クライアントとHTTPを使用してやり取りする機能を提供するWebサーバソフトがインストールされています。Webサーバソフトには、Apache HTTP ServerやNginxなどがあります。
アプリケーション層
アプリケーション層は、ビジネスロジックを担当し、プレゼンテーション層とデータ層の仲介役として機能します。この層には、アプリケーションサーバ(APサーバ)が設置されます。
APサーバは、Webサーバから送られてきたリクエストに対して、Javaなどのアプリケーションプログラムを実行して、ビジネスロジックの処理を行います。例えば、ユーザー情報の更新やショッピングカートへの商品の追加などの処理が行われます。
これらのビジネスロジック処理の多くは、データの取得や更新を含みます。そのため、APサーバはデータ層とやり取りすることで、データの取得や更新などの処理を行ってもらいます。具体的には、JavaなどのプログラムがSQLでDBサーバに命令を出すことで、データベースからデータを取得します。
そして、データ層から受け取った処理結果をWebサーバに送り返します。
APサーバの役割とAPサーバソフト
APサーバは、アプリケーションプログラムを実行するためのサーバで、動的コンテンツの生成を可能にします。
またAPサーバには、上述の処理を可能にするAPサーバソフトがインストールされています。APサーバソフトには、Apache Tomcatなどがあります。
データ層
データ層には、データベースサーバ(DBサーバ)が設置されます。DBサーバは、DBMS(データベース管理システム)というデータベースに対して処理を行うソフトウェアと、物理的にデータを保持するデータベースで構成されます。
DBサーバでは、データのCRUD操作(保存、取得、更新、削除)が行われます。具体的には、アプリケーションプログラムが出力したSQLのクエリを、DBMSが解釈して、データベースに対して処理を行います。これにより、APサーバから送られてきたユーザーの会員情報などをデータベースに保存したり、会員情報の更新を行うことができます。
そして、処理結果をAPサーバに送り返します。
DBMS
DBサーバ上で実行されるDBMSには、MySQLやPostgreSQLなどがあります。
ビジネスロジックとは?
先ほど出てきたビジネスロジックですが、単語だけ聞いてもすごくイメージがしづらいです、、
私たちは普段、ECサイトや動画配信サービスなど多くのサービスを使用していますよね。ECサイトだったら、ショッピングカートへの商品の追加、割引クーポンの適用、発送日の指定など様々な機能を利用しています。当たり前ですが、問題なく商品の合計金額が計算されたり、発送日の指定などを行うことができます。これらのサービスに必要不可欠な処理がビジネスロジックに該当します。
3レイヤーアーキテクチャ (3-Layer Architecture)
こちらも3層アーキテクチャと呼ばれることがありますが、本記事では、「3層アーキテクチャーとは」を参照し、3レイヤーアーキテクチャと呼ぶことにします。
3層アーキテクチャは、物理的に3つのサーバを設けることで3つの層を構成しました。一方で、3レイヤーアーキテクチャは、APサーバ内で動くプログラムを、それぞれの関心毎に以下の3つレイヤーに分けます。つまり、3レイヤーアーキテクチャはアプリケーション層に存在します。
プレゼンテーション層(プレゼンテーションレイヤー)
プレゼンテーション層は、ユーザーインターフェースを担当します。アプリケーションの利用者が人間であれ、その他のプログラムであれ、この層がアプリケーションの利用者とやり取りを行い、ビジネスロジック層との仲介役になります。Controllerがその役割を担います。
ビジネスロジック層(ビジネスロジックレイヤー)
ビジネスロジック層は、プレゼンテーション層とデータアクセス層の仲介役として機能し、ビジネスロジックを担当します。
プレゼンテーション層から処理の依頼を受けたビジネスロジック層は、データアクセス層とやり取りして必要なデータを取得・処理します。その後、処理結果をプレゼンテーション層に返します。
ビジネスロジックは、Serviceが担当します。Controllerメソッドの内部でServiceメソッドが呼び出されます。
データアクセス層(データアクセスレイヤー)
データアクセス層は、ビジネスロジック層と連携してデータの取得・保存を行います。実際には、データアクセス層がSQLを実行することで、データベースに対して命令を出します。そして、DBから取得したデータをビジネスロジック層に返します。
Serviceメソッド内で、DAOやRepositoryのメソッドが呼びされます。
MVC
MVCという設計パターンも存在します。MVCは、3レイヤーアーキテクチャのプレゼンテーション層周辺のアーキテクチャです。
Model
Model(モデル)は、アプリケーションが扱うデータの管理・保持とビジネスロジックを担当します。
Modelがこの2つの処理を行うと、ファットモデルというModelの役割が多すぎる問題が発生するので、Modelはデータ管理のみを担当し、Serviceがビジネスロジックを行うことで役割を分担することができます。
View
View(ビュー)は、ユーザーインターフェースを担当します。Viewは、Modelから提供されたデータをユーザーに表示し、ユーザーからの入力をコントローラに渡します。
Controller
Controller(コントローラ)は、ユーザーからのリクエストを処理し、それに基づいてModelとViewの制御を行います。ModelとViewの間の仲介役として機能します。
MVCをもう少し詳しく
ここでModel、View、Controllerがやり取りする様子を見てみます。
- ユーザーからの入力
ユーザーがまずViewで操作を行います。
- ViewからControllerへ
Viewはユーザーからの入力を受け取ると、それをControllerに渡します。
- Controllerの処理
Controllerはユーザーからの入力を受け取り、それを解釈して適切なModelにビジネスロジックの処理を要求します。
- Modelによるビジネスロジック
Modelがビジネスロジックを実行する過程で、必要に応じてデータを更新し、そのデータをModelが保持します。そして、処理結果をコントローラに返します。
- ControllerからViewへの通知
Controllerは、Modelから受け取った結果をもとに、Viewに更新を指示します。
- Viewの更新
Viewは、更新されたデータをModelから取得し、画面を更新します。
- Viewが更新されたUIを表示
Viewは、更新されたUIを表示します。
詳細は以下:
まとめの図
以下が、3層アーキテクチャ(3-Tier Architecture)、3レイヤーアーキテクチャ(3-Layer Architecture)、MVCのまとめの図になります。
参照