Data Transfer Object
Définition
A Data Transfer Object (DTO) is an object that is used to encapsulate data, and send it from one subsystem of an application to another.
Pourquoi est-il important
Prevent leaking internal structure
En exposant à l’utilisateur une structure différente de notre structure interne, nous aurons la possibilité de changer ultérieurement la structure interne sans impacter le client. En effet, dans le cas d’une API REST, si nous changeons la structure de retour ceci peut avoir des conséquences dramatiques pour l’appelant.
Exemple
Il permet de transformer des informations qui transfère entre deux couches. Par exemple, dans l’exemple suivant le AccountService
attend des objets de type AccountRequestModel
.
Ainsi, le Contrôleur :
- Recupère les informations fournies par l’utilisateur (e.g. identifiant utilisateur, nom du compte, etc …).
- Au lieu de transférer directement les informations au Service métier, il va les encapsuler dans un objet DTO.
- Transmet de DTO au Service métier
Un peu de code
public interface AccountService {
public create(AccountRequestModel accountRM);
}
public class AccountRequestModel {
private Long idCustomer;
private Long idAccount;
private String name;
private String accountType;
}
Maintenant quand le contrôleur va recevoir les données il devra créer un AccountRequestModel
et seulement après appeler le service. Néanmois pour diminuer le nombre de DTOs dans le système il est envisagble que la méthode create()
prend en paramètre le même DTO (la vue et le contrôleur ont le même request dto).
@PostMapping()
public void create(@RequestBody AccountRequestModel requestModel) {
accountService.create(requestModel);
}
Le client doit ainsi envoyer un json correspondant à un AccountRequestModel
, le contrôleur le transmettra ensuite au service
{
idCustomer: 1,
idAccount: 4,
name: "adrien"
accountType: "CREDIT"
}
ResponseModel (DTO de réponse)
Nous nous concentrons sur les données que nous voulons exposer au frontend.
En effet, nous ne souhaitons pas forcément exposer l’ensemble des informations de notre service. Ainsi on retourne un AccountResponseDTO
qui contient des attributs correspondant à ceux qu’on souhaite réellement exposer au frontend