Trabalhando com DTO
O uso de DTOs simplifica e otimiza a troca de dados ao excluir campos desnecessários e fornecer apenas os dados que um cliente específico realmente necessita.
Os DTOs neste exemplo servem para limitar a troca de dados entre o cliente e o servidor. O ResponseBookDTO é utilizado para enviar apenas os dados necessários (name, author, price) para o cliente, enquanto o RequestBookDTO permite que os clientes enviem os dados requeridos (date, name, author, price) para o servidor.
A principal vantagem do uso de DTOs é que eles ajudam a separar os dados da lógica de negócio e permitem o controle sobre quais dados são transferidos entre as camadas da aplicação ou incluídos nas mensagens de resposta HTTP.
Onde o DTO se Aplica?
DTOs são utilizados quando há necessidade de apresentar dados em um formato específico, como para transferência de dados para um cliente ou recebimento de informações de um cliente dentro do contexto de uma API REST.
Isso também é relevante ao interagir entre camadas em uma arquitetura multicamadas, onde os dados são passados entre serviços e repositórios.
Exemplo do Mundo Real
Imagine que você está desenvolvendo uma aplicação para uma loja online. Você possui uma entidade chamada Product, que inclui muitas informações: name, description, price, production date, discounts e assim por diante.
Um cliente que solicita uma lista de produtos não precisa de todas essas informações. Em vez disso, é possível criar um objeto DTO que contenha apenas os campos necessários (como nome e preço) para enviar esses dados ao cliente.
Exemplo de Uso
Na aplicação, o modelo principal é Book, que é enviado pelo cliente e retornado pelo servidor.
Main.java
12345678@Getter @Setter public class Book { private String id; private String name; private String author; private String price; }
No entanto, não parece que o campo id é desnecessário ao receber dados do cliente, já que ele é gerado no nível do repositório. Precisaremos do id apenas ao retornar uma resposta.
É aqui que os DTOs entram em ação. Eles permitem separar a lógica e criar diferentes versões do modelo Book para requisições e respostas, excluindo campos desnecessários como o id quando apropriado.
Em um DTO, um objeto com o prefixo request é utilizado para enviar dados do cliente para o servidor, enquanto um objeto com o prefixo response é utilizado para enviar dados do servidor para o cliente. Essa separação garante que apenas os dados necessários sejam trocados, aumentando tanto a segurança quanto a eficiência.
BookRequestDTO.java
BookResponseDTO.java
12345public class BookRequestDTO { private String name; private String author; private String price; }
Agora temos dois DTOs: um para receber requisições BookRequestDTO e outro para enviar respostas BookResponseDTO.
Você pode notar que BookResponseDTO e nosso modelo Book são idênticos, o que levanta a questão: por que criar um DTO separado se podemos simplesmente usar o modelo Book?
O motivo é que, se posteriormente decidirmos adicionar informações extras que são necessárias apenas no nível de serviço, nosso modelo Book acabaria passando dados desnecessários para o nível de repositório, exigindo que filtrássemos essas informações de alguma forma.
Mapper
Para transformar objetos de um tipo para outro de forma conveniente, utiliza-se uma biblioteca especializada.
É possível criar uma classe separada onde são definidos métodos estáticos e implementada a lógica para converter objetos entre tipos.
MapperBook.
1234567891011public 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); } }
Neste código, a classe MapperBook utiliza a biblioteca ModelMapper para transformação automática de objetos.
Ela contém dois métodos: o primeiro é dtoRequestToModel(), que transforma um objeto BookRequestDTO em um modelo Book utilizando o método map, e o segundo é modelToResponseDto(), que converte um modelo Book em um objeto BookResponseDTO.
Graças ao ModelMapper, o processo de transformação de objetos torna-se mais simples e conveniente, eliminando a necessidade de copiar campos manualmente.
Adicionando um DTO à Nossa Aplicação
Resumo
DTO (Data Transfer Object) é um objeto simples projetado para transferência de dados entre camadas ou componentes de uma aplicação.
No contexto de uma arquitetura em três camadas, o DTO desempenha um papel crucial ao garantir a separação das camadas e fornecer uma forma eficiente de trocar dados entre elas.
Assim, o uso de um DTO torna-se uma solução ideal quando é necessário gerenciar informações entre diferentes partes de uma aplicação, evitando a transferência de dados desnecessários ou irrelevantes.
1. O que é um DTO no contexto da programação?
2. Qual das opções a seguir é o melhor uso de um DTO?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
What are the main benefits of using DTOs in an application?
Can you explain how ModelMapper works for mapping DTOs?
When should I use a DTO instead of a regular model?
Awesome!
Completion rate improved to 3.45
Trabalhando com DTO
Deslize para mostrar o menu
O uso de DTOs simplifica e otimiza a troca de dados ao excluir campos desnecessários e fornecer apenas os dados que um cliente específico realmente necessita.
Os DTOs neste exemplo servem para limitar a troca de dados entre o cliente e o servidor. O ResponseBookDTO é utilizado para enviar apenas os dados necessários (name, author, price) para o cliente, enquanto o RequestBookDTO permite que os clientes enviem os dados requeridos (date, name, author, price) para o servidor.
A principal vantagem do uso de DTOs é que eles ajudam a separar os dados da lógica de negócio e permitem o controle sobre quais dados são transferidos entre as camadas da aplicação ou incluídos nas mensagens de resposta HTTP.
Onde o DTO se Aplica?
DTOs são utilizados quando há necessidade de apresentar dados em um formato específico, como para transferência de dados para um cliente ou recebimento de informações de um cliente dentro do contexto de uma API REST.
Isso também é relevante ao interagir entre camadas em uma arquitetura multicamadas, onde os dados são passados entre serviços e repositórios.
Exemplo do Mundo Real
Imagine que você está desenvolvendo uma aplicação para uma loja online. Você possui uma entidade chamada Product, que inclui muitas informações: name, description, price, production date, discounts e assim por diante.
Um cliente que solicita uma lista de produtos não precisa de todas essas informações. Em vez disso, é possível criar um objeto DTO que contenha apenas os campos necessários (como nome e preço) para enviar esses dados ao cliente.
Exemplo de Uso
Na aplicação, o modelo principal é Book, que é enviado pelo cliente e retornado pelo servidor.
Main.java
12345678@Getter @Setter public class Book { private String id; private String name; private String author; private String price; }
No entanto, não parece que o campo id é desnecessário ao receber dados do cliente, já que ele é gerado no nível do repositório. Precisaremos do id apenas ao retornar uma resposta.
É aqui que os DTOs entram em ação. Eles permitem separar a lógica e criar diferentes versões do modelo Book para requisições e respostas, excluindo campos desnecessários como o id quando apropriado.
Em um DTO, um objeto com o prefixo request é utilizado para enviar dados do cliente para o servidor, enquanto um objeto com o prefixo response é utilizado para enviar dados do servidor para o cliente. Essa separação garante que apenas os dados necessários sejam trocados, aumentando tanto a segurança quanto a eficiência.
BookRequestDTO.java
BookResponseDTO.java
12345public class BookRequestDTO { private String name; private String author; private String price; }
Agora temos dois DTOs: um para receber requisições BookRequestDTO e outro para enviar respostas BookResponseDTO.
Você pode notar que BookResponseDTO e nosso modelo Book são idênticos, o que levanta a questão: por que criar um DTO separado se podemos simplesmente usar o modelo Book?
O motivo é que, se posteriormente decidirmos adicionar informações extras que são necessárias apenas no nível de serviço, nosso modelo Book acabaria passando dados desnecessários para o nível de repositório, exigindo que filtrássemos essas informações de alguma forma.
Mapper
Para transformar objetos de um tipo para outro de forma conveniente, utiliza-se uma biblioteca especializada.
É possível criar uma classe separada onde são definidos métodos estáticos e implementada a lógica para converter objetos entre tipos.
MapperBook.
1234567891011public 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); } }
Neste código, a classe MapperBook utiliza a biblioteca ModelMapper para transformação automática de objetos.
Ela contém dois métodos: o primeiro é dtoRequestToModel(), que transforma um objeto BookRequestDTO em um modelo Book utilizando o método map, e o segundo é modelToResponseDto(), que converte um modelo Book em um objeto BookResponseDTO.
Graças ao ModelMapper, o processo de transformação de objetos torna-se mais simples e conveniente, eliminando a necessidade de copiar campos manualmente.
Adicionando um DTO à Nossa Aplicação
Resumo
DTO (Data Transfer Object) é um objeto simples projetado para transferência de dados entre camadas ou componentes de uma aplicação.
No contexto de uma arquitetura em três camadas, o DTO desempenha um papel crucial ao garantir a separação das camadas e fornecer uma forma eficiente de trocar dados entre elas.
Assim, o uso de um DTO torna-se uma solução ideal quando é necessário gerenciar informações entre diferentes partes de uma aplicação, evitando a transferência de dados desnecessários ou irrelevantes.
1. O que é um DTO no contexto da programação?
2. Qual das opções a seguir é o melhor uso de um DTO?
Obrigado pelo seu feedback!