RESTful API データモデリング

RESTful APIデータモデリングにおけるエンティティと値オブジェクト:違いと設計への影響

Tags: データモデリング, RESTful API, DDD, エンティティ, 値オブジェクト, API設計

RESTful APIの設計において、どのようなデータをどのように表現するかは、APIの使いやすさ、保守性、そして将来的な拡張性に大きく影響します。特に、ドメイン駆動設計(DDD)の概念である「エンティティ」と「値オブジェクト」は、APIのデータモデリングを考える上で非常に重要な視点を提供してくれます。

これらの概念は、データベース設計やバックエンドのドメインモデルでは馴染みがあるかもしれませんが、それをAPIという外部とのインターフェースにどう落とし込むかで迷うことがあるかもしれません。

この記事では、エンティティと値オブジェクトの基本的な違いを改めて確認し、それがRESTful APIのデータモデリングにどのような影響を与えるのか、具体的な設計例を通して解説します。

エンティティとは何か?

エンティティは、ドメインの中で「識別子」によって区別される対象です。たとえ属性(プロパティ)が全く同じであっても、識別子が異なれば別のエンティティとして扱われます。

例えば、「顧客」や「商品」、「注文」などは典型的なエンティティです。顧客Aさんと顧客Bさんは、名前や住所が同じでも、顧客IDが異なれば全く別の存在です。

RESTful APIにおいては、エンティティは通常、独立したリソースとして表現されることが多いです。

例:/customers/{customerId}/products/{productId}

値オブジェクトとは何か?

値オブジェクトは、その「属性値の組み合わせ」によって識別される対象です。識別子を持たず、その意味や等価性は属性値そのものによって決まります。属性値がすべて同じであれば、それらは同じ値オブジェクトとみなされます。

例えば、「住所」、「金額」、「期間」などは典型的な値オブジェクトとして捉えることができます。住所「東京都渋谷区」は、どの顧客の住所であっても、その文字列の組み合わせが同じであれば同じ「東京都渋谷区」という値です。

RESTful APIにおいては、値オブジェクトは通常、エンティティリソースの属性としてインラインで表現されることが多いです。

例:顧客リソースの一部として住所データを含める

{
  "id": "customer-123",
  "name": "山田 太郎",
  "email": "taro.yamada@example.com",
  "address": {
    "street": "渋谷1-2-3",
    "city": "東京都",
    "prefecture": "東京都",
    "postalCode": "150-0002"
  }
}

上記の例では、addressは識別子を持たず、その構成要素であるstreet, cityなどの値の組み合わせによって意味を持つため、値オブジェクトとして表現されています。

APIデータモデリングへの影響と設計判断

エンティティと値オブジェクトの違いを理解することは、APIリソースの粒度や構造を決定する上で重要です。

基本的な考え方

具体的な設計例と判断のポイント

例1:ユーザーと住所

例2:注文と注文項目

例3:金額や通貨

金額や通貨は、属性の集合(金額の値と通貨単位)として意味を持ち、通常は不変であるため、典型的な値オブジェクトです。

GET /products/{productId}

{
  "id": "prod-aaa",
  "name": "商品A",
  "description": "良い商品です",
  "price": { // 金額を値オブジェクトとして表現
    "amount": 1000,
    "currency": "JPY"
  },
  "stock": 50
}

金額を独立したリソースとして設計することは稀です。なぜなら、金額自体に独立したライフサイクルはなく、常に何らかのエンティティ(商品、注文、支払いなど)の属性として存在するからです。

設計上の考慮事項とアンチパターン

まとめ

RESTful APIのデータモデリングにおいて、エンティティと値オブジェクトの概念を理解し、適切に使い分けることは、以下の点で重要です。

すべてのケースで明確な答えがあるわけではありませんが、「独立したライフサイクルが必要か?」「他のエンティティから参照されるか?」「属性の集合として意味を持つか?」といった問いを立てながら、エンティティとして独立させるか、値オブジェクトとして属性に含めるかを判断していくことが、質の高いAPI設計につながります。

チーム内でこれらの概念に対する共通理解を持ち、設計の基準を設けることも、一貫性のあるAPI開発を進める上で非常に重要です。