Web 3 層モデル — Web・アプリケーション・データベースの分担

この記事は、プログラミングやバイブコーディングをする上で最低限身につけたほうがよい IT の実践的な知識を 1 から身につける「IT 基礎知識講座の一部」です。
フロントエンドとバックエンドは、Web・アプリケーション・データベースの 3 つの層のどれかを別の言い方で呼んだものです。層をまたぐ流れを図解で確かめます。

この記事は、Web 3 層モデルを扱います。

Web アプリを Web・アプリケーション・データベースの 3 つの役割に分けて見る考え方です。

入門書のフロントエンドとバックエンドは、この 3 つのどれかを別の言い方で呼んだものです。

入門書の語と、3 つの層の対応
===フロントエンドバックエンドデータベースWeb 層AP 層DB 層表示と入力の受け取り判断と計算読み書きの指示データの保存と読み出しリクエスト読み書き
上段が入門書や講座に出てくる語、中段がこの記事での呼び名、下段がその層が担当すること。二重線で結んだ上下 2 つは、言い方が違うだけで同じものです。

本文では正式な呼び名、図では場所が狭いので Web 層・AP 層・DB 層と略します。

3 層モデルは、1 つのアプリを Web・アプリケーション・データベースの役割で分ける

3 層モデル(three-tier architecture。 Web・アプリケーション・データベースの 3 つの役割に分けて作る構成)が Web アプリの基本形で、分けた 1 つ 1 つを(tier)と呼びます。

この記事での呼び名英語表記担当すること入門書での呼び名
Web サーバー層presentation tier画面のファイルを返すフロントエンド
AP 層application tier判断と計算をするバックエンド
DB 層data tierデータを保存して読み出すデータベース

Web サーバー層が返したファイルは、利用者のブラウザが実行して画面を描きます。

アプリをどの部分に分け、どうつなぐかという構成そのものがアーキテクチャ(architecture)で、入門書の「3 層アーキテクチャ」はこの記事の 3 層モデルと同じものです。

my-app 1 つの中身
my-app(会員制の予約アプリ)
Web 層(フロントエンド)
  • 予約フォームと予約の一覧を表示する
  • 12/24 18:00 に 2 名、という入力を受け取る
  • 利用者のブラウザで動く
AP 層(バックエンド)
  • 12/24 18:00 が空いているかを確かめる
  • 予約を確定し、結果を Web サーバー層に返す
  • サーバーで動く
DB 層(データベース)
  • 予約と会員の記録を保存する
  • 指示された記録を読み出して返す
  • データベースのサーバーにある
外枠が my-app 1 つ。中の 3 つが層で、上から利用者に近い順に並ぶ。箇条書きは、予約アプリでその層が担当すること。

3 つの層は、上から下へ利用者に近い順に並びます。

利用者が直接操作するのは Web サーバー層が返した画面だけで、残る 2 つは見えません。

Web サーバー層が返した画面は、利用者 1 人につき 1 つずつブラウザの中で動きます。

利用者が 3 人なら画面は 3 つで、残る 2 つの層は 3 人で 1 つを使います

左の 3 つの画面は、それぞれ別のパソコンやスマホで動いています。

同じ時間を選んだ A と B のうち、あとから処理されたほうが断られるのは、記録が 1 つのデータベース層にまとまっているからです。

画面がいくつになっても、届く先と記録は 1 つずつです。

3 層モデルは 1 つのアプリの中の分担

3 層モデルとは、1 つのアプリを Web・アプリケーション・データベースの 3 つの担当に分ける決め方です。

入門書のフロントエンドが Web サーバー層、バックエンドがアプリケーションサーバー層で、 Web サーバー層が返した画面は利用者ごとに 1 つずつあり、アプリケーションサーバー層とデータベース層は全員で 1 つを使います。

なぜ層に分けるのか — 直す場所が 1 つで済み、全員分を 1 か所で決められる

分ける理由は 2 つあります。

1 つ目は、変えたいことがあるとき、直す場所が 1 つの層に収まることです。

同じ 1 つの変更でも、直す範囲は分け方で変わる
ボタンの色を変えたい分けてあるWeb 層だけ直す1 つにまとまっている色を書いた場所を探すAP 層と DB 層は触らない関係のない処理まで動くか確かめ直す
上が変えたいこと。左が層に分けてある場合、右が 1 つにまとまっている場合で、下の段はそのときに確かめ直す範囲です。

分けてあれば、触るのは Web サーバー層のファイルだけです。

1 つにまとまっていると、色を決めている場所を探したうえで、関係のない処理まで動くかどうかを確かめ直します。

2 つ目は、全員分をまとめて判断し、保存する場所が要ることです。

Web サーバー層が返した画面は利用者 1 人のブラウザで動き、他の人の入力を知りません。

そのアプリ固有の判断の決まりがビジネスロジック(business logic)で、アプリケーションサーバー層に置きます。

Web サーバー層で確かめることと、アプリケーションサーバー層に置く決まり
my-app(会員制の予約アプリ)
画面で確かめること
  • 日付の欄が空のまま送られていないか
  • 人数が数字で入っているか
  • 送る前にその場で知らせられる
AP 層に置く決まり(ビジネスロジック)
  • 12/24 18:00 に予約が重なっていないか
  • その会員が予約できる件数を超えていないか
  • 全員分の記録を読んでから決められる
外枠が my-app 1 つ。上の枠が Web サーバー層でその場で確かめること、下の枠がアプリケーションサーバー層に置くビジネスロジック。

