気ままに気ままのエンジニアブログ

定期的に得た知見を気ままに発信中

書籍 "Webを支える技術" 第五部 Webサービスの設計の要点まとめ

こんにちは。

リモートワークで運動不足が顕著に表れ、この期間でちゃんと太りました。

f:id:hachimaki37:20200523100450j:plain
毎日こんなんだったらそりゃ太りますよね。
どうもハチマキです。

はじめに

先輩エンジニアから勧めてもらった「Webを支える技術 -HTTP、URI、HTML、そしてREST」を読んだのでアウトプットとして要点をまとめてみました。

今回は最終第5部のまとめになります。
1部〜4部についてもまとめておりますので、ぜひそちらもご参考にして頂ければと思います。

▼書籍はこちら
https://www.amazon.co.jp/Web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-HTTP%E3%80%81URI%E3%80%81HTML%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6REST-WEB-PRESS-plus/dp/4774142042/ref=cm_cr_arp_d_product_top?ie=UTF8

本日の概要 : Webサービスの設計について

  • どんな時にために、この書籍は読んでおくべき?(第1部をご覧ください)
  • 書籍のテーマと目的(第1部をご覧ください)
  • 書籍の構成
  • 第5部 Webサービスの設計
  • 読み取り専用のWebサービスの設計
    • リソース設計とは何か
    • リソース指向アーキテクチャのアプローチ
    • クライアントに提供するリソースの表現
  • 書き込み可能なWebサービスの設計
    • サービスの設計
    • 設計のバランス
  • リソースの設計

書籍の構成

  • 第1部 : Web概念
  • 第2部 : URI
  • 第3部 : HTTP
  • 第4部 : ハイパーメディアフォーマット
  • 第5部 : Web サービスの設計

※今回は、第5部 Web サービスの設計についてまとめております。

第5部 Web サービスの設計

WebサービスやWeb APIインターフェイスはHTTPとURIを用いてを設計・実装しますが、実はそれだけでは不十分です。
第5部では、特にリソースをどのように設計するかについて解説されております。

読み取り専用のWebサービスの設計

リソース設計とは何か
  • WebサービやWeb APIの外部設計(クライアントとサーバの間のインターフェイスの設計)
    • リソースの設計図:リソースの種類、リソースの表現、リソースの操作方法、リソースとリソースのリンク関係など
リソース指向アーキテクチャのアプローチ

アドレス可能性(最も重要な性質)、接続性、統一インターフェイス、ステートレス性の4つの性質を備えたアーキテクチャで、次のステップからなる設計手法

  • Webサービスで提供するデータを特定する
  • データをリソースに分ける
  • リソースにURIで名前をつける
  • クライアントに提供するリソースの表現を設計する
  • リンクとフォームを利用してリソース同士を結びつける
  • イベントの標準的なコースを検討する
  • エラーについて検討する
クライアントに提供するリソースの表現
  • XML表現(重要な指針は、独自フォーマットを作り出さないこと)
    • XHTML:ハイパーメディアで必要となる機能を一通り揃えている
    • Atom:リスト情報を表現するのに向いている(著者や更新日時を持たないデータには適用しづらい)
    • 独自XML
  • 軽量フォーマット表現
    • JSONJavaScriptとの相性抜群(YAMLに比べると書きづらい)
    • YAML:読みやすさ、書きやすは一番良い(ライブラリが比較的少ない)
    • CSV:表形データには最適(文字コードの扱い、エスケープ文字に難あり)
  • マルチメディア表現
    • 画像(JPEGPNG、GIF)
    • 映像(MPEG、WMV、MOV)
    • マルチページ画像(PDF、TIFF

書き込み可能なWebサービスの設計

サービスの設計
  • リソース作成
    • ファクトリリソースへPOSTする方法(リソースを作成するための特別なリソース)
    • PUTで直接作成する方法(新しく作成したいリソースのURIにリクエストを直接送る)
  • リソースの更新
    • ※バルクアップデート(PUTでリソース全体を送信する更新方法)
    • 利点:クライアントの実装が簡単になる
    • 欠点:送受信するデータが大きくなる
    • ※パーシャルアップデート(PUTでリソースの一部だけを送信する更新方法)
    • 利点:送受信するデータが少なくなる
    • 欠点:GETしたリソースの一部を修正してそのままPUTする、という使い方ができなくなる
  • リソースの削除
    • 削除したいリソースのURIにDELETEを送り、リソースを削除する(※親リソースに従属する子リソースは、親リソースの削除に伴って削除する)
  • バッチ処理
    • 大量データを処理する際は、パフォーマンスが問題になることがあるため、作成・更新したいリソースを一括で送信できるように設計する
  • トランザクション
    • 複数のリソースにまたがった変更をひとまとまりに扱う場合に発生しうる問題を防ぐように、処理が成功するか、失敗した場合は元の状態に戻すことを保証する
  • 排他制御(複数のクライアントが同時に1つのリソースを編集してコンフリクトが起きないように、1つのクライントのみが編集するように制御する処理)
    • 悲観的ロック:WebDAVのLOCK/UNLOCKメソッドを使う方法と、独自のロックリソースを使う方法がある(ユーザをあまり信用せずに、コンフリクトが発生しないようにする方法)
    • 楽観的ロック:条件付きPUTと条件付きDELETEを利用(コンフリクトが起きた時に対処する仕組み)
設計のバランス

各種のパラメータを加味して、自分が最もバランスが取れていると感じる所に落ち着かせるのが設計作業の上で重要

  • なるべく全体をシンプルに保つ
    • 設計が複雑になったら1段階メタな視点で全体を考え直す
  • 困ったらリソースに戻って考える
    • HTTPメソッドでは実現できない機能があると感じたら、それが独立した別のリソースで代替できないかを考える
  • 本当に必要ならPOSTで何でもできる
    • 実現するために必要であればPOSTを用いることが賢明

リソースの設計

関係モデルからの導出
  • データのもつ階層構造を考えることと、トップレベルリソースの存在を忘れないことが重要
    • 特徴:RDBMSの基礎となっているデータモデルであり、数学的基盤を持っている(効率的なデータベース設計が可能)
オブジェクト指向モデルから導出
情報アーキテクチャからの導出
  • 情報アーキテクチャを持つWebサイトの構築は、ほぼそのままWebサービスに適用できる
    • 特徴:要素技術を組み合わせて、情報をわかりやすく伝え、受け手が情報を探しやすくするための表現技術(比較的新しい概念)
リソース設計で最も重要なこと

主に人を相手にするかプログラムを相手にするか用途は異なるかもしれないが、両者の違いは少ないため、WebサービスとWeb APIを分けて考えないことが最も重要な考え方

                                            • -

今回は、Webを支える技術についてまとめてみました。
プログラミングというよりは、上位概念のWebサービスの設計指針を題材に書かれている一冊です。

設計に関する知識を深めたい方、設計指針を意識してアプリケーション開発に取り組みたい方などにおすすめな書籍かと思います。

以上、ハチマキでした。