[PT-BR] Padrão de Projeto: 데이터 전송 객체
16944 단어 padraodeprojetodtotutorialjava
Espero que a compreensão de algo que, para mim, num geral, era super complexo seja mais simples para vocês.
데이터 전송 객체
O 데이터 전송 객체(DTO), ou conhecido em alguns lugares apenas como Transfer Object(TO), é um padrão em que utilizamos classes que possuem 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). Essas class tem o objetivo de simplificar a maneira como um sistema deve conversar com outro em relação à algum processo.
DTO 나 실무
예를 들어, 새로운 등록 절차
Usuário
는 기본 API를 다시 등록하고 다시 응답해야 합니다.예를 들면 Java comSpring Boot에서 구현하는 estarei 유틸리티입니다.
클래스
Nossa classe UsuarioEntity(responsável por fazer o mapeamento da nossa classe e atributos com a tabela e campos da base de dados):
package com.leonardossev.dtoexemplo.model.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "usuario")
public class UsuarioEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "nome")
private String nome;
@Column(name = "email", unique = true)
private String email;
@Column(name = "senha")
private String senha;
// Getters e Setters...
}
Nosso Repository( 인터페이스 응답은 아빠의 기반이 됩니다 ):
package com.leonardossev.dtoexemplo.repository;
import com.leonardossev.dtoexemplo.model.entity.UsuarioEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UsuarioRepository extends JpaRepository<UsuarioEntity, Long> {
}
노쏘 서비스:
package com.leonardossev.dtoexemplo.service;
import com.leonardossev.dtoexemplo.model.entity.UsuarioEntity;
import com.leonardossev.dtoexemplo.repository.UsuarioRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UsuarioService {
@Autowired
private UsuarioRepository usuarioRepository;
public UsuarioEntity salvarUsuario(UsuarioEntity usuario) {
return this.usuarioRepository.save(usuario);
}
}
노소 컨트롤러:
package com.leonardossev.dtoexemplo.controller;
import com.leonardossev.dtoexemplo.model.entity.UsuarioEntity;
import com.leonardossev.dtoexemplo.service.UsuarioService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(path = "/usuario")
public class UsuarioController {
@Autowired
private UsuarioService usuarioService;
@PostMapping
public ResponseEntity<UsuarioEntity> salvarUsuario(final @RequestBody UsuarioEntity usuario) {
return new ResponseEntity<UsuarioEntity>(this.usuarioService.salvarUsuario(usuario), HttpStatus.CREATED);
}
}
전체 실행 실행
Para testar o endpoint responsável por guardar o registro na base, utilizarei o Insomnia .
Lembrando que, se não especificarmos nenhuma porta, ao executar a nossa aplicação, ela estará disponível na porta 8080.
참고 que estamos recebendo exatamente as informações que salvamos na nossa base de dados. Mas em uma aplicação real provavelmente não gostaríamos de receber todos os dados dessa forma.
예를 들면: não iríamos querer que a senha do nosso usuário (sem entrar no mérito de criptografia) estiveesse exposta dessa forma.
외부 예: se quiséssemos trazer informações relacionadas ao usuário que não estão exatamente na tabela de usuário.
Nosso caso, o uso de DTO pode nos ajudar a solucionar essa questão de forma a nos permitir a escolher quais dados nós queiramos disponibilizar quando salvarmos um novo usuário.
Vamos adicionar a seguinte classe ao nosso projeto:
package com.leonardossev.dtoexemplo.model.dto;
public class UsuarioDTO {
private Long id;
private String nome;
private String email;
public UsuarioDTO(Long id, String nome, String email) {
this.id = id;
this.nome = nome;
this.email = email;
}
// Getters e setters...
}
Vamos também fazer os seguintes ajustes:
UsuarioEntity
que irá transformar as informações da classe UsuarioEntity
para informações da classe UsuarioDTO
; UsuarioDTO
. 변환 정보를 위한 방법 구현
Na classe
UsuarioEntity
vamos criar o seguinte método: public UsuarioDTO obterUsuarioDTO() {
return new UsuarioDTO(this.id, this.nome, this.email);
}
Alterando retorno do endpoint de salvar usuário
Nosso 서비스 없음, iremos ajustar a implementação do método
salvarUsuario(UsuarioEntity usuario)
para que ele possa retornar um objeto da classeUsuarioDTO
: public UsuarioDTO salvarUsuario(UsuarioEntity usuario) {
var usuarioSalvo = this.usuarioRepository.save(usuario);
return usuarioSalvo.obterUsuarioDTO();
}
모든 컨트롤러가 컨트롤러에 필요하지 않은 이유는 다음과 같습니다.
@PostMapping
public ResponseEntity<UsuarioDTO> salvarUsuario(final @RequestBody UsuarioEntity usuario) {
return new ResponseEntity<UsuarioDTO>(this.usuarioService.salvarUsuario(usuario), HttpStatus.CREATED);
}
Dessa forma, quando executamos a aplicação e tentamos salvar um novo usuário, recebemos as seguintes informações:
Perceba que não estamos recebendo a informação da senha do usuário.
최종 고려 사항
O repositório com o exemplo do artigo pode ser encontrado aqui .
참조
https://www.baeldung.com/hibernate-identifiers
https://stackabuse.com/data-transfer-object-pattern-in-java-implementation-and-mapping/
Em caso de dúvidas, estou semper aberto a sugestões, críticas e ideias! 영형/
Reference
이 문제에 관하여([PT-BR] Padrão de Projeto: 데이터 전송 객체), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/leonardossev/pt-br-padrao-de-projeto-data-transfer-object-3e0o텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)