Open3

(Java)DTOクラスとは?どう実装すれば良いのか?

ふじしろふじしろ

DTOクラスとは?

DTO(Data Transfer Object)は、
エンティティの中から必要な値だけを取得したクラス。

DBに重要な情報が保存されている場合、取得したエンティティをそのままユーザーに全て渡すと、それらの情報まで見られてしまう。
かといって、状況に応じてエンティティからいちいち削除するような処理は非常に手間だし、実装ミスの原因になる。さらに、渡すデータに変更が加わった際に、全て手作業で確認することになる。
そこで出てくるのがDTO。
DTOというクラスを作成し、あらかじめ必要なデータだけをエンティティから取得するようにしておけば、そのDTOをユーザーに渡すだけで済む。
そして保守も簡単になる。

参考になった記事

ふじしろふじしろ

DTOの実装方法(自分の場合)

  1. DTOクラスを定義する
    1. フィールドはそのDTOでユーザーへ渡したいデータにする
  2. DTOクラスにofメソッドを作成する
    1. このメソッドは、エンティティをDTOに変換するメソッド
  3. コントローラまたはサービスでofメソッドを呼び出して活用する。
    1. サービスのメソッドでDTOに変換すると、サービス内でのメソッドの使い回しがやりにくくなるので、個人的にはレスポンスの直前であるコントローラの方がいいんじゃないかと思う

参考

ふじしろふじしろ

ChatGPT相談

Q: DTOとは何か一言で解説

DTO(Data Transfer Object)は、異なるシステムやプログラム間でデータを転送するためのオブジェクト(コンテナ)です。

Q: DTOはロジックを持つべきか一言で解説

DTOは基本的にロジックを持たず、データの転送のみを目的とするべきです。

Q: であればDTOのクラスのプロパティ値はプリミティブ値で持つのが妥当である。この意見の妥当性を10段階で評価

プロパティ値をプリミティブ値で持つことの妥当性は、用途やコンテキストによりますが、一般的にはDTOの目的がシンプルなデータの転送に限定されることを考慮すると、このアプローチは理にかなっています。評価するとしたら8です。プリミティブ値はシリアライゼーションやデシリアライゼーションが容易であり、データの交換をより効率的にしますが、複雑なデータ構造を持つ場合には、そのままプリミティブ値で扱うことが適切でないこともあります。