はじめてのDDD part4.2 ~ヘキサゴナルアーキテクチャについて ver.2~

# はじめに
前回のpart4.1では、DIPとヘキサゴナルアーキテクチャの概要について紹介しました。前回でも書いたように、今回の記事ではヘキサゴナルアーキテクチャについてさらに詳しく説明していきます。
では、始めていきます。

# ヘキサゴナルでのサービス指向のアプローチ
ヘキサゴナルアーキテクチャを生み出したチーム（SaaSOvationチーム）は、それ以前のレガシーなコラボレーションツールからの移行するためのサービスを作成するにあたり、ESB Muleという製品を導入しました。

:::note info
<strong>ESB（エンタープライズサービスバス）とは</strong>
異なるアプリケーション間のリアルタイムのデータ交換をサポートするソフトウェアアーキテクチャパターンのこと。アプリケーションは関連データを ESB に渡し、ESB はそのデータを変換して、それを必要とする他のアプリケーションに転送する。
また、SOA（後述）の機能も搭載されている。
:::

### SOA（サービス指向アーキテクチャ）の導入
SOAは「Service Oriented Architecture」の略称です。ソフトウェアをサービスとして連携させ、システム全体を構築していきます。DDDの戦略的なビジネスサービスに従いつつ、連携内容に応じてSOAのサービス設計原則も意識しておくとよいとされています。
また、SOAでの設計原則として、Ed Thomasさんは以下の８つを挙げています。
<dl>
<dt>1,標準化
<dd>サービスの説明を契約（インターフェース）で示す
<dt>2,疎結合性
<dd>依存関係を減らし、サービス自身の依存情報を認識する
<dt>3,抽象性
<dd>契約（インターフェース）の公開だけで、内部実装は見せない
<dt>4,構成可能性
<dd>粒度の大きい（ひとつのサービスが幅広い機能やロジックを含む、まとまりの大きな単位で設計されている）サービスに組み込み可能で、制限がない
<dt>5,自立性
<dd>サービスが一貫性と信頼性を持ち、独立して成立する
<dt>6,ステートレス性
<dd>サービスの利用者側で状態を管理する
<dt>7,発見可能性
<dd>サービスの情報をメタデータで記述し、他から発見できる
<dt>8,再利用性
<dd>他のサービスからも再利用できる。粒度のより粗いサービスの作成に利用できる
</dl>

:::note warn
ブラウザで「SOA　設計原則」と調べると、今回紹介したような８つのものや１０個のものなどいろいろ出てきますが、本質的にはどれも同じようなものです。（おそらく）
:::
サービス設計の指針としては、ビジネス戦略を示す「ビジネスサービス」とREST（後述）／メッセージ型といった「技術的サービス」の両面を意識します。さらにDDDでは「ユビキタス言語」や「境界づけられたコンテキスト」が不自然に分断されていないかをチェックすることで、より良いサービスを公開できます。

# ヘキサゴナルで使用されるREST
DDDでWebサービスを構築するときによく利用される技術がRESTです。
RESTとは、（Representational State Transfer）の略で、これを直訳すると
このRESTに従ったサービスを「RESTful」と呼びます。以下の画像が特徴をわかりやすく解説しているので見てください。
![スクリーンショット 2024-11-07 095116.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817741/af8f0371-c91f-9fa1-4bda-44a57a89fbfd.png)
この画像のないで述べられている４つのポイントについてそれぞれを詳しく解説します。
<dl>
<dt>一位なURLでリソースを公開
<dd>URIとは、「Uniform Resource Identifier」の略語であり、その訳の通りに提供する「リソース」を統一された（一意な）アドレスで表現することができます。<br>
ここでいう「リソース」とは、手一驚するサービスの顧客やプロダクト、検索結果などを示します。
<dt>ステートレスな通信
<dd>「ステートレスな通信」とは、セッションの状態を保持せず、各リクエストを独立して処理する通信方法で、これと対照的なものとして「ステートフルな通信」があります。前回リクエストの状態などを記憶しないため、各メッセージにはそのリクエストを処理するために必要な情報がすべて含まれています。
<dt>GET、POST、PUT、DELETEといった標準化された命令体系
<dd>RESTでは「GET（取得）」「POST（登録）」「PUT（登録または更新）」「DELETE（削除）」等のHTTPメソッドを用いてリソースを操作できます。これらの命令は標準的な振る舞いが決まっており、変更を伴わない安全な操作で、同じ処理を何回呼び出しても結果が変わらなず、問題も発生しない「冪（べき）等性」があります。
<dt>ハイパーメディアによるリソース連携
<dd>ハイパーメディアとは、簡単にいえばハイパーテキストの拡張版です。<br>まず、ハイパーテキストは、文書内に他の文書への参照を埋め込み、複数の文書を相互に結びつけたものです。次に、ハイパーメディアとは、マルチメディア要素でネットワークを構築するもので、ハイパーテキストと異なりテキスト要素に限定されるものではありません。<br>
RESTでは、ハイパーメディアを用いて、レスポンスの中に他のリソース情報を埋め込むことができます。
<dl>

### DDDでRESTの導入
RESTは疎結合で理解しやすい仕組みであるため、スケーラブルな（サービス利用後にその利用規模を増減させることができる）サービスの提供にも適しています。そのため、DDDのヘキサゴナルアーキテクチャとの相性も良いとされています。
なお、RESTで公開するインターフェースは、コアドメインをそのまま公開するのではなく、公開用の独自モデルを設計するか、ical(一般的なカレンダー形式)のようなメディア対応を使用することが推奨されています。

# おわりに
今回の記事では、ヘキサゴナルアーキテクチャについてより深く解説しました。次回はコマンドクエリ責務分離（CQRS）について解説します。
では、最後までお読みいただきありがとうございました。次回もよろしくお願いします。

### 参考
[「実践ドメイン駆動設計」から学ぶDDDの実装入門/青木 淳夫](https://www.amazon.co.jp/%E3%80%8C%E5%AE%9F%E8%B7%B5%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E3%80%8D%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6DDD%E3%81%AE%E5%AE%9F%E8%A3%85%E5%85%A5%E9%96%80-CodeZine-Digital-First-%E9%9D%92%E6%9C%A8/dp/4798161500/ref=tmm_hrd_swatch_0?_encoding=UTF8&sr=8-1)

[実践DDD本 第4章「アーキテクチャ」 ～レイヤからヘキサゴナルへ～](https://codezine.jp/article/detail/9922)

[ESB (エンタープライズサービスバス) とは何ですか?/AWS](https://aws.amazon.com/jp/what-is/enterprise-service-bus/)

[WEBの基本入門　 ステートフル vs ステートレス、リクエストとレスポンス、クッキー、プロトコル、ポート番号について](https://qiita.com/ooyy0121/items/ba1dc0b63f30625a1381)