Web Application & Software Architecture 101 ~ ①N層のソフトウェア アーキテクチャ

今回はeducativeのWeb Application & Software Architecture 101という講座を受けたのでその内容についてまとめていきます.これは現在のWebアプリケーションがどのような設計で成り立っているかを概念レベル(コードレベルではない)で説明されてい講座です.なのでWebアプリケーションの設計について学びはじめの方やWebアプリケーションの設計の全体像を知りたいという方にぴったりの講座です. 第1回目の今回は層によるソフトウェアアーキテクチャの分類を紹介します.現在のソフトウェア 特にWebアプリケーションは多重の層のような構成になっています.そもそもここで指す層とは何か?なぜ多重の層のような構成になったのか?も含めて解説していきます.

層(Tier)とは?

アプリケーションによる層とは,アプリケーションやサービスのコンポーネントの論理的な分離のことです.コンポーネントとはデータベースやバックエンドアプリケーションサーバー,キャッシュサーバー,ユーザーインターフェースなどを指します.このようなコード内ではなく物理的な分離のようなイメージです. 本講座ではコード内の分離をLayerと表現し明確に区別していました.Clean Architectureの層はLayerでありTierではないようです(今回のブログの層はTierを指します). ここからはなぜ1層のアプリケーションから複数のN層アーキテククチャになって行ったかを含めそれぞれについて説明します.

1層のアーキテクチャ

1層のアーキテクチャは1つのマシンに全てのコンポーネント(ユーザインターフェース,ビジネスロジック,データベース)が含まれるアーキテクチャです.以下のようなイメージです.

f:id:harada-777:20200727203834p:plain:w500

1層のアプリケーションにはそれぞれ以下のようなメリットデメリットがあります.

メリット
  • 通信する必要がない
    • セキュリティーの安全性が高い
    • ネットワークによる遅延がない
デメリット
  • パフォーマンスがマシンに依存する
  • UIがマシンに依存する
  • ユーザーがアップデートしない限りアップデートされない

通信をする必要がないというのがやはり大きなメリットです.しかしその分アプリケーションを起動しているマシンの性能への依存度が高くなってしまいます..

2層のアーキテクチャ

2層のアプリケーションはクライアントとサーバー(データベース)からなるアプリーケーションです.このアプリケーションではクライアンど側のアプリケーションにロジックがあり,データの保存や呼び出しを外側のサーバー(DB)を呼び出して行います.イメージは以下の通りです. なぜ1層のアプリケーションではなく2層にする必要があったのでしょうか?それには以下の理由が挙げられます. - 複数のデバイスとデータを共有できる - 大量のデータをクライアントに保存しなくて済む

f:id:harada-777:20200727203839p:plain:w500

複数のデバイスとタスクを共有すると言ったニーズやゲームアプリなどの大量のデータの保存を必要したいというニーズに答える為に2層のアプリケーションが生まれたようです.2層のアプリケーションでは最低限の通信であり,そこまで遅延を気にしなくて済みます.しかしセキュリティ面を気にする必要があり,あまり重要でないデータを扱うアプリでの使用を推奨されていました(タスク管理,ゲームアプリなど).

3層のアーキテクチャ

3層のアプリケーションはユーザーインターフェース,バックエンドサーバー,データベースの3コンポーネントからなるアーキテクチャです.バックエンドサーバーにロジックが移りユーザーインターフェースのアプリケーションがシンプルになったイメージです.

f:id:harada-777:20200727203844p:plain:w600

ブログなど現状のWebアプリケーションの多くがこの3層アーキテクチャで実装されています.

N層のアーキテクチャ

N層のアーキテクチャはここでは3層より多くの層から成るアーキテクチャを指します.このN層アーキテクチャはFacbookやInstagramAirbnbなど大規模なアプリケーションに採用されています. N層アプリケーションを構成するコンポーネントには以下のようなものがあります. - ユーザーインターフェース - バックエンドサーバー - キャッシュサーバー - ロードバランサー - リクエストを複数のサーバーに分散させる役割を持つ - 検索用サーバー

f:id:harada-777:20200727203849p:plain:w600

なぜこのように多階層にする必要があったか?それはよりアプリケーションを機能拡張に柔軟な状態にしたかったからです.そしてこれを実現するための原則として単一責任の原則とうものがあり,N層アーキテクチャは複数のに層することでこれを守ろうとしています. 単一責任の原則とはあるコンポーネントには1つの役割だけを与えるという原則です.言い換えると1つのコンポーネントを変更する理由は1つだけにするようにコンポーネントを作るということです.こうすることでコンポーネントの再利用性や拡張性が高まります. 例えばログイン機能を持つコンポーネントを分離しておくと,スマホアプリやWebアプリからの両方からそのログインコンポーネントを使えます.さらに他のデータの保存を担当するコンポーネントはログインに関して気にしなくて済みます.そしてもしログインに関することを修正したければこのログイン用のコンポーネントを修正すればいいとすぐにわかります. このように1つのコンポーネントに1つの役割だげを持たせる構成にする為にN層のアーキテクチャが採用されるようになりました. ただN層のアーキテクチャは通信が大量に発生するのでネットワークの遅延や,セキュリティの問題など他に考慮すべき点は発生します.

感想

今の世の中だと複数の層から成るアプリケーションが割と普通になっており,なぜ1層じゃダメなんだっけ?と考えたことがなかったので今回その背景をより詳しく理解することができました.また少ない層はそれはそれでメリットがあるということを改めて認識することができました.