Aspectos claves a ver con este post:
- Enfoque arquitectónico
- Problemas actuales y reales
- Exposicion de info sensible
- Porque usar DTOs Que es un DTO?
Un DTO (Data Transfer Object) es el responsable de transportar los datos en capas a sus respectivos servicios (donde se maneja la lógica de negocio)
son estructuras de datos serializables, sin lógica, ideales para el borde del sistema (entrada y salida).
Aspectos clave:
- Separamos el modelo interno o entidades de bases de datos con sus respectivos llave-valores para especificar que queremos que nos llegue del API
- No se expone el modelo de dominio
- Encapsulacion y seguridad
Como los conocí?
En el trabajo me di cuenta que usaban DTOs la verdad no tenía idea para que eran hasta cuando me lo explicaroon y me pareció super interesante.
DTOs vs Modelo de dominio
Purpose | Dto | Domain model |
---|---|---|
Has logic | No | Yes |
Transport | Yes | No |
Client exposed | Yes | No |
Request and Response
Request: Ya que Por ejemplo yo hago bastante validaciones en una api endpoint entonces yo no quiero que todo el modelo completo se me permita enviar directamente eh como tipo llave valor cuando trabajo con jason eh en el API yo por ejemplo utilizo el dedo para especificar qué llaves quiero que me lleguen al servicio Que estoy utilizando que ya se conecta con el modelo en sí entonces que utilizo más que todo el leteo para especificar al API en point que ya ves son las que quiero que me lleguen eh ya sea en el Boy harder o o para arm
Response: devolver los datos necesarios y bien estructados en la respuesta del API endpoint al cliente
Not use DTos
- Basic/simple systems. It may be overengineering
“
public class UserDto { private String email; private String name;}
My first experience with DTOs
Dev
Ejemplo DTO en Java
@Entitypublic class User { @Id private Long id; private String username; private String email; private String password; // Should not be exposed in APIs private String address; // Getters and setters}
public class UserDTO { private String username; private String email; // Getters and setters}
@Servicepublic class UserService { @Autowired private UserRepository userRepository;public List<UserDTO> getAllUsers() { List<User> users = userRepository.findAll(); return users.stream() .map(user -> { UserDTO dto = new UserDTO(); dto.setUsername(user.getUsername()); dto.setEmail(user.getEmail()); return dto; }) .collect(Collectors.toList()); }}
Tener en cuenta las entities mappers vs dtos vs el mongo password: 0