fbpx

PATRÓN de DISEÑO DTO en JAVA

El patrón de diseño DTO (Data Transfer Object) nos ayuda a separar las capas de nuestra aplicación de JAVA y además simplificar los datos que vamos a utilizar o enviar en nuestros métodos, cómo por ejemplo, no teniendo que hacer multiples llamadas a diferentes métodos para obtener varios datos.

Vídeo de explicación

¿Qué es un DTO?

Un DTO (Data Transfer Object) o objeto de transferencia de datos es simplemente un POJO, es decir es una clase plana sin ningún tipo de lógica de negocio en su interior, sólo es usado para guardar datos dentro de él. Ejemplo:

public class UsuarioDTO implements Serializable {
    private final String nombre;
    private final String apellidos;
    // constructor y otros métodos
}

Por norma general los DTO son clases con atributos con la palabra clave final, es decir son clases inmutables. Aunque esto suele ser discutido en diferentes foros, un DTO no debería de ser capaz de cambiar los datos que almacena ya que sirve para transmitir datos específicos en nuestro proyecto y si los cambiamos de forma errónea podríamos alterar el comportamiento de nuestra aplicación.

Además suelen implementar la interfaz Serializable ya que pueden ser utilizados para convertiros en bytes y enviar o obtener la información de alguna fuente.

¿Cómo usar un DTO?

A diferencia de las clases de modelo de dominio o las entidades, los DTO no tienen por qué enfocarse sólo y exclusivamente a una tipo de dato sino que podemos componer nuestro DTO con diferentes fuentes de datos y agruparlas desde diferentes llamadas para así usarlo cómo mejor veamos en nuestro proyecto. En el siguiente ejemplo tendremos un DTO que obtendrá datos de diferentes entidades, usuario y dirección y las agrupará ambas.

public class UsuarioDTO implements Serializable {
    private final String nombre;
    private final String apellidos;
    private final String calle;
    // constructor y otros métodos
}

Para crear una UsuarioDTO tendremos que almacenar datos tanto del usuario como su dirección de residencial, para ello vamos a utilizar dos llamadas a nuestra base de datos de las tablas USUARIOS y DIRECCIONES gracias a JPARepository de Spring Data

public UsuarioDTO encontrarUsuario(final long idUsuario, final long idDireccion) {
        final UsuarioEntidad usuarioEncontrado = usuarioRepositorio.findById(idUsuario)
                .orElseThrow(() -> new EntityNotFoundException("Usuario con id " + idUsuario + " no encontrado"));
        final DireccionEntidad direccionEncontrada = direccionRepositorio.findById(idDireccion)
                .orElseThrow(() -> new EntityNotFoundException("Direccion con id " + idDireccion + " no encontrada"));

        return new UsuarioDTO(usuarioEncontrado.getNombre(), usuarioEncontrado.getApellidos(), direccionEncontrada.getCalle());
}

Como vemos, hemos hecho dos consultas a la base de datos pero al final tenemos un DTO con los datos del usuario que necesitamos llamando a un método únicamente.