Pular para conteúdo

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

public record ProdutoDTO(Long id, String nome, double preco) {}

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

  1. Básico: O que significa a sigla DTO?
  2. Básico: Por que não devemos retornar a Entity diretamente na resposta da API?
  3. Intermediário: Como um record em Java simplifica a criação de um DTO?
  4. Intermediário: Em qual camada (Controller, Service ou Repository) a conversão Entity ↔ DTO deveria acontecer?
  5. Desafio: Crie um ClienteDTO que exponha apenas id e nome, escondendo o campo senha da entidade Cliente.

🚀 Mini-projeto: Crie o ProdutoDTO e altere o ProdutoController da Aula 05 para retornar DTOs em vez das Entities diretamente.