Uso de DTO na API REST
O DTO (Data Transfer Object)
Na API REST, um DTO (Data Transfer Object) é usado para transferir dados entre o cliente e o servidor. Ele é usado em vez de uma entidade porque as entidades geralmente contêm mais informações do que o necessário para a transferência de dados. Além disso, as entidades podem conter informações confidenciais que não devem ser expostas ao cliente. Um DTO é uma classe simples que contém apenas as informações necessárias para a transferência de dados. Ele é usado para reduzir a largura de banda necessária para transferir dados e para melhorar o desempenho da API.
As diferenças entre DTO e entidade são:
Uma entidade representa um objeto persistente em um banco de dados, enquanto um DTO representa um objeto que será transferido pela rede.
Uma entidade pode conter informações confidenciais que não devem ser expostas ao cliente, enquanto um DTO contém apenas as informações necessárias para a transferência de dados.
Uma entidade pode conter mais informações do que o necessário para a transferência de dados, enquanto um DTO contém apenas as informações necessárias.
Um DTO (Data Transfer Object) é um objeto que define como os dados serão enviados pela rede. Ele é usado para desacoplar a camada de serviço da camada de banco de dados. O DTO é uma classe que possui informações que são formadas a partir de uma ou mais entidades (classes cujos atributos são mapeados para os campos de uma tabela em um banco de dados). O DTO é uma classe simples que contém apenas campos e propriedades para armazenar dados e não contém lógica de negócios
Aqui está um exemplo de como criar um DTO em Java:
public class BookDTO {
private Long id;
private String title;
private String authorName;
public BookDTO() {}
public BookDTO(Long id, String title, String authorName) {
this.id = id;
this.title = title;
this.authorName = authorName;
}
// getters and setters
}
Usar DTOs em vez de entidades em uma API REST com Java é uma prática recomendada para evitar o acoplamento indesejável entre a API e o modelo de domínio1. DTOs são objetos que carregam dados entre processos para reduzir o número de chamadas de métodos2.
Aqui está um exemplo de como usar DTOs em vez de entidades em uma API REST com Java1:
@RestController
@RequestMapping("/api/v1")
public class BookController {
private final BookService bookService;
public BookController(BookService bookService) {
this.bookService = bookService;
}
@GetMapping("/books")
public List<BookDTO> getAllBooks() {
return bookService.findAll();
}
@GetMapping("/books/{id}")
public ResponseEntity<BookDTO> getBookById(@PathVariable(value = "id") Long bookId)
throws ResourceNotFoundException {
BookDTO bookDTO = bookService.findById(bookId);
return ResponseEntity.ok().body(bookDTO);
}
@PostMapping("/books")
public BookDTO createBook(@Valid @RequestBody BookDTO bookDTO) {
return bookService.save(bookDTO);
}
@PutMapping("/books/{id}")
public ResponseEntity<BookDTO> updateBook(@PathVariable(value = "id") Long bookId,
@Valid @RequestBody BookDTO bookDetails) throws ResourceNotFoundException {
BookDTO updatedBook = bookService.update(bookId, bookDetails);
return ResponseEntity.ok(updatedBook);
}
@DeleteMapping("/books/{id}")
public Map<String, Boolean> deleteBook(@PathVariable(value = "id") Long bookId)
throws ResourceNotFoundException {
return bookService.delete(bookId);
}
}
Por fim, o DTO é o que chamamos de camada de representação, desprovidade de regra de negócio. Enquanto as entidades, por exemplo, faz parte da camada de domínio, juntamente com o service, onde estará a regra de negócio e a comunicação com o banco de dados.