Web サーバー層が返した画面でも、日付の欄が空でないかなどは確かめます。

ただし、その確認をしているのは利用者のブラウザに届いたファイルなので、利用者の側で書き換えたり飛ばしたりできます

だから同じことを、アプリケーションサーバー層でもう一度確かめます。

2 人が同じ 12/24 18:00 を同時に送った場面で、この判断をどこに置くかによって結果がどう変わるのかを比べます。

違いは、判断するときに何を見ているかです。

画面の側は自分のブラウザの一覧だけを見ていて、アプリケーションサーバー層は全員分の記録を読んでから決めます。

画面の側に置くと、利用者 A と B はどちらも自分の一覧しか見ていないので、両方が「空いている」と判断します。

アプリケーションサーバー層に置けば、全員分のリクエストが 1 か所に届き、記録を読んでから順に確かめられます。

分けるのは、直す場所と決める場所のため

層に分けておくと、直したいときに触る場所が 1 つで済みます。

もう 1 つの理由は全員分を 1 か所で見て決める必要があることで、利用者ごとに分かれている画面では、ほかの人が何を送ったかが分かりません。

予約が 1 件入るまでに、データは層をどうまたぐか

Web サーバー層とアプリケーションサーバー層はリクエストとレスポンスで、アプリケーションサーバー層とデータベース層は読み書きの指示でつながっています。

そこですること渡す先渡すもの
Web 層入力を受け取るAP 層12/24 18:00 2 名
AP 層空いているか確かめるDB 層その日の予約を読む指示
DB 層記録を読み出すAP 層12/24 の予約 0 件

どの層も、自分の担当だけをして次へ渡します。

Web サーバー層はデータベース層に直接つながらず、間には必ずアプリケーションサーバー層が入ります。

データベース層から記録が返ったあとは、アプリケーションサーバー層が結果を決めます。

アプリケーションサーバー層で 2 つに分かれ、返事は 1 つに戻る
12/24 18:002 名 のリクエストAP 層記録を読む空いていた→ 書き込むすでに 1 件あった→ 書き込まないWeb 層へレスポンスを返す
左から届いた 1 件のリクエストが、記録を読んだ結果で上下に分かれる。分かれても、 Web サーバー層に戻るレスポンスは 1 つ。

どちらに分かれても、 Web サーバー層に戻るのは 1 つのレスポンスです。

3 層はこの記事の基本形で、実際のアプリには例外もあります。

アプリケーションサーバー層を自分で作らず外部サービスへ直接つなぐ構成や、アプリケーションサーバー層が複数に分かれた構成もあります。

それでもWeb・アプリケーション・データベースのどれを担当しているかで見れば読めます。

下りて戻る道は 1 本

利用者の入力は、 Web サーバー層からアプリケーションサーバー層、データベース層へと下りて、同じ道を戻ります。

Web サーバー層はデータベース層に直接つながらず、アプリケーションサーバー層が記録を読んでから結果を決めて、戻すのは 1 つの返事だけです。

自分のアプリではどれがどの層か — 3 層は 3 台とは限らない

入門書に出てくるファイルやフレームワークが、どの層のものかを先に決めると、手順の意味が読めます。

同じ 3 層を、JavaScript で作る場合と Python で作る場合
==Web サーバー層アプリケーションサーバー層データベース層index.htmlscript.jsserver.js(Express)PostgreSQLindex.htmlscript.jsviews.py(Django)PostgreSQL
各行が 1 つの層です。真ん中と右が、その層にあたるファイルや製品。上と下の行は両方で同じで、違うのは真ん中の行だけです。

Web サーバー層は、どちらの場合も同じファイルです。

ブラウザが直接読めるのは HTML・CSS・JavaScript なので、言語を選べるのはアプリケーションサーバー層から先です。

層は役割の分け方であって、コンピュータの台数ではありません。

手元のパソコン 1 台の中で動いている 3 つの層
自分のパソコン
ブラウザ(Web 層)
  • http://localhost:3000 を開くと予約フォームが出る
  • index.html と script.js を読んで画面を描く
手元のサーバー(AP 層)
  • node server.js で動かしている
  • 3000 番で待って、リクエストを受け取る
データベース(DB 層)
  • reserve.db に予約と会員の記録を保存する
  • 同じパソコンの中で動いている
外枠が自分のパソコン。3 つの層が全部この 1 台の中で動いていて、層の分け方は公開したあとと変わらない。

手元で http://localhost:3000 を開いているとき、3 つの層は全部このパソコンの中にあります。

公開すると層ごとに別のサーバーに置かれることが多く、その作業は「デプロイと環境変数 — 手元で動いたものを公開するまで」の記事で扱います。

Web サーバー層が返した画面だけが利用者の端末で動き、アプリケーションサーバー層とデータベース層は公開サーバー側にあります。

データベース層を別の機械に移しても、アプリケーションサーバー層から読み書きの指示を送るという関係は変わりません。

層の数と、コンピュータの台数は別

3 つの層に分かれていても、動くコンピュータが 3 台とは限りません。

手元では 3 つとも自分のパソコンの中にあり、公開したあとは層ごとに別のサーバーに置かれることが多くなります。

QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1「同じ時間に予約が重なっていないか」を確かめる処理は、どの層に置きますか。

Q2Web サーバー層とアプリケーションサーバー層の間を通るものは何ですか。

Q3手元で http://localhost:3000 を開き、データベースも自分のパソコンで動かしているとき、3 つの層はどこにありますか。