Data Transfer Object (DTO) é um padrão de projeto que representa um objeto simples que carrega dados entre camadas ou componentes de um sistema. Ele é usado para transferir dados de um local para outro de forma eficiente, evitando a necessidade de expor diretamente as entidades de domínio ou outros objetos complexos.

Um exemplo de DTO em Java pode ser criado da seguinte maneira:

👨🏼‍💻 Exemplo prático

public class ProdutoDTO {
    private String nome;
    private float preco;

    // Construtores, getters e setters

    // Exemplo de construtor
    public ProdutoDTO(String nome, float preco) {
        this.preco = preco;
        this.preco = preco;
    }
}

Neste exemplo, temos a classe ProdutoDTO que representa um DTO para transferir dados de produtos. Ele contém duas propriedades: nome e preço. A classe possui construtores, getters e setters para acessar e modificar os dados.

Ao utilizar um DTO, podemos encapsular apenas as informações relevantes e necessárias para a transferência de dados entre as camadas ou componentes. Isso evita a exposição desnecessária de detalhes internos do sistema, como outras entidades ou objetos complexos.

Vamos considerar um cenário em que precisamos transferir informações simplificadas de um produto do serviço backend para a interface de usuário frontend. Em vez de transferir a entidade de domínio completa, podemos usar um DTO para fornecer apenas as informações necessárias:

👨🏼‍💻 Exemplo prático

@RestController
public class ProdutoController {
    @Autowired
    private ProdutoService produtoService;

    @GetMapping("/produtos/{id}")
    public ProdutoDTO getProdutoById(@PathVariable Long id) {
        Produto produto = produtoService.getProdutoById(id);
        ProdutoDTO produtoDTO = new ProdutoDTO(produto.getNome(), produto.getPreco());
        return produtoDTO;
    }
}

Neste exemplo, o ProdutoController recebe uma requisição GET para obter as informações de um produto com base no ID. O serviço ProdutoService é responsável por recuperar a entidade de domínio completa do produto. Em seguida, o ProdutoDTO é criado com as informações relevantes (nome e preço) e retornado como resposta.

Dessa forma, o DTO atua como uma estrutura simples e eficiente para transferir apenas os dados necessários entre as camadas ou componentes do sistema, promovendo um acoplamento mais fraco e um design mais limpo.

📚 Material complementar

BeanUtils