Kursinhalt
Spring Boot Backend
Spring Boot Backend
Arbeiten Mit DTO
Die Verwendung von DTOs vereinfacht und optimiert den Datenaustausch, indem unnötige Felder ausgeschlossen werden und nur die Daten bereitgestellt werden, die ein bestimmter Client tatsächlich benötigt.
DTOs in diesem Beispiel dienen dazu, den Datenaustausch zwischen dem Client und dem Server zu begrenzen. Das ResponseBookDTO
wird verwendet, um nur die notwendigen Daten (name
, author
, price
) an den Client zu senden, während das RequestBookDTO
es den Clients ermöglicht, die erforderlichen Daten (date
, name
, author
, price
) an den Server zu senden.
Der Hauptvorteil der Verwendung von DTOs besteht darin, dass sie helfen, Daten von der Geschäftslogik zu trennen und die Kontrolle darüber zu ermöglichen, welche Daten zwischen den Schichten der Anwendung übertragen oder in HTTP-Antwortnachrichten aufgenommen werden.
Wo wird das DTO angewendet?
DTOs werden verwendet, wenn Daten in einem bestimmten Format dargestellt werden müssen, beispielsweise zum Übertragen von Daten an einen Client oder zum Empfangen von Informationen von einem Client im Kontext einer REST-API.
Dies ist auch relevant, wenn zwischen Schichten in einer mehrschichtigen Architektur interagiert wird, wobei Daten zwischen Diensten und Repositories übertragen werden.
Beispiel aus der Praxis
Stellen Sie sich vor, Sie entwickeln eine Anwendung für einen Online-Shop. Sie haben eine Entität namens Product
, die viele Informationen enthält: name
, description
, price
, production date
, discounts
und so weiter.
Ein Client, der eine Liste von Produkten anfordert, benötigt nicht alle diese Informationen. Stattdessen können Sie ein DTO-Objekt erstellen, das nur die notwendigen Felder (wie Name und Preis) enthält, um diese Daten an den Client zu senden.
Beispiel der Verwendung
In unserer Anwendung ist das primäre Modell Book
, das vom Client gesendet und vom Server zurückgegeben wird.
Main
@Getter @Setter public class Book { private String id; private String name; private String author; private String price; }
Allerdings scheint es, dass das id
-Feld unnötig ist, wenn Daten vom Client empfangen werden, da es auf Repository-Ebene generiert wird. Wir benötigen die id
nur, wenn wir eine Antwort zurückgeben.
Hier kommen DTOs zur Rettung. Sie ermöglichen es uns, die Logik zu trennen und verschiedene Versionen des Book
-Modells für Anfragen und Antworten zu erstellen, wobei unnötige Felder wie id
ausgeschlossen werden, wo es angebracht ist.
In einem DTO wird ein Objekt mit dem request
-Präfix verwendet, um Daten vom Client an den Server zu senden, während ein Objekt mit dem response
-Präfix verwendet wird, um Daten vom Server an den Client zu senden. Diese Trennung stellt sicher, dass nur notwendige Daten ausgetauscht werden, was sowohl die Sicherheit als auch die Effizienz erhöht.
BookRequestDTO
BookResponseDTO
public class BookRequestDTO { private String name; private String author; private String price; }
Jetzt haben wir zwei DTOs: eines zum Empfangen von Anfragen BookRequestDTO
und ein weiteres zum Senden von Antworten BookResponseDTO
.
Sie werden feststellen, dass BookResponseDTO
und unser Book
Modell identisch sind, was die Frage aufwirft: Warum ein separates DTO erstellen, wenn wir einfach das Book
Modell verwenden können?
Der Grund ist, dass wenn wir später entscheiden, zusätzliche Informationen hinzuzufügen, die nur auf der Service-Ebene benötigt werden, unser Book
Modell am Ende unnötige Daten an die Repository-Ebene weitergeben würde, was uns dazu zwingt, sie irgendwie zu filtern.
Mapper
Um Objekte bequem von einem Typ in einen anderen zu transformieren, verwenden wir eine spezialisierte Bibliothek.
Wir können eine separate Klasse erstellen, in der wir statische Methoden definieren und die Logik für die Umwandlung von Objekten zwischen Typen implementieren.
MapperBook
public class MapperBook { private static final ModelMapper mapper = new ModelMapper(); public static Book dtoRequestToModel(BookRequestDTO dto) { return mapper.map(dto, Book.class); } public static BookResponseDTO modelToResponseDto(Book book) { return mapper.map(book, BookResponseDTO.class); } }
In diesem Code verwendet die MapperBook
Klasse die ModelMapper
Bibliothek für die automatische Objekttransformation.
Es enthält zwei Methoden: die erste ist dtoRequestToModel()
, die ein BookRequestDTO
Objekt in ein Book
Modell transformiert unter Verwendung der map
Methode, und die zweite ist modelToResponseDto()
, die ein Book
Modell in ein BookResponseDTO
Objekt konvertiert.
Dank ModelMapper
wird der Prozess der Objekttransformation einfacher und bequemer, wodurch die Notwendigkeit entfällt, Felder manuell zu kopieren.
Hinzufügen eines DTO zu unserer Anwendung
Zusammenfassung
DTO (Data Transfer Object) ist ein einfaches Objekt, das für den Datentransfer zwischen Schichten oder Komponenten einer Anwendung konzipiert ist.
Im Kontext einer Drei-Schichten-Architektur spielt DTO eine entscheidende Rolle, indem es die Trennung der Schichten sicherstellt und eine effiziente Möglichkeit bietet, Daten zwischen ihnen auszutauschen.
Daher wird die Verwendung eines DTO zu einer optimalen Lösung, wenn es notwendig ist, Informationen zwischen verschiedenen Teilen einer Anwendung zu verwalten, um den Transfer von unnötigen oder irrelevanten Daten zu vermeiden.
1. Was ist ein DTO
im Kontext der Programmierung?
2. Welche der folgenden Optionen ist die beste Verwendung eines DTO
?
Danke für Ihr Feedback!