DTO、VO、Entity

DTO(Data Transfer Object)とは?

  • データ転送(移動)オブジェクトという意味を持つ。
  • レイヤー間でデータを交換するためのオブジェクト(Java Beans)である。
    • DBから取得したデータをServiceやControllerなどへ送るときに使用するオブジェクトを指す。
    • ロジックを持たない純粋なデータオブジェクトであり、GetterとSetterメソッドだけを持つ。

VO(Value Object)とは?

  • VO(Value Object)は文字どおり値オブジェクトという意味を持つ。
  • オブジェクトの不変性(オブジェクトの情報が変更されないこと)を保証する。
    • Getterメソッドだけを持つことができる。
    • 値はコンストラクタで設定でき、このときBuilderパターンを使うと便利である。
  • 名前が異なるVOインスタンスであっても、すべての属性値が同じなら、2つのインスタンスは同じオブジェクトだと言える。
    • そのため、VOではObjectクラスのequals()hashcode()をオーバーライドする必要がある。
  • VO内部で宣言された属性(フィールド)のすべての値がVOオブジェクトごとに同じであって初めて、同一のオブジェクトと判定する。
  • テーブル内の属性以外に追加の属性を持つことができる。
  • 複数のテーブル(A、B、C)に対する共通属性を集めたBaseVOクラスを継承して使うこともできる。

Entityとは?

  • 実際のDBテーブルにマッピングされるオブジェクトである。
  • データの集合を意味する。
  • 保存され、管理されるべきデータである。
  • 概念、場所、出来事などを指す。
  • 有形または無形の対象を指す。
  • IDによって各Entityを区別し、一意な識別子を持っていなければならない。
    • ID、会員番号など。
  • 必ず1つ以上の属性が存在しなければならない。
    • 名前、住所など。
  • 永続的に存在するインスタンスの集合である。
  • 必ず該当業務で必要であり、管理したい情報でなければならない。

まとめ

  • DTOはレイヤー間のデータ移動に使用されるオブジェクト。
  • VOは値を持つ純粋なドメイン。
  • EntityはそれをDBテーブルにマッピングするオブジェクト。

レイヤー間の区分