Daacoplando Aカンガルーデドムは、ニオデUa Aplica


フェラチオナス
  • Java SDK
  • Docker
  • Postman
  • IDEデスー
  • TOS Essenciais de a e e mter o dom dom no da aplicaの遺言o(cora discrito o da plica des so o,entidades e regras de neg,ccide de uma aplica).ドスポンポン
    Estou Estudando E adquirindo Conhecimento Nesse Assunto de Designer e Econutura de C . Dio Mas neste Artigo Quero Division . o Pocco que tenho aprendido sobre o assunto
    Vamos Criar Numa Aplicaは、パラディノス・ノスソス・ド・フォン・ニオ・アイソド、E iRemos - Inventar - no - inicio O Banco de Dados postgres comoデータベースda nossa - aplicaの結果を得ます.
    パラインシアーモ・クリ・セウSpring Initializr コンフォルム・イメージャー

    Vamos Construir nossa aplicaは、oを使用します.

  • コア:ESSEパッケージe onde ficara o coraは、o o a da nossa aplicaは、o o o o、oを見つけます.

  • インフラストラクチャー:ESSEパッケージe onde ficaraは、pardeデConfiguraの上で、nonosa aplicaを得ますo o、Conancuraは、dados eを元にします.

  • アプリケーション:ESSEパッケージe onde ficaraは、pardeデacessoをnossa aplicaを得ますo o por aplicaは、外見をします.
    Imagem abaixoをconformeします.

    Dentro DoパッケージコアCrieusuario , Ne - e - Subario de Nossa Aplicaの論文についてUsuario - NSSA CLASSE実体
  • import javax.persistence.*;
    
    @Entity
    public class Usuario {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long userId;
    
        private String name;
    
        private String email;
    
        private String cpf;
    
        @Deprecated
        public Usuario() {
        }
    
        public Usuario(String name, String email, String cpf) {
            this.name = name;
            this.email = email;
            this.cpf = cpf;
        }
    
        public String getUserId() {
            return userId;
        }
    
        public void setUserId(String userId) {
            this.userId = userId;
        }
    
        public String getName() {
            return name;
        }
    
        public String getEmail() {
            return email;
        }
    
        public String getCpf() {
            return cpf;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public void setCpf(String cpf) {
            this.cpf = cpf;
        }
    
    }
    
    UsuarioRepository - UMAインターフェイスのCOMのOSは、oのようなtodosデacesso ao bancoデdados relacionado a um usuのreo.
    import java.util.List;
    import java.util.Optional;
    
    public interface UsuarioRepository {
    
        public Usuario createUser(Usuario user);
        public Usuario updateUser(Usuario user);
        public Optional<Usuario> findByUserId(Long userId);
        public List<Usuario> findAllUser();
        public void deleteUser(Usuario user);
    }
    
    UsuarioService - UMAインタフェースのCOMのOSは、使用してください.
    import com.example.ddd.application.inputDto.user.UsuarioForm;
    import com.example.ddd.application.outputDto.user.UsuarioDto;
    
    import java.util.List;
    
    
    public interface UsuarioService {
        public Usuario createUser(Usuario usuario);
        public String updateUser(UsuarioForm usuarioForm, Long userId);
        public List<UsuarioDto> findAllUser();
        public UsuarioDto findByUserId(Long usuarioId);
        public void deleteUser(Long usuarioId);
    }
    
    UsuarioServiceImpl - NESTA CLASSE実装OS OS Metodos Contidos NAインタフェースUsuarioService E Realizamosは、Logica必需品パラシュートで降下しているe Expor Os Dadosパラシュートで降下します.
    import com.example.ddd.application.inputDto.user.UsuarioForm;
    import com.example.ddd.application.outputDto.user.UsuarioDto;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    import java.util.stream.Collectors;
    
    @Service
    public class UsuarioServiceImpl implements UsuarioService {
    
        @Autowired
        private UsuarioRepository usuarioRepository;
    
        public UsuarioServiceImpl(UsuarioRepository usuarioRepository) {
            this.usuarioRepository = usuarioRepository;
        }
    
        @Override
        public Usuario createUser(Usuario usuario) {
            return usuarioRepository.createUser(usuario);
        }
    
        @Override
        public String updateUser(UsuarioForm usuarioForm, Long userId) {
            Usuario usuario = usuarioRepository.findByUserId(userId)
                    .orElseThrow(() -> new IllegalArgumentException("Nao ha usuario com o id: " + userId.toString()));
            Usuario usuarioUpdate = usuarioForm.converte();
            usuarioUpdate.setUserId(usuario.getUserId());
            usuarioRepository.updateUser(usuarioUpdate);
            return "atualizado";
        }
    
        @Override
        public List<UsuarioDto> findAllUser() {
            return usuarioRepository.findAllUser().stream().map(it -> {
                return new UsuarioDto(it.getUserId(), it.getName(), it.getEmail(), it.getCpf());
            }).collect(Collectors.toList());
        }
    
        @Override
        public UsuarioDto findByUserId(Long usuarioId) {
            Usuario usuario = usuarioRepository.findByUserId(usuarioId)
                    .orElseThrow(() -> new IllegalArgumentException("Nao ha usuario cadastrado com o id: " + usuarioId.toString()));
            return new UsuarioDto(usuario.getUserId(), usuario.getName(), usuario.getEmail(), usuario.getCpf());
        }
    
        @Override
        public void deleteUser(Long usuarioId) {
          Usuario usuario = usuarioRepository.findByUserId(usuarioId)
                  .orElseThrow(() -> new IllegalArgumentException("Nao ha usuario cadastrado com o id: " + usuarioId.toString()));
          usuarioRepository.deleteUser(usuario);
        }
    }
    
    アイソヴァソアゴラデロンドゥパッケージinfrastructure クラスとしてのCriarとしてのCriar
    PardeデConfiguraは、o o o o o sosres arszenaremos dentroにnosso arquivoアプリケーションを禁止します.プロパティ.Application.properties
    # datasource
    spring.datasource.driverClassName=org.postgresql.Driver
    spring.datasource.url=jdbc:postgresql://localhost:5432/testearq
    spring.datasource.username=postgres
    spring.datasource.password=password
    
    # jpa
    spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
    spring.jpa.hibernate.ddl-auto=update
    
    # Mostrar Sql no terminal
    spring.jpa.show-sql=true
    spring.jpa.properties.hibernate.format_sql=true
    
    server.error.include-message=always
    
    Vamos Criarアゴラdentroなしパッケージinfrastructure デリポジトリe dentro desseパッケージumパッケージsuuariorepository que IRA armazenarは、クラスとして呼吸します.UsuarioAbstractRepositoryDB - インターフェースque nos permite v v rios m To dos Dreamionados ao Banco de dados atrav es s jpa
    import com.example.ddd.core.usuario.Usuario;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.stereotype.Repository;
    
    @Repository
    public interface UsuarioAbstractRepositoryDB extends JpaRepository<Usuario, Long> {
    }
    
    UsuarioRepositoryImpl - ESTA CLASSE Implementos OS M To Dos Criamos NAインタフェースUsuarioRepository E TEMインフェネダUsuarioAbstractRepositoryDB , <武井>UsuarioRepository <研究ノート>トードー・デ・acesso Ao Banco de Dados que Obtemos - atrav - es da Ine Present - O da ClassseUsuarioAbstractRepositoryDB .
    
    import com.example.ddd.core.usuario.Usuario;
    import com.example.ddd.core.usuario.UsuarioRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import java.util.List;
    import java.util.Optional;
    
    @Component
    public class UsuarioRepositoryImpl implements UsuarioRepository {
    
        @Autowired
        private UsuarioAbstractRepositoryDB usuarioAbstractRepositoryDB;
    
        public UsuarioRepositoryImpl(UsuarioAbstractRepositoryDB usuarioAbstractRepositoryDB) {
            this.usuarioAbstractRepositoryDB = usuarioAbstractRepositoryDB;
        }
    
        @Override
        public Usuario createUser(Usuario user) {
            return usuarioAbstractRepositoryDB.save(user);
        }
    
        @Override
        public Usuario updateUser(Usuario user) {
            return usuarioAbstractRepositoryDB.save(user);
        }
    
        @Override
        public Optional<Usuario> findByUserId(Long userId) {
            return usuarioAbstractRepositoryDB.findById(userId);
        }
    
        @Override
        public List<Usuario> findAllUser() {
            return usuarioAbstractRepositoryDB.findAll();
        }
    
        @Override
        public void deleteUser(Usuario user) {
            usuarioAbstractRepositoryDB.delete(user);
        }
    }
    
    E Aqui que Desacoplamos nossoドムは、BancoデDados、Pois IndaddenteにBanco De Dados que Abstrzarmos TemosをしますUsuarioRepository 第二次大戦後の日系企業に対する影響
    vamosアゴラEstruturar o acessoは、nossa aplicaを与えますcontrollers , inputDto , outputDto .
    パッケージコントローラのパッケージusuarioController E DENRON DEA A CLASSE UsuarioController que ter is s m m a todos de acesso NSSA APLICAは、HTTPを通してoを使います.UsuarioController
    import com.example.ddd.application.inputDto.user.UsuarioForm;
    import com.example.ddd.application.outputDto.user.UsuarioDto;
    import com.example.ddd.core.usuario.Usuario;
    import com.example.ddd.core.usuario.UsuarioService;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.List;
    
    @RestController
    @RequestMapping("api/v1/")
    public class UsuarioController {
    
        private UsuarioService usuarioService;
    
        public UsuarioController(UsuarioService usuarioService) {
            this.usuarioService = usuarioService;
        }
    
        @PostMapping("user")
        public String createUser(@RequestBody UsuarioForm usuarioForm){
            Usuario user = usuarioForm.converte();
            System.out.println(user.toString());
            usuarioService.createUser(user);
            return "ok";
        }
    
        @GetMapping("user")
        public List<UsuarioDto> findAllUser(){
            return usuarioService.findAllUser();
        }
    
        @PutMapping("user/{usuarioId}")
        public String updateUser(@RequestBody UsuarioForm usuarioForm, @PathVariable("usuarioId") Long usuarioId){
            usuarioService.updateUser(usuarioForm, usuarioId);
            return "atualizado";
        }
    
        @GetMapping("user/{usuarioId}")
        public UsuarioDto updateUser(@PathVariable("usuarioId") Long usuarioId){
            return usuarioService.findByUserId(usuarioId);
        }
    
        @DeleteMapping("user/{usuarioId}")
        public void deleteUser(@PathVariable("usuarioId") Long usuarioId){
            usuarioService.deleteUser(usuarioId);
        }
    }
    
    パッケージパッケージinputDto プレミアムパッケージusuario E Dentro dele a a a a a a a se se a susuoos o dsuarioform,que ira mapear os dados que recebemos atraves da sensi semo o HTTP e Converted ess dados para nossa classe entityUsuarioForm
    import com.example.ddd.core.usuario.Usuario;
    
    public class UsuarioForm {
    
        private String name;
    
        private String email;
    
        private String cpf;
    
        public UsuarioForm(String name, String email, String cpf) {
            this.name = name;
            this.email = email;
            this.cpf = cpf;
        }
    
        public Usuario converte() {
    
            return new Usuario(name,email,cpf);
        }
    }
    
    
    パッケージパッケージoutputDto プレミアムパッケージusuario E Dentro dele a a a a a a a a ira ira mapear os dados que iremos retornar para nossa rensi menlo o http .UsuarioDto
    public class UsuarioDto {
    
        private Long id;
    
        private String name;
    
        private String email;
    
        private String cpf;
    
        public Long getId() {
            return id;
        }
    
        public String getName() {
            return name;
        }
    
        public String getEmail() {
            return email;
        }
    
        public String getCpf() {
            return cpf;
        }
    
        public UsuarioDto(Long id, String name, String email, String cpf) {
            this.id = id;
            this.name = name;
            this.email = email;
            this.cpf = cpf;
        }
    }
    
    Vamos Agora Rodar Nossa Aplica Oprica O e e Testa la Post man , Mas Para Isso ser de necess by rio subirmos nosso banco de dados postgres , na raiz de nossa aplicaの結果docker-compose.yml .docker-compose.yml
    version: '3'
    
    services:
    
      postgres:
        image: 'postgres:alpine'
        volumes:
          - postgres-volume:/var/lib/postgresql/data
        ports:
          - 5432:5432
        environment:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: password
    
    volumes:
      postgres-volume:
    
    ペトロCMDは、naパスタondedocker-compose.yml E・ロドo Seguinte Comandodocker compose up -d
                **Usuario Cadastrado com Sucesso**
    


    na segunda parte deste post vamos fazer a transi pose o o da nossa aplica displo o o do postgres paro o Dynamodb,para acessar e so clclar no link abaixo