[PT-BR] Padrão de Projeto: 데이터 전송 객체

Semper quando ouvia falar sobre padrão de projeto eu já imaginava alguma implementação ou arquitetura muito complexa para o que eu estava acostumado. Porém, nos ultimos tempos, me dei conta que estava trabalhando com um padrão de projeto que facilitava muito a "conversa"entre os sistemas clientes e os sistemas servidores e gostaria de explicá-lo nesse artigo.

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:
  • Implementar um método na classe UsuarioEntity que irá transformar as informações da classe UsuarioEntity para informações da classe UsuarioDTO ;
  • Fazer comque o nosso endpoint retorne um objeto da classeUsuarioDTO .

  • 변환 정보를 위한 방법 구현



    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étodosalvarUsuario(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! 영형/

    좋은 웹페이지 즐겨찾기