Aula 10 - DTOs e Mapeamento de Objetos 📦
Nesta aula, vamos resolver o problema de loop infinito da Aula 08 e aprender a controlar exatamente quais dados sua API expõe, usando DTOs.
😊 O que é um DTO?
DTO (Data Transfer Object) é um objeto simples, usado apenas para transportar dados entre camadas — especialmente entre a API e o cliente. Ele não é a Entidade do banco de dados.
Por que não expor a Entity diretamente?
- Segurança: Você pode ter campos sensíveis (como senha) na Entity que nunca devem ir para o cliente.
- Loops infinitos: Como vimos na Aula 08, relacionamentos bidirecionais quebram a serialização JSON.
- Flexibilidade: O formato exposto pela API pode ser diferente da estrutura interna do banco.
📊 Entity vs DTO
graph LR
Cliente -- "Recebe" --> DTO[ProdutoDTO]
DTO -- "Mapeado de/para" --> Entity[Produto - Entity JPA]
Entity -- "Persistido em" --> DB[(Banco de Dados)] 🧠 Criando um DTO
Tip
Usar record (recurso do Java moderno) é uma forma concisa de criar DTOs imutáveis — sem precisar escrever getters, construtores e equals/hashCode manualmente.
🧠 Convertendo entre Entity e DTO
public ProdutoDTO paraDTO(Produto produto) {
return new ProdutoDTO(produto.getId(), produto.getNome(), produto.getPreco());
}
public Produto paraEntity(ProdutoDTO dto) {
Produto p = new Produto();
p.setNome(dto.nome());
p.setPreco(dto.preco());
return p;
}
Note
Em projetos maiores, bibliotecas como o MapStruct automatizam essa conversão — mas entender o mapeamento manual primeiro é essencial.
📝 Exercícios Progressivos
- Básico: O que significa a sigla DTO?
- Básico: Por que não devemos retornar a Entity diretamente na resposta da API?
- Intermediário: Como um
recordem Java simplifica a criação de um DTO? - Intermediário: Em qual camada (Controller, Service ou Repository) a conversão Entity ↔ DTO deveria acontecer?
- Desafio: Crie um
ClienteDTOque exponha apenasidenome, escondendo o camposenhada entidadeCliente.
🚀 Mini-projeto: Crie o ProdutoDTO e altere o ProdutoController da Aula 05 para retornar DTOs em vez das Entities diretamente.