SpringBoot

Spring Bootにおける DTO, Form, Entityの違い

2020-05-18 中村

概要

Spring Bootのレイヤ間でやりとりされるJava Beans (POJO)の呼び方.

ざっくり言えば以下の通りか.

PitCoin(拡張版)を例にとって説明してみる.

Entity

データベースのテーブルをそのままミラーリングしたJavaオブジェクト.

メンバにアノテーションしておくと,CRUDする際にあんじょう変換&検査してくれる.

@Data
@Entity
public class User {
    @Id
    String uid;               //ユーザID

    @NotEmpty
    String name;              //ユーザ氏名 

    @NotEmpty
    String password;          //パスワード

    @NotEmpty
    String email;             //Email

    boolean admin;            //管理者かどうか

    boolean enabled;          //有効かどうか

    @Temporal(TemporalType.TIMESTAMP)
    Date enabledAt;           //有効になった日時

    @Temporal(TemporalType.TIMESTAMP)
     Date disabledAt;          //凍結された日時

    String remark;            //注釈
}

DTO (Data Transfer Object)

様々なEntityやFormから必要なデータを集めて詰め込んで,受け渡ししやすい形にしたオブジェクト.

業務ロジックに応じて作られる.FormもDTOの一種といってよいかもしれないがDTOはフォームに限らない.

//ユーザの口座照会用 DTO
@Data
public class UserAccountDTO {
   String uid;     //ユーザID
   String name;    //ユーザ氏名
   
   int aid;        //口座番号
   int coin;       //口座残高

   List <Record> records; // 取引履歴
}

Form

Viewから受け取るユーザの入力フォームを保持するJavaオブジェクト. @Controllerのメソッドの引数(@ModelAttribute または @RequestBody)として受取り,バリデーション(@Validated)される.

一般的にメンバはすべてString.バリデーションのためのアノテーションが施される.

入力に特化したDTOとも考えられるが,数値変換する前の数字文字列や,暗号化前のパスワード等, ユーザの入力そのものを(エラー等に備えて)保持しておくために,FormとDTOは別で作ったほうが 良いらしい.

@Data
public class UserForm {
    /* ユーザID は 最大16文字.英数字,アンダーバー,ハイフンのみ許す */
   @Size(max = 16)
    @Pattern(regexp = "[0-9a-zA-Z_\\-]+")
    private String uid;

    /* 名前,パスワードは Null,空文字(""),空白のみでないことを検証*/
    @NotBlank
    private String name;

    @NotBlank
    private String password;
    
    /* RFC2822に準拠したEmailアドレスかどうか検証する */
    @Email
    private String email;
}

参考文献


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS