entity, dto, formの違いを理解する

Java

私がSpringBootを教えていて、頻繁に質問されるのがこちらです。
本記事は、Javaで使用される「entity」「dto」「form」それぞれの役割を説明し、違いを理解していただくための投稿です。

いきなり結論

クールに結論から入ります。

「entity」「dto」「form」は、いずれも class として作成され、class の中身(記述すべき内容)はすべて同じです。
異なるのは、それぞれの役割です。

「entity」「dto」「form」の中身

具体的には、

  • メンバ変数(フィールド)を宣言する
  • それぞれのアクセッサ・メソッド(getter / setter)を定義する
  • 場合によってはコンストラクタを作成する

基本的にこれだけです。

このような作りの class を、Javaでは「Bean」(ビーン)と呼びます。日本語に訳すと「豆」ですね。

元々、「Java」という言語名の由来が「Java Coffee」(ジャワ・コーヒー)なので、その部品となる小classをコーヒー豆に例えて「Bean」としたのではないでしょうか(※ 由来には諸説あり)。

「entity」「dto」「form」それぞれの役割

  • entity
    • データベースのテーブルに挿入(あるいは更新)するデータを保持する
    • データベースのテーブルから抽出したデータを保持する
  • form
    • Webのフロントエンド(HTML、JavaScript)から送信されたデータを保持する
  • dto
    • form から entity にデータを入れなおす際の中継データ (*1) を保持する
    • 複数テーブルを結合した結果を保持 (*2) するために使用されるケースもある

「dto」が最も分かりづらいかと思いますので、以下に補足します。

*1:
フロントから送信されたデータ(form)をデータベース・テーブルに登録しようとした時、何らかのデータ変換が必要な場合があります。

*2:
複数テーブルを結合して得られた結果を entity に入れてしまうと、「entity はデータベース・テーブルの1レコードの実体」という一貫性を失うことになるため、「dto」が使用される場合があります。

「entity」「dto」「form」それぞれの特徴

  • entity
    • entity は対象のテーブルと同名にする。ただし、命名規則には準じること。
      例:DBテーブル名が「order_history」ならば、entity名は「OrderHistory」
    • ORマッパーに「MyBatis」を使う場合はDomainと呼ばれる
  • form
    • 主に、HTMLで作成された<form>タグによって送信されるデータが対象となります。
      「POST」「GET」いずれの http メソッドでの送信も受け取れます。
  • dto
    • Data Transfer Objectの略。データ転送を目的としたオブジェクトを保持する「なんでも屋」

記事まとめ

中身も構成も同じなので、わざわざ3種類に分けているのは人間(プログラマ)側の都合のためです。

システムの規模が大きくなってくると、class が役割に応じた各パッケージに分けられていることで、目的の class を見つけやすくもなりますし、前述のような formとentity 間で変換が必要な場合も、dto がいることでロジックを分離することもできます。

逆に言えば、小規模なシステムでは分けるメリットをほとんど感じられないということになります。


それでは今回も、最後までお読みいただき、ありがとうございます。

本記事についての質問、誤りの指摘、ご意見ご感想などありましたら、ぜひコメント頂ければ幸いです。

コメント

タイトルとURLをコピーしました