DTO、Entity、Formの違い


既存のSpringパーソナルプロジェクトではMVC構造モードを採用しており、Domain側ではDTOクラスを簡単に作成して使用するだけで、エンティティとDTOの違いが分からず、同じと考えられるため、進行時に多くの違いがある.
これからは、クラスを明確に区別して作成する必要があります.
小異
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