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:
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:
@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.