こちらの記事は、Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus) 山本 陽平 (著)の内容を読んで自分なりにわかりやすく要約したものです。
REST(レスト)とは何か
RESTはWebのアーキテクチャスタイルの一つです。
……と聞いてもよくわからないので、わかりやすく言い換えると「Webのシステムを設計するときの考え方(設計思想)の一つ」です。(私はこの概念を理解するのにけっこう苦労しました)
RESTという考え方は、カリフォルニア大学の大学院生だったRoy Fielding(ロイ・フィールディング)さんが2000年に博士論文として発表したものです。
彼は、「Webがなぜここまで成功したのか?なぜこれほど大規模なシステムが成立したのか?」ということを研究し、その研究結果を1つのアーキテクチャスタイルとしてまとめて発表しました。
つまり、Webが先にあって、RESTという考え方があとから研究されてまとめられた、ということですね。一般的なWebは、REST的な考え方で構成されていると言えます。
RESTは(Representational State Transfer)の略で、直訳すると「具象的な状態の転送」ですね。具象的というのは抽象的の反対の意味で、具体的な、実態のある、といった意味です。
データそのものや、状態を表すステータスなど(リソースの状態)を転送するシステムを構築するための考え方、という解釈でよいかと思います。
アーキテクチャ
アーキテクチャとは、構築方式・建築様式・設計思想(どのような思想で作られているか・どういう設計になっているか)といった意味。
アーキテクチャスタイル
アーキテクチャスタイルとは、複数のアーキテクチャ(設計思想)に共通する性質、様式、作法、流儀を指す言葉。例えばREST以外のアーキテクチャスタイルには、MVC、パイプ&フィルタ、イベントシステム、P2Pなどがあります。
リソース
RESTにおけるリソースとは、Web上のURI(URL・URN)を持ったすべての情報のことを指します。
RESTを構成する6つのアーキテクチャスタイル
RESTは以下の6つのアーキテクチャスタイルを組み合わせた複合アーキテクチャスタイルです。
アーキテクチャスタイル名 | 概要 |
---|---|
クライアント/サーバ | ユーザインタフェースと処理を分離する |
ステートレスサーバ | サーバ側でアプリケーション状態を持たない |
キャッシュ | クライアントとサーバの通信回数と量を減らす |
統一インターフェース | インタフェースを固定する |
階層化システム | システムを階層に分離する |
コードオンデマンド | プログラムをクライアントにダウンロードして実行する |
「統一/階層化/コードオンデマンド/クライアント/キャッシュ/ステートレスサーバ」(Uniform Layered Code on Demand Client Cache Stateless Server)略して、「ULCODC$SS」と呼ぶそうです。(なんて読むかわからないのでこれは覚えなくてもよさそう。)ULCODC$SSに、わかりやすいようにRESTという名称を付けた、ということです。
では、一つずつRESTを構成するアーキテクチャスタイルを見ていきます。
クライアント/サーバ
クライアントがリクエストをサーバに出して、サーバがクライアントにレスポンスを返す、というアーキテクチャスタイルのことです。
「クライアント」は、WebでいうところのPCやスマホの「ブラウザ(やアプリなど)」、「サーバ」は「Webサーバ(やDBサーバなど)」ですね。
クライアント/サーバの利点
- クライアントとサーバに処理を分離できるので、クライアントのマルチプラットフォーム化ができる。(PC・スマホ・ゲーム機などいろいろなクライアントから同じサーバ上の情報にアクセスできる)
- サーバはデータストレージとしての機能だけを提供すればよくなる。
- 複数サーバを使って冗長化することで可用性(稼働率)を上げられる。
ステートレスサーバ
この場合のステートレスとは、クライアントのアプリケーションの状態を、サーバで管理しない、ということです。
実際のWebには、Cookieを使ったセッション管理など、ステートレスではない(ステートフルである)実装も多々あります。
ステートフルな実装は、REST的には間違っている実装なのですが、あえてステートフルな実装を選択せざるを得ない状況はでてきます。そうった場合は、ステートレスサーバの利点をあえて捨てることを理解したうえで利用する必要があります。
ステートレスサーバの利点
- クライアントからのリクエストに応えた後すぐに計算機リソース(CPUやメモリ)を開放できるので、サーバ側の実装を簡略化できる
キャッシュ
キャッシュとは、一度取得したリソースをクライアント側で使いまわすことです。
ただし、古いキャッシュを利用して情報の信頼度が下がる場合があります。リソースの鮮度によって適切に再取得するなどの工夫が必要です。
キャッシュの利点
- サーバとクライアント間の通信を減らすことでネットワーク帯域の利用や処理時間を短縮してより効率的に処理できる
統一インターフェース
統一インターフェースとは、URIで示したリソースに対する操作を、統一した限定的なインターフェースで行うアーキテクチャスタイル。
例えば、HTTP1.1ではインターフェースをGETやPOSTなど8つのメソッドに限定、統一されていることにより、全体のアーキテクチャがシンプルになっています。
現在のWebが多様なクライアントやサーバの実装で構成されていることには統一インターフェースが一役買っています。
統一インターフェースの利点
- インターフェースを統一することで全体のアーキテクチャがシンプルになる。
- インターフェースを統一することで、クライアントとサーバ実装の独立性が向上する。(特定のクライアント/サーバ実装に依存しにくくなる)
- インターフェースを統一することで、システム全体が階層化しやすくなる。
階層化システム
階層化システムとは、システムをいくつかの階層に分離するアーキテクチャスタイルのことを言います。
前述の、統一インターフェースで実装を行うと、システム全体が階層化しやすくなります。
例えばWebサービスではサーバとクライアントの間にロードバランサを設置して負荷分散をしたり、プロキシを設置してアクセスを制限するなどができるようになります。これが実現できるのは、各コンポーネント間のインターフェースがHTTPで統一されているためです。
またHTTPインターフェースを持たないレガシーシステムでも、間にWebアプリケーションサーバーをはさめば、ブラウザなどのクライアントと接続できるようになります。
階層化システムの利点
- 分散化や冗長化が容易になる
- プロキシでのアクセス制限など、既存の接続の間に新しいコンポーネントを追加することが可能
コードオンデマンド
コードオンデマンドは、プログラムコードをサーバからダウンロードしてクライアント側で実行するアーキテクチャスタイルです。Javascriptや、Javaアプレットがこれにあたります。
クライアントプログラムにあらかじめ用意した機能だけでなく、ダウンロードしたプログラムをクライアント側で実行することで新しい機能を追加できるというのが主な特徴です。
半面、通信されたデータだけではアプリケーション側で何を処理しているかわかりにくくなるためネットワーク通信におけるアプリケーションプロトコルの可視性が下がるという欠点があります。
コードオンデマンドは、Fieldingさんの論文ではオプション扱いでしたが、近年のWebではその重要度は増すばかりです。
コードオンデマンドの利点
- クライアントにない機能をあとから追加できる
コードオンデマンドの欠点
- ネットワーク通信におけるアプリケーションプロトコルの可視性が下がる。(通信の情報だけではどういうアプリケーションが実行されたかがわかりにくくなる)
まとめ
以上をまとめてみます。
- RESTは、6つのアーキテクチャスタイルからなる、複合アーキテクチャスタイル(設計思想)である。
- 6つのアーキテクチャスタイル
- クライアント/サーバ
- ステートレスサーバ
- キャッシュ
- 統一インターフェース
- 階層化システム
- コードオンデマンド
WebシステムはRESTful(レストフル=REST的・RESTを十分に考慮している状態)であるかどうかをみながら設計すると、Web全体ではより良いものになる(相互に情報が利用しやすくなる)というメリットがあるので、積極的に活用していきたいですね。
参考図書
もっと詳しくRESTについて知りたい方ははこちらの書籍をおすすめします。
|
ではまた!
コメント