DTO、Entity、Formの違い
既存のSpringパーソナルプロジェクトではMVC構造モードを採用しており、Domain側ではDTOクラスを簡単に作成して使用するだけで、エンティティとDTOの違いが分からず、同じと考えられるため、進行時に多くの違いがある.
これからは、クラスを明確に区別して作成する必要があります.
小異
Entityクラスは、実際のDataBaseのテーブルと1:1にマッピングされます.
属性(フィールド)としてDBの表に存在する列のみを使用できます.
Entityクラスは継承や実装ではなく、テーブルに存在しないカラムではありません.
Entityクラスのgetterメソッドをできるだけ多くの外部で使用するのではなく、クラスに必要な論理メソッド(ドメインLogicのみ)を実装する必要があります.
EntityとDTOを別々に管理する必要があるのは、DBとViewの役割を徹底的に分離するためです.
Entityクラスは実際のテーブルにマッピングされ、変更すると他のクラスに影響します.
DTOクラスはViewと通信し、頻繁に変更されるため、分離する必要があります.(Entityクラス保護)
ドメインモデルの純粋性を維持するために、DTOはドメインモデルオブジェクトを保持してコピーし、異なるPresentation Logicを追加します.
DTO(Data Transfer Object)
データ転送オブジェクト(DTO)は、データ転送(移動)オブジェクトを表す
DTOは主に非同期処理に用いられる
DTOは、各階層間でデータを交換するためのオブジェクト(Java Bean)である
(View <- (DTO) -> Controller <- (DTO) -> Service)
Javaは、レプリケーション・テクノロジーを使用して、異なるフレームワークでデータを自動的に処理します.
データ自動化処理において最も重要なのは標準規格である.
たとえば、最上位DTOでpropertyがname、city、street、zipcodeである場合、name、city、street、zipcodeのキー値で入力されたデータは、レプリケーション・メソッドでsetterを実行してデータを入れることができます.
これは、データをLayer(特にサーバ->View)に転送するときにDTOを使用する理由です.
ビュー内のフォームがnameフィールド値をPropertyに渡すと、名前属性の名前と各値以外のPropertyではなくDTOが自動的にインスタンス化され、PersonDTO値をデータ形式で受信できます.
Value Object(バリューオブジェクト)は、名前の通り値オブジェクトです.
VOは不変のデータオブジェクトを表す
読み取りのみ、getterのみ
VODTOとDTOの違い
1つは、オブジェクトの不変性(オブジェクトの情報が一定に保たれる)を保証することである.つまり、設定値を変更することはできません
(Setter(X))
もう1つの方法は、equals()とhashCode()を再定義することによって、各オブジェクトの同一性を決定することである.
VOが必要な場合は?データは不変でなければなりません. は格納された値でなければなりません.
DTO vs VO
DTOデータ転送用のオブジェクトのみ
VOオブジェクト自体を「値」(Value)として使用する
(外部システムとデータ通信を行う場合はDTOをDTOと定義し、データベース内のデータをVOと定義して使用する)
DTOの目的自体がデータの伝達であるため、読み書きが可変である
VOには不変性と読み取り専用属性がある
注意:https://dev-coco.tistory.com/87
これからは、クラスを明確に区別して作成する必要があります.
小異
DTO : 데이터 전송 객체, 데이터를 전달하는 목적으로만 사용, 주로 로직은 없고 단순 @Getter, @Setter만 존재
Form : Http API, HTML Form 데이터를 전달받고, 또 HTML Form에 전달하는 목적으로 사용되는 객체
Entity : 핵심 비즈니스 도메인이고, JPA에서는 데이터베이스 테이블과 ORM 매핑되어 있는 객체
Entity(最中心クラス)
Entityクラスは、実際のDataBaseのテーブルと1:1にマッピングされます.
属性(フィールド)としてDBの表に存在する列のみを使用できます.
Entityクラスは継承や実装ではなく、テーブルに存在しないカラムではありません.
Entityクラスのgetterメソッドをできるだけ多くの外部で使用するのではなく、クラスに必要な論理メソッド(ドメインLogicのみ)を実装する必要があります.
なぜEntityとDTOクラスを分離するのか
EntityとDTOを別々に管理する必要があるのは、DBとViewの役割を徹底的に分離するためです.
Entityクラスは実際のテーブルにマッピングされ、変更すると他のクラスに影響します.
DTOクラスはViewと通信し、頻繁に変更されるため、分離する必要があります.(Entityクラス保護)
ドメインモデルの純粋性を維持するために、DTOはドメインモデルオブジェクトを保持してコピーし、異なるPresentation Logicを追加します.
DTO === copy(Domain Model) + Persentation Logic
ドメインモデルオブジェクトはPersistentにのみ使用されますDTO(Data Transfer Object)
データ転送オブジェクト(DTO)は、データ転送(移動)オブジェクトを表す
DTOは主に非同期処理に用いられる
DTOは、各階層間でデータを交換するためのオブジェクト(Java Bean)である
(View <- (DTO) -> Controller <- (DTO) -> Service)
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotEmpty;
@Getter
@Setter
public class MemberForm { //화면을 처리하기 위한 로직이 있는 DTO, FORM 객체
@NotEmpty(message="회원 이름은 필수 이름이다.")
private String name;
@NotEmpty(message="사는 도시를 입력해주세요.")
private String city;
private String street;
private String zipcode;
}
上のクラスから見るとgetter/setterが存在します.Javaは、レプリケーション・テクノロジーを使用して、異なるフレームワークでデータを自動的に処理します.
データ自動化処理において最も重要なのは標準規格である.
たとえば、最上位DTOでpropertyがname、city、street、zipcodeである場合、name、city、street、zipcodeのキー値で入力されたデータは、レプリケーション・メソッドでsetterを実行してデータを入れることができます.
これは、データをLayer(特にサーバ->View)に転送するときにDTOを使用する理由です.
ビュー内のフォームがnameフィールド値をPropertyに渡すと、名前属性の名前と各値以外のPropertyではなくDTOが自動的にインスタンス化され、PersonDTO値をデータ形式で受信できます.
VO(Value Object)
Value Object(バリューオブジェクト)は、名前の通り値オブジェクトです.
VOは不変のデータオブジェクトを表す
読み取りのみ、getterのみ
VODTOとDTOの違い
1つは、オブジェクトの不変性(オブジェクトの情報が一定に保たれる)を保証することである.つまり、設定値を変更することはできません
(Setter(X))
もう1つの方法は、equals()とhashCode()を再定義することによって、各オブジェクトの同一性を決定することである.
VOが必要な場合は?
DTO vs VO
DTOデータ転送用のオブジェクトのみ
VOオブジェクト自体を「値」(Value)として使用する
(外部システムとデータ通信を行う場合はDTOをDTOと定義し、データベース内のデータをVOと定義して使用する)
DTOの目的自体がデータの伝達であるため、読み書きが可変である
VOには不変性と読み取り専用属性がある
注意:https://dev-coco.tistory.com/87
Reference
この問題について(DTO、Entity、Formの違い), 我々は、より多くの情報をここで見つけました https://velog.io/@tjdrhd1207/DTO-Entity-Form의-차이-il3i5m9jテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol