SpringBoot

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

2020-05-18 中村

概要

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

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

spring_layered_architecture3.png

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;            //注釈
}

Form

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

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

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

まとめると

DTO (Data Transfer Object)

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

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

以下はDTOの一例

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

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

まとめると

なんでこんなに分けてるの?

「全部Entityで処理すれば簡単」と思った貴方、私もそう思います。

全てをEntityにした場合、こんな問題が発生します。

  1. 情報の肥大化、高負荷
    • 1つのEntityに情報が数百と入っている場合、それの通信、呼び出しに時間がかかる。
    • 加えて、必要な情報が分かりにくい、処理が面倒といった問題にもつながる。
  2. 不適切なデータにアクセスできる
    • ContorollerにEntityが行くと、その中のpasswordなど秘匿されるべきデータにもアクセスできる。
    • 何かのバグで公開させる危険性もあり、あらかじめデータを制限することが必要になる。
  3. ユーザの入力が面倒
    • Entityしか使わないと、ユーザが必要な情報を全て入力しなければならない。
    • 作成日や、有効かどうかとか、IDとか...
  4. 変更に弱い
    • 仮にEntityの要素を増やすとなったとき、関連する全てを変更する必要がある。
    • DTOやFormがあれば、その部分は変更しなくてよく、変更を最小限にとどめられる
    • =>バグの可能性を下げることができる

などなど、意外とよくない点は多い。

とりあえず、以下のことを思いながら開発していくと、だんだんわかってくる

参考文献


添付ファイル: filespring_layered_architecture3.png 587件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-11-23 (木) 23:14:42