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を区別し、一意な識別子を持っていなければならない。
- 必ず1つ以上の属性が存在しなければならない。
- 永続的に存在するインスタンスの集合である。
- 必ず該当業務で必要であり、管理したい情報でなければならない。
まとめ
- DTOはレイヤー間のデータ移動に使用されるオブジェクト。
- VOは値を持つ純粋なドメイン。
- EntityはそれをDBテーブルにマッピングするオブジェクト。
