Web技術の基本 ~Webアプリケーションの構造~

# はじめに
- 新卒で入社をさせていただいた会社の課題図書で[Web技術の基本](https://www.amazon.co.jp/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E5%9B%B3%E8%A7%A3%E5%BC%8F-%E3%81%93%E3%81%AE%E4%B8%80%E5%86%8A%E3%81%A7%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8BWeb%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%B0%8F%E6%9E%97-%E6%81%AD%E5%B9%B3-ebook/dp/B06XNMMC9S)を読むこととなったので、そのアウトプットとして、本記事を書いています。
- 本記事が僕と同じような駆け出しエンジニアさんのお役に立てれば幸いです。

# Webアプリケーションの3層構造
Webアプリケーションはユーザインターフェースとなる**プレゼンテーション層**、業務処置を行う**アプリケーション層**、データ処理や保管を行う**データ層**の3層構造となっている。

- **プレゼンテーション層**はWebブラウザ(ChromeやFirefoxなど)とWebサーバーが役割を担う。
- **アプリケーション層**はアプリケーションサーバー(APサーバー)が役割を担う。
- **データ層**はデータベースサーバー(DBサーバー)が役割を担う。

![Webアプリケーション3層アーキテクチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328873/26f02d66-e8a5-3d36-357d-8bb8bbfd2a0c.png)

## 3層構造にするメリット

1. 負荷分散
  - 1つのサーバーに3層全ての役割を実装することは可能だが、アクセス数の増加や複雑な処理を実装すると各層への負荷が高くなるため、システムの規模が大きくなると各サーバー機器の特性に合わせた役割を与えることが一般的である。

2. 改修範囲の限定
  - アプリケーションの改修が必要となった場合、層別に分かれていることで改修範囲を限定できるというメリットがある。
  - プレゼンテーション層の改修が発生した場合はアプリケーション層やデータ層には影響を及ぼさないため改修コストを抑えることができる。

# MVCモデル
- Mは**Model**でアプリケーションの扱うデータと業務処理を指す。
- Vは**View**でユーザーへの出力処理を指す。
- Cは**Controller**で必要な処理をModelやViewに伝える役割を担う。

## 3層アーキテクチャとMVCモデルの相違点
- 3層アーキテクチャはWebシステム全体の設計思想のこと。
- MVCモデルはサーバーサイド・スクリプトの設計思想のこと。

![MVCモデル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328873/97680a65-adef-5cd5-d3fe-f5c2458117d2.png)

## MVCモデルのメリット
1. 開発や改修の分業が容易になる。
  - 3層アーキテクチャのように各要素が分離されているため、仕様変更が別の要素へ影響を及ぼさない。
2. 表示を変更したいときはView、処理を変更したい場合はModelと行ったように改修範囲が特定しやすい。

# Webサーバーの役割
- Webサーバーの役割は静的ページのデータやAPサーバーから転送された動的ページのデータをWebクライアントに転送すること。

![Webサーバ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328873/85e0f597-a7f9-3840-986c-5b1480f6149c.png)

## 主なWebサーバー
| Webサーバー名| 説明 |
|:-----------------|:-----------------|
| Apache HTTP Server  | 世界中でもっとも多く使われているWebサーバソフトウェアであり、大規模な商用サイトから自宅サーバまで幅広く利用されている。単にApacheとも称されている。             |
| nginx(エンジンエックス)|静的コンテンツ（つまりサーバ上のファイル）を高速に配信するように設計されている。|
| IIS| Microsoft Windowsの標準Webサーバ。|

# アプリケーションサーバーの役割
- **アプリケーションサーバー**は業務処理を行うプログラム。
    - Webサーバーから送られてきたユーザーからのデータを受け取り、サーバーサイド・プログラムを実行することでそのデータを加工したり、DB(データベース)のデータを検索・加工した後、Webサーバーにレスポンスを返す。

![Webアプリケーション3層アーキテクチャ (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328873/68a724a9-c7e0-7972-a2bc-57afe4544793.png)

## 主なアプリケーションサーバー
- Rubyであれば、**Puma**や**Unicorn**。
- Javaであれば、**Tomcat**。
- PHPの場合はアプリケーションサーバーを使う必要がない。
    - Apacheのモジュールを使用することでアプリケーションサーバーのような仕組みを導入できる。
    - もしくはFastCGIを通してPHPを実行する。

# データベースサーバーの役割
- データベースサーバーの役割はアプリケーションサーバーからの要求に従って処理を行い、結果をアプリケーションサーバーに返却すること。

![DBサーバー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328873/9372e2e1-2cee-0b4d-3737-e0d454ae45e9.png)

## 主なデータベースサーバー
データベースサーバーは大きく分けて**RDBMS**と**NoSQL**の2つが存在する。

### RDBMS
RDBMS(Relational DataBase Management System)では**データやデータ間の関連を2次元の表で表す**。

**代表的なRDBMS**

| 名称 | 概要 | 有償/無償 |
|-----------------|------------------------------------------------------------------------|-----------------|
| Oracle Database | Oracle Databaseは世界初の商用RDBMSであり、大型コンピュータからパーソナルコンピュータまで、幅広いプラットフォームをサポートしている。| 有償 |
| MySQL |MySQLは、オープンソースのリレーショナルデータベース管理システムである。その名前は、共同設立者のMichael Wideniusの娘の名前である「My」と、Structured Query Languageの略称である「SQL」を組み合わせたものである。| 無償 |
| PostgreSQL | PostgreSQLはオープンソースのオブジェクト関係データベース管理システム(ORDBMS)である。「Postgres」や「ポスグレ」と呼ばれることも多い。| 無償 |

### NoSQL
**RDBMS**以外のデータベースのこと。

**代表的なNoSQL**

| 名称 | 概要 | 有償/無償 |
|-----------------|------------------------------------------------------------------------|-----------------|
| MongoDB | RDBMSのようにレコードをテーブルに格納するのではなく、「ドキュメント」と呼ばれる構造的データをJSONライクな形式で表現し、そのドキュメントの集合を「コレクション」として管理する（このデータの物理的な格納はBSONと呼ばれるJSONのバイナリ版といえる形式で行われる）。| 無償 |
| Redis |Redisは、ネットワーク接続された永続化可能なインメモリデータベース。連想配列（キー・バリュー）、リスト、セットなどのデータ構造を扱える。| 無償 |

# 参考記事一覧
- [【初心者向け解説】Webサーバーとは？ & Webコンテナとは？](https://eng-entrance.com/java-servlet-server)
- [nginx Wikipedia](https://ja.wikipedia.org/wiki/Nginx)
- [Apache HTTP Server Wikipedia](https://ja.wikipedia.org/wiki/Apache_HTTP_Server)
- [nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する](https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc)
- [Oracle Database Wikipedia](https://ja.wikipedia.org/wiki/Oracle_Database)
- [MySQL Wikipedia](https://ja.wikipedia.org/wiki/MySQL)
- [PostgreSQL Wikipedia](https://ja.wikipedia.org/wiki/PostgreSQL)
- [MongoDB Wikipedia](https://ja.wikipedia.org/wiki/MongoDB)
- [Redis Wikipedia](https://ja.wikipedia.org/wiki/Redis)