<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bruno Gonzaga Santos</title>
    <description>The latest articles on DEV Community by Bruno Gonzaga Santos (@bgsantos86).</description>
    <link>https://dev.to/bgsantos86</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F131613%2Fc74a0da1-08ab-48e8-ad62-070b5b022a77.jpeg</url>
      <title>DEV Community: Bruno Gonzaga Santos</title>
      <link>https://dev.to/bgsantos86</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bgsantos86"/>
    <language>en</language>
    <item>
      <title>Criando um micro-serviço com Spring Boot, Docker e MariaDB na Azure - Parte 2</title>
      <dc:creator>Bruno Gonzaga Santos</dc:creator>
      <pubDate>Thu, 09 Mar 2023 02:35:48 +0000</pubDate>
      <link>https://dev.to/bgsantos86/criando-um-micro-servico-com-spring-boot-docker-e-mariadb-na-azure-parte-2-3i8n</link>
      <guid>https://dev.to/bgsantos86/criando-um-micro-servico-com-spring-boot-docker-e-mariadb-na-azure-parte-2-3i8n</guid>
      <description>&lt;p&gt;Na &lt;a href="https://dev.to/bgsantos86/criando-um-micro-servico-com-spring-boot-docker-e-mariadb-na-azure-parte-1-5192"&gt;Parte 1&lt;/a&gt;, discutimos a criação de um microserviço para propriedades imobiliárias usando Spring Boot. Também abordamos a implantação do uso do MariaDB como banco de dados, que foi instalado em um contêiner separado. Concluímos apresentando o processo de criação de um servidor MariaDB no Docker para permitir a comunicação entre nosso microserviço e o banco de dados.&lt;/p&gt;

&lt;p&gt;Agora na Parte 2, daremos continuidade ao nosso projeto, onde vamos realizar o deploy da aplicação na Azure. Para isso, iremos criar um registro de contêineres na Azure e fazer o push da imagem da nossa aplicação para esse registro. Em seguida, utilizaremos a Azure CLI para criar um serviço de contêiner na Azure, permitindo que nossa aplicação fosse executada dentro do ambiente da Azure.&lt;/p&gt;

&lt;p&gt;Na última parte a Parte 3, vamos dar continuidade ao projeto, criando um servidor MariaDB na Azure. Isso permitirá estabelecer a comunicação entre nosso microserviço e o banco de dados dentro do mesmo ambiente Azure. Com essa implementação, teremos um microserviço totalmente funcional para propriedades imobiliárias, capaz de gerenciar dados e realizar operações CRUD em tempo real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando o Docker e a Azure
&lt;/h2&gt;

&lt;p&gt;Antes de começarmos a configurar o Docker e a Azure, é necessário criar uma conta na Azure e instalar a Azure CLI em sua máquina. A Azure CLI é uma ferramenta de linha de comando que permite interagir com serviços da Azure diretamente do seu terminal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando uma conta na Azure e instalando a Azure CLI
&lt;/h3&gt;

&lt;p&gt;Para criar uma conta na Azure, siga os seguintes passos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Acesse o site &lt;a href="https://azure.microsoft.com/pt-br/free/"&gt;https://azure.microsoft.com/pt-br/free/&lt;/a&gt; e siga as instruções para criar uma conta gratuita.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Depois de criar a conta, você pode fazer login na Azure usando suas credenciais.&lt;br&gt;
Para instalar a Azure CLI em seu sistema operacional, siga os seguintes passos:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Acesse o site &lt;a href="https://docs.microsoft.com/pt-br/cli/azure/install-azure-cli"&gt;https://docs.microsoft.com/pt-br/cli/azure/install-azure-cli&lt;/a&gt; e siga as instruções para a instalação em seu sistema operacional.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Criando um registro de contêineres na Azure
&lt;/h3&gt;

&lt;p&gt;Um registro de contêineres na Azure é um serviço que permite armazenar imagens Docker em um repositório privado. Para criar um registro de contêineres, siga os seguintes passos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Acesse o portal da Azure em &lt;a href="https://portal.azure.com/"&gt;https://portal.azure.com/&lt;/a&gt;.
Clique em "Criar um recurso" no menu à esquerda.&lt;/li&gt;
&lt;li&gt;Na página de criação de recursos, pesquise por "Registro de Contêineres" e selecione a opção "Registro de Contêineres" na lista de resultados.&lt;/li&gt;
&lt;li&gt;Preencha as informações necessárias para criar o registro de contêineres, como nome (houseflippingregistercontainer), grupo de recursos (rg-houseflipping) e localização (Brazil South).&lt;/li&gt;
&lt;li&gt;Clique em "Revisar e criar" para finalizar a criação do registro de contêineres.&lt;/li&gt;
&lt;li&gt;Para fazer o push das imagens para o registro de contêineres criado, é necessário fazer o login no Docker. Para fazer isso, execute o comando az acr login --name houseflippingregistercontainer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Além disso, é importante acessar a seção de configurações do registro de contêineres no portal da Azure e habilitar a opção "admin user". Isso permitirá que você tenha acesso às credenciais de administrador, como o nome de usuário e a senha necessários para fazer o push das imagens.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qPhsOvw4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jujf576uri6tgkrkj1cb.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qPhsOvw4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jujf576uri6tgkrkj1cb.PNG" alt="Access keys" width="880" height="227"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com o registro de contêineres configurado e o Docker devidamente autenticado, você poderá criar e fazer o push de suas imagens Docker para o registro de contêineres na Azure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KbJUc0E3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/igyfu9b6wj526t7nqdfr.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KbJUc0E3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/igyfu9b6wj526t7nqdfr.PNG" alt="Registro de containers" width="853" height="1138"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando uma imagem Docker da aplicação
&lt;/h2&gt;

&lt;p&gt;Para criar uma imagem Docker da sua aplicação, você precisará compilar a aplicação em um arquivo JAR e criar um arquivo Dockerfile. O Dockerfile é um arquivo de configuração que define como a imagem Docker será criada a partir dos arquivos da sua aplicação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gerando o arquivo JAR da aplicação
&lt;/h3&gt;

&lt;p&gt;Antes de criar a imagem Docker da sua aplicação, é necessário gerar o arquivo JAR a partir do código-fonte da aplicação. Para isso, você pode usar o Maven, que é uma ferramenta de gerenciamento de dependências e compilação de código em Java.&lt;/p&gt;

&lt;p&gt;Certifique-se de que você tem o Maven instalado em sua máquina e que seu projeto Maven está configurado corretamente. Para gerar o arquivo JAR da aplicação, abra um terminal na pasta raiz do projeto e execute o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mvn clean package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este comando irá compilar o código-fonte da aplicação e gerar o arquivo JAR na pasta "target" do projeto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando o arquivo Dockerfile
&lt;/h3&gt;

&lt;p&gt;Depois de gerar o arquivo JAR da aplicação, é necessário criar um arquivo Dockerfile para definir como a imagem Docker será criada. Aqui está um exemplo de Dockerfile para a nossa aplicação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; openjdk:17-jdk-alpine&lt;/span&gt;
&lt;span class="k"&gt;VOLUME&lt;/span&gt;&lt;span class="s"&gt; /tmp&lt;/span&gt;
&lt;span class="k"&gt;ARG&lt;/span&gt;&lt;span class="s"&gt; JAR_FILE=target/imoveis-0.0.1-SNAPSHOT.jar&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; ${JAR_FILE} app.jar&lt;/span&gt;
&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["java","-jar","/app.jar"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este Dockerfile define uma imagem base do OpenJDK 17 com Alpine Linux, copia o arquivo JAR da sua aplicação para a imagem e define o comando de entrada da imagem para executar o arquivo JAR.&lt;/p&gt;

&lt;p&gt;Criando a imagem Docker&lt;br&gt;
Depois de criar o arquivo Dockerfile, você pode criar a imagem Docker da sua aplicação usando o comando &lt;code&gt;docker build&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O comando &lt;code&gt;docker build&lt;/code&gt; é utilizado para criar uma nova imagem Docker a partir de um conjunto de instruções definidas em um arquivo Dockerfile.&lt;/p&gt;

&lt;p&gt;Para criar a imagem Docker da sua aplicação, abra um terminal na pasta raiz do projeto e execute o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;docker build -t houseflippingregistercontainer.azurecr.io/imovel:latest .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O parâmetro &lt;code&gt;-t&lt;/code&gt; define o nome e a tag da imagem. No exemplo acima, o nome da imagem é "houseflippingregistercontainer.azurecr.io/imovel" e a tag é "latest". A tag serve para identificar a versão da imagem.&lt;/p&gt;

&lt;p&gt;O ponto no final do comando indica o contexto do build. Nesse caso, o contexto é a pasta atual, onde se encontra o arquivo Dockerfile.&lt;/p&gt;

&lt;p&gt;Ao executar esse comando, o Docker vai ler as instruções contidas no Dockerfile e criar uma nova imagem Docker com base nelas. O processo de build pode levar alguns minutos, dependendo do tamanho da sua aplicação e das dependências que precisam ser baixadas.&lt;/p&gt;

&lt;p&gt;Uma vez que o build for concluído com sucesso, você terá uma nova imagem Docker criada com o nome e a tag especificados no comando. Essa imagem pode ser usada para criar novos contêineres da sua aplicação ou pode ser empurrada para um registro de contêineres para armazenamento e distribuição.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fazendo o push da imagem Docker para o registro de contêineres
&lt;/h3&gt;

&lt;p&gt;Depois de criar a imagem Docker da sua aplicação, é necessário fazer o push da imagem para um registro de contêineres. Aqui, assumimos que você já criou um registro de contêineres na Azure, conforme descrito anteriormente neste post.&lt;/p&gt;

&lt;p&gt;Para fazer o push da imagem Docker para o registro de contêineres, execute o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker push houseflippingregistercontainer.azurecr.io/imovel:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comando acima irá empurrar a imagem Docker com o nome "imovel" e a tag "latest" para o registro de contêineres "houseflippingregistercontainer.azurecr.io".&lt;/p&gt;

&lt;p&gt;Antes de executar o comando, é necessário ter certeza de que o Docker está autenticado na conta da Azure e no registro de contêineres. Para fazer isso, execute o comando &lt;code&gt;az acr login --name houseflippingregistercontainer&lt;/code&gt; no terminal, substituindo "houseflippingregistercontainer" pelo nome do registro de contêineres que você criou.&lt;/p&gt;

&lt;p&gt;Certifique-se de executar esse comando no diretório raiz do seu projeto Spring Boot, onde o Dockerfile está presente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iYUzY3CS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pf08ttudxn67bqh639rb.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iYUzY3CS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pf08ttudxn67bqh639rb.PNG" alt="Print dos comandos docker" width="880" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fazendo o deploy da aplicação na Azure
&lt;/h2&gt;

&lt;p&gt;Agora que você tem a imagem Docker da sua aplicação no registro de contêineres e um grupo de recursos na Azure, pode criar o serviço de contêiner na Azure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando uma máscara para o campo de password
&lt;/h3&gt;

&lt;p&gt;Antes de mais nada, é importante mencionar que para evitar expor a senha do registro de contêineres no comando da Azure CLI, é possível criar uma máscara para o campo de password. Para isso, execute o seguinte comando na linha de comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; REGISTRY_PASSWORD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso fará com que a senha seja digitada sem que os caracteres apareçam na tela.&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando o serviço de contêiner na Azure
&lt;/h3&gt;

&lt;p&gt;Para criar o serviço de contêiner, execute o seguinte comando na Azure CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az container create &lt;span class="nt"&gt;--name&lt;/span&gt; houseflippingcontainer &lt;span class="nt"&gt;--resource-group&lt;/span&gt; rg-houseflipping &lt;span class="nt"&gt;--image&lt;/span&gt; houseflippingregistercontainer.azurecr.io/imovel:latest &lt;span class="nt"&gt;--cpu&lt;/span&gt; 2 &lt;span class="nt"&gt;--memory&lt;/span&gt; 8 &lt;span class="nt"&gt;--ports&lt;/span&gt; 8080 &lt;span class="nt"&gt;--registry-login-server&lt;/span&gt; houseflippingregistercontainer.azurecr.io &lt;span class="nt"&gt;--registry-username&lt;/span&gt; houseFlippingContainer &lt;span class="nt"&gt;--registry-password&lt;/span&gt; &lt;span class="nv"&gt;$REGISTRY_PASSWORD&lt;/span&gt; &lt;span class="nt"&gt;--ip-address&lt;/span&gt; public
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos dissecar esse comando para entender o que cada argumento faz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--name houseflippingcontainer&lt;/code&gt;: define o nome do serviço de contêiner que será criado na Azure.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--resource-group rg-houseflipping&lt;/code&gt;: define o nome do grupo de recursos no qual o serviço de contêiner será criado.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--image houseflippingregistercontainer.azurecr.io/imovel:latest&lt;/code&gt;: define o nome e a versão da imagem Docker que será usada para criar o serviço de contêiner.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--cpu 2&lt;/code&gt;: define a quantidade de CPUs alocada para o serviço de contêiner.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--memory 8&lt;/code&gt;: define a quantidade de memória alocada para o serviço de contêiner.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--ports 8080&lt;/code&gt;: define a porta que será exposta pelo serviço de contêiner. No caso do exemplo, a porta 8080 será mapeada para o serviço de contêiner.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--registry-login-server houseflippingregistercontainer.azurecr.io&lt;/code&gt;: define o servidor de registro de contêineres que será usado para o serviço de contêiner.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--registry-username houseFlippingContainer&lt;/code&gt;: define o nome de usuário para autenticar no registro de contêineres.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--registry-password $REGISTRY_PASSWORD&lt;/code&gt;: define a senha para autenticar no registro de contêineres. Note que o comando $REGISTRY_PASSWORD é usado para obter a senha da variável definida anteriormente.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--ip-address public&lt;/code&gt;: define que o endereço IP do serviço de contêiner será público.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6joJ7hvP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d4l2ydj45hspl5hoj6wf.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6joJ7hvP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d4l2ydj45hspl5hoj6wf.PNG" alt="Resource Group azure" width="880" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MGiGOS6D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fcqxym1jwqftayqswr94.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MGiGOS6D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fcqxym1jwqftayqswr94.PNG" alt="Container Instances" width="880" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Verificando o status do serviço de contêiner
&lt;/h3&gt;

&lt;p&gt;Para verificar o status do serviço de contêiner, execute o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az container show &lt;span class="nt"&gt;--name&lt;/span&gt; houseflippingcontainer &lt;span class="nt"&gt;--resource-group&lt;/span&gt; rg-houseflipping &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"{FQDN:ipAddress.fqdn,ProvisioningState:provisioningState,Running:instanceView.currentState.detailStatus}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando mostra o status atual do serviço de contêiner, incluindo o endereço IP público (FQDN), o estado de provisionamento (ProvisioningState) e se o serviço está em execução (Running).&lt;/p&gt;

&lt;h3&gt;
  
  
  Atualizando o serviço de contêiner
&lt;/h3&gt;

&lt;p&gt;Para atualizar o serviço de contêner, execute o seguinte comando na Azure CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az container update &lt;span class="nt"&gt;--name&lt;/span&gt; houseflippingcontainer &lt;span class="nt"&gt;--resource-group&lt;/span&gt; rg-houseflipping &lt;span class="nt"&gt;--cpu&lt;/span&gt; 4 &lt;span class="nt"&gt;--memory&lt;/span&gt; 16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando atualiza a quantidade de CPUs alocada para o serviço de contêiner para 4 e a quantidade de memória alocada para 16.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deletando o serviço de contêiner
&lt;/h3&gt;

&lt;p&gt;Para deletar o serviço de contêiner, execute o seguinte comando na Azure CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az container delete &lt;span class="nt"&gt;--name&lt;/span&gt; houseflippingcontainer &lt;span class="nt"&gt;--resource-group&lt;/span&gt; rg-houseflipping &lt;span class="nt"&gt;--yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando deleta o serviço de contêiner especificado. Note que o argumento &lt;code&gt;--yes&lt;/code&gt; é usado para confirmar a exclusão sem a necessidade de confirmação adicional.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>docker</category>
      <category>spring</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Criando um micro-serviço com Spring Boot, Docker e MariaDB na Azure - Parte 1</title>
      <dc:creator>Bruno Gonzaga Santos</dc:creator>
      <pubDate>Fri, 03 Mar 2023 02:43:31 +0000</pubDate>
      <link>https://dev.to/bgsantos86/criando-um-micro-servico-com-spring-boot-docker-e-mariadb-na-azure-parte-1-5192</link>
      <guid>https://dev.to/bgsantos86/criando-um-micro-servico-com-spring-boot-docker-e-mariadb-na-azure-parte-1-5192</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Nota: O código deste tutorial pode ser acessado via &lt;a href="https://github.com/obrunogonzaga/Imovel"&gt;https://github.com/obrunogonzaga/Imovel&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Você já pensou em criar um micro-serviço escalável e flexível? Se a resposta é sim, você está no lugar certo! Neste guia, vamos criar juntos um micro-serviço usando o poderoso ecossistema de tecnologias Spring Boot, Docker e MariaDB, tudo isso executado na nuvem da plataforma Azure. Acompanhe os passos a seguir e descubra como é fácil criar um aplicativo robusto baseado em micro-serviços.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escopo do projeto
&lt;/h2&gt;

&lt;p&gt;O objetivo deste projeto é criar o micro-serviço "Imovel" como parte do sistema "House Flipping", que gerencia as informações dos imóveis disponíveis para compra e venda. O micro-serviço, desenvolvido em Spring Boot e Java 17, se integra com um banco de dados MariaDB e permite aos usuários visualizar, buscar, salvar e criar/editar listas de imóveis para venda. Após ser desenvolvido e testado, o micro-serviço será implantado em um contêiner Docker na Azure, podendo ser integrado a outros micro-serviços e no sistema maior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;p&gt;Para seguir este tutorial e criar um micro-serviço de gerenciamento de imóveis usando Spring Boot e Java 17, configurar um banco de dados MariaDB em um contêiner Docker dentro da Azure, e implantar a aplicação em um contêiner Docker na Azure, você precisa ter conhecimentos básicos em programação em Java, desenvolvimento web e API REST, contêineres e sua utilização em desenvolvimento e implantação de aplicativos, SQL e bancos de dados relacionais como o MariaDB, além de familiaridade com o uso de um sistema de controle de versão, como o Git, para gerenciar o código-fonte da aplicação. Além disso, é necessário ter as seguintes ferramentas: Java 17, Maven, Docker, Azure CLI e MariaDB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Objetivos
&lt;/h2&gt;

&lt;p&gt;O objetivo desta parte é criar um micro-serviço chamado Imovel utilizando Spring Boot e Maven. Para isso, será necessário criar uma entidade "Imovel" com as características de um imóvel, um repositório para realizar as operações de CRUD na entidade, um serviço para implementar a lógica de negócios relacionada a imóveis e um controlador para expor os serviços REST da aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando o banco de dados
&lt;/h2&gt;

&lt;p&gt;Agora, vamos configurar o banco de dados MariaDB. Para isso, você pode criar um container Docker com a imagem oficial do MariaDB. Abra um terminal e execute o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 3306:3306 &lt;span class="nt"&gt;--name&lt;/span&gt; mariadb 
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;senha &lt;span class="nt"&gt;-d&lt;/span&gt; mariadb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando irá baixar a imagem do MariaDB e criar um container com o nome "mariadb". O parâmetro "-p" indica que a porta 3306 do container será mapeada para a porta 3306 da máquina local. O parâmetro "-e" define a senha do usuário root do banco de dados.&lt;/p&gt;

&lt;p&gt;Para verificar se o container foi criado com sucesso, execute o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você deverá ver a linha referente ao container do MariaDB com o status "Up".&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando um projeto Spring Boot
&lt;/h2&gt;

&lt;p&gt;Para criar um projeto Spring Boot para gerenciar imóveis, vamos utilizar o Spring Initializr. Acesse o site &lt;a href="https://start.spring.io/"&gt;https://start.spring.io/&lt;/a&gt; e preencha as informações do projeto, como o nome, o tipo de projeto e a versão do Spring Boot. Além disso, adicione as seguintes dependências:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring Web&lt;/li&gt;
&lt;li&gt;Spring Data JPA&lt;/li&gt;
&lt;li&gt;Spring Cloud Azure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após preencher as informações do projeto, clique em "Generate" para baixar um arquivo ZIP contendo o projeto inicial.&lt;/p&gt;

&lt;p&gt;Para gerenciar imóveis, vamos criar uma classe de &lt;code&gt;Application&lt;/code&gt; que inicializa a aplicação Spring Boot. Por exemplo, crie a classe &lt;code&gt;ImovelApplication&lt;/code&gt; no pacote &lt;code&gt;br.com.houseflipping.imoveis&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;br.com.houseflipping.imoveis&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.boot.SpringApplication&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.boot.autoconfigure.SpringBootApplication&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@SpringBootApplication&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ImovelApplication&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;SpringApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ImovelApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A anotação &lt;code&gt;@SpringBootApplication&lt;/code&gt; indica que esta é uma classe de configuração para o Spring Boot. Ela inclui as seguintes anotações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@Configuration&lt;/code&gt;: indica que esta classe é uma classe de configuração Spring.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@EnableAutoConfiguration&lt;/code&gt;: permite que o Spring Boot configure automaticamente a aplicação com base nas dependências adicionadas ao projeto.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@ComponentScan&lt;/code&gt;: instrui o Spring a procurar e carregar todos os componentes anotados com &lt;code&gt;@Component&lt;/code&gt; no pacote atual e em seus subpacotes. Note que a classe &lt;code&gt;ImovelApplication&lt;/code&gt; é definida no pacote &lt;code&gt;br.com.houseflipping.imoveis&lt;/code&gt;. Isso significa que todas as classes do projeto devem ser definidas dentro do pacote &lt;code&gt;br.com.houseflipping.imoveis&lt;/code&gt; ou em subpacotes deste.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por fim, adicione as seguintes dependências ao arquivo pom.xml para incluir as dependências do Spring Web, Spring Data JPA e Spring Cloud Azure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-data-jpa&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.microsoft.azure&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-cloud-azure-appconfiguration-config&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.4.1&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.microsoft.azure&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;azure-storage&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;8.6.6&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.mariadb.jdbc&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;mariadb-java-client&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.7.2&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com essas dependências adicionadas, você estará pronto para começar a desenvolver o seu projeto para gerenciar imóveis utilizando o Spring Boot e a Azure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando a entidade Imovel
&lt;/h2&gt;

&lt;p&gt;Agora, vamos criar a entidade &lt;code&gt;Imovel&lt;/code&gt; com os principais atributos de um imóvel. Crie uma nova classe chamada &lt;code&gt;Imovel&lt;/code&gt; na pasta &lt;code&gt;src/main/java&lt;/code&gt; com o seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;br.com.houseflipping.entity&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.persistence.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Entity&lt;/span&gt;
&lt;span class="nd"&gt;@Table&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"imoveis"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Imovel&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Id&lt;/span&gt;
    &lt;span class="nd"&gt;@GeneratedValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GenerationType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;IDENTITY&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;tipo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;numeroQuartos&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;numeroBanheiros&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Double&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Double&lt;/span&gt; &lt;span class="n"&gt;preco&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// getters e setters&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa classe representa a tabela &lt;code&gt;imoveis&lt;/code&gt; no banco de dados. As anotações &lt;code&gt;@Entity&lt;/code&gt; e &lt;code&gt;@Table&lt;/code&gt; definem a tabela correspondente e a anotação &lt;code&gt;@Id&lt;/code&gt; define o campo &lt;code&gt;id&lt;/code&gt; como chave primária com auto-incremento. Os demais atributos correspondem às colunas da tabela.&lt;/p&gt;

&lt;p&gt;Os novos atributos incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tipo&lt;/code&gt;: o tipo de imóvel (casa ou apartamento, por exemplo)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;endereco&lt;/code&gt;: o endereço do imóvel&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;numeroQuartos&lt;/code&gt;: o número de quartos do imóvel&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;numeroBanheiros&lt;/code&gt;: o número de banheiros do imóvel&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;area&lt;/code&gt;: a área do imóvel em metros quadrados&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;preco&lt;/code&gt;: o preço do imóvel em reais&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses atributos representam características físicas e financeiras do imóvel e podem ser utilizados para filtrar e buscar imóveis por diferentes critérios. Vamos adicionar outros atributos, como número de vagas na garagem, área externa, piscina, etc., de acordo com as necessidades do projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando o repositório
&lt;/h2&gt;

&lt;p&gt;O repositório é responsável por manipular as entidades em um banco de dados. No Spring Boot, é possível criar um repositório facilmente utilizando a interface JpaRepository do Spring Data JPA. Essa interface define operações básicas de CRUD (&lt;em&gt;Create&lt;/em&gt;, &lt;em&gt;Read&lt;/em&gt;, &lt;em&gt;Update&lt;/em&gt;, &lt;em&gt;Delete&lt;/em&gt;) para a entidade correspondente.&lt;/p&gt;

&lt;p&gt;Para criar um repositório para a entidade &lt;code&gt;Imovel&lt;/code&gt;, vamos criar uma nova interface chamada &lt;code&gt;ImovelRepository&lt;/code&gt;. Essa interface deve estender a interface JpaRepository e informar o tipo da entidade e o tipo da chave primária. No nosso caso, a entidade é &lt;code&gt;Imovel&lt;/code&gt; e a chave primária é do tipo "Long".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Repository&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;ImovelRepository&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;JpaRepository&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Imovel&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A anotação &lt;code&gt;@Repository&lt;/code&gt; indica que essa interface é um componente Spring e será gerenciada pelo contêiner. Com essa interface, já é possível utilizar as operações básicas de CRUD no banco de dados para a entidade &lt;code&gt;Imovel&lt;/code&gt;. Por exemplo, para salvar um novo objeto &lt;code&gt;Imovel&lt;/code&gt;, basta chamar o método "save" do repositório:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Imovel&lt;/span&gt; &lt;span class="n"&gt;imovel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Imovel&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;imovel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTipo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Casa"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;imovel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setEndereco&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Rua dos Bobos, 0"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;imovel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setPreco&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;100000.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;ImovelRepository&lt;/span&gt; &lt;span class="n"&gt;imovelRepository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;...;&lt;/span&gt; &lt;span class="c1"&gt;// obter instância do repositório&lt;/span&gt;
&lt;span class="nc"&gt;Imovel&lt;/span&gt; &lt;span class="n"&gt;imovelSalvo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;imovelRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;imovel&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;code&gt;save&lt;/code&gt; retorna o objeto &lt;code&gt;Imovel&lt;/code&gt; salvo no banco de dados, com o ID gerado automaticamente pelo banco (se a estratégia de geração de ID for "&lt;em&gt;IDENTITY&lt;/em&gt;" ou "&lt;em&gt;SEQUENCE&lt;/em&gt;").&lt;/p&gt;

&lt;p&gt;Além das operações básicas de CRUD, é possível definir outras consultas personalizadas no repositório utilizando o recurso de Query Methods do Spring Data JPA. Por exemplo, para buscar todos os objetos "&lt;em&gt;Imovel&lt;/em&gt;" cujo tipo seja "&lt;em&gt;Casa&lt;/em&gt;", basta definir um método na interface com o nome adequado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Repository&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;ImovelRepository&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;JpaRepository&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Imovel&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Imovel&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;findByTipo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;tipo&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse método retorna uma lista de objetos "&lt;em&gt;Imovel&lt;/em&gt;" cujo atributo &lt;code&gt;tipo&lt;/code&gt; seja igual ao parâmetro informado. Para utilizá-lo, basta chamar o método &lt;code&gt;findByTipo&lt;/code&gt; do repositório:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;ImovelRepository&lt;/span&gt; &lt;span class="n"&gt;imovelRepository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;...;&lt;/span&gt; &lt;span class="c1"&gt;// obter instância do repositório&lt;/span&gt;
&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Imovel&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;imoveisCasa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;imovelRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findByTipo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Casa"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para configurar o banco de dados MariaDB no Spring Boot, você pode adicionar as propriedades de configuração do banco de dados no arquivo application.properties. A seção de configuração do banco de dados pode ficar assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Configurações do banco de dados&lt;/span&gt;
spring.datasource.url&lt;span class="o"&gt;=&lt;/span&gt;jdbc:mariadb://localhost:3306/imoveis
spring.datasource.username&lt;span class="o"&gt;=&lt;/span&gt;seu_usuario
spring.datasource.password&lt;span class="o"&gt;=&lt;/span&gt;sua_senha
spring.datasource.driver-class-name&lt;span class="o"&gt;=&lt;/span&gt;org.mariadb.jdbc.Driver

&lt;span class="c"&gt;# Configurações do Hibernate&lt;/span&gt;
spring.jpa.show-sql&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
&lt;/span&gt;spring.jpa.hibernate.ddl-auto&lt;span class="o"&gt;=&lt;/span&gt;update
spring.jpa.properties.hibernate.dialect&lt;span class="o"&gt;=&lt;/span&gt;org.hibernate.dialect.MariaDBDialect
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Criando o serviço
&lt;/h2&gt;

&lt;p&gt;O serviço é a camada responsável por orquestrar as chamadas ao repositório e implementar regras de negócio específicas. No nosso caso, o serviço será responsável por manipular os objetos &lt;code&gt;Imovel&lt;/code&gt; e fazer a integração com o banco de dados.&lt;/p&gt;

&lt;p&gt;Para criar o serviço, crie uma nova classe chamada &lt;code&gt;ImovelService&lt;/code&gt; na pasta &lt;code&gt;src/main/java&lt;/code&gt; com o seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ImovelService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Autowired&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;ImovelRepository&lt;/span&gt; &lt;span class="n"&gt;imovelRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Imovel&lt;/span&gt; &lt;span class="nf"&gt;salvar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Imovel&lt;/span&gt; &lt;span class="n"&gt;imovel&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;imovelRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;imovel&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Imovel&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;listar&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;imovelRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Imovel&lt;/span&gt; &lt;span class="nf"&gt;buscarPorId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Imovel&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;imovel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;imovelRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;imovel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isPresent&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;imovel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RuntimeException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Imóvel não encontrado"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;excluir&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;imovelRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deleteById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse código, utilizamos a anotação &lt;code&gt;@Service&lt;/code&gt; para indicar que essa classe é um componente Spring que será gerenciado pelo contêiner. Também utilizamos a anotação &lt;code&gt;@Autowired&lt;/code&gt; para injetar o repositório &lt;code&gt;ImovelRepository&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O método "salvar" recebe um objeto &lt;code&gt;Imovel&lt;/code&gt; como parâmetro e utiliza o método &lt;code&gt;save&lt;/code&gt; do repositório para salvar o objeto no banco de dados. O método &lt;code&gt;listar&lt;/code&gt; utiliza o método &lt;code&gt;findAll&lt;/code&gt; do repositório para listar todos os objetos &lt;code&gt;Imovel&lt;/code&gt; no banco de dados.&lt;/p&gt;

&lt;p&gt;O método &lt;code&gt;buscarPorId&lt;/code&gt; recebe um ID como parâmetro e utiliza o método &lt;code&gt;findById&lt;/code&gt; do repositório para buscar um objeto &lt;code&gt;Imovel&lt;/code&gt; no banco de dados. Caso o objeto não seja encontrado, lançamos uma exceção personalizada.&lt;/p&gt;

&lt;p&gt;O método &lt;code&gt;excluir&lt;/code&gt; recebe um ID como parâmetro e utiliza o método &lt;code&gt;deleteById&lt;/code&gt; do repositório para excluir o objeto correspondente no banco de dados.&lt;/p&gt;

&lt;p&gt;Com o serviço implementado, agora podemos utilizá-lo no controlador para expor os endpoints REST.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando o controlador
&lt;/h2&gt;

&lt;p&gt;Um controlador é responsável por mapear as requisições HTTP para métodos Java que processam essas requisições e retornam uma resposta. No nosso caso, vamos criar um controlador para expor os serviços REST da nossa aplicação.&lt;/p&gt;

&lt;p&gt;Para criar um controlador em Spring Boot, você pode criar uma classe Java anotada com &lt;code&gt;@RestController&lt;/code&gt;. Essa anotação indica que a classe é um controlador Spring que retorna objetos em formato JSON.&lt;/p&gt;

&lt;p&gt;Além disso, você pode usar outras anotações para definir as URLs dos endpoints e os métodos HTTP suportados. Algumas anotações comuns são &lt;code&gt;@RequestMapping&lt;/code&gt;, &lt;code&gt;@PostMapping&lt;/code&gt;, &lt;code&gt;@GetMapping&lt;/code&gt;, &lt;code&gt;@PutMapping&lt;/code&gt; e &lt;code&gt;@DeleteMapping&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Vamos criar um controlador para expor os serviços REST da nossa entidade &lt;code&gt;Imovel&lt;/code&gt;. Abra uma nova classe chamada &lt;code&gt;ImovelController&lt;/code&gt; na pasta &lt;code&gt;src/main/java&lt;/code&gt; com o seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@RestController&lt;/span&gt;
&lt;span class="nd"&gt;@RequestMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/imoveis"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ImovelController&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Autowired&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;ImovelService&lt;/span&gt; &lt;span class="n"&gt;imovelService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@PostMapping&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Imovel&lt;/span&gt; &lt;span class="nf"&gt;salvar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@RequestBody&lt;/span&gt; &lt;span class="nc"&gt;Imovel&lt;/span&gt; &lt;span class="n"&gt;imovel&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;imovelService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;salvar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;imovel&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@GetMapping&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Imovel&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;listar&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;imovelService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listar&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@GetMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/{id}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Imovel&lt;/span&gt; &lt;span class="nf"&gt;buscarPorId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathVariable&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;imovelService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;buscarPorId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@DeleteMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/{id}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;excluir&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathVariable&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;imovelService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;excluir&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos entender o que esse código faz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A anotação &lt;code&gt;@RestController&lt;/code&gt; indica que essa classe é um controlador Spring que retorna objetos em formato JSON.&lt;/li&gt;
&lt;li&gt;A anotação &lt;code&gt;@RequestMapping&lt;/code&gt; define o prefixo da URL para acessar os endpoints.&lt;/li&gt;
&lt;li&gt;A anotação &lt;code&gt;@Autowired&lt;/code&gt; injeta a dependência do serviço &lt;code&gt;ImovelService&lt;/code&gt; criado anteriormente.&lt;/li&gt;
&lt;li&gt;O método &lt;code&gt;salvar&lt;/code&gt; é mapeado para a URL &lt;code&gt;/imoveis&lt;/code&gt; com o método HTTP POST. Ele recebe um objeto &lt;code&gt;Imovel&lt;/code&gt; no formato JSON no corpo da requisição e chama o método &lt;code&gt;salvar&lt;/code&gt; do serviço &lt;code&gt;ImovelService&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;O método &lt;code&gt;listar&lt;/code&gt; é mapeado para a URL &lt;code&gt;/imoveis&lt;/code&gt; com o método HTTP GET. Ele chama o método "listar" do serviço &lt;code&gt;ImovelService&lt;/code&gt; e retorna a lista de objetos &lt;code&gt;Imovel&lt;/code&gt; no formato JSON.&lt;/li&gt;
&lt;li&gt;O método &lt;code&gt;buscarPorId&lt;/code&gt; é mapeado para a URL &lt;code&gt;/imoveis/{id}&lt;/code&gt; com o método HTTP GET. Ele recebe um parâmetro &lt;code&gt;id&lt;/code&gt; na URL e chama o método &lt;code&gt;buscarPorId&lt;/code&gt; do serviço &lt;code&gt;ImovelService&lt;/code&gt; para buscar o objeto &lt;code&gt;Imovel&lt;/code&gt; correspondente. Se o objeto não for encontrado, retorna uma resposta HTTP com código 404.&lt;/li&gt;
&lt;li&gt;O método &lt;code&gt;excluir&lt;/code&gt; é mapeado para a URL &lt;code&gt;/imoveis/{id}&lt;/code&gt; com o método HTTP DELETE. Ele recebe um parâmetro &lt;code&gt;id&lt;/code&gt; na URL e chama o método &lt;code&gt;excluir&lt;/code&gt; do serviço &lt;code&gt;ImovelService&lt;/code&gt; para excluir o objeto &lt;code&gt;Imovel&lt;/code&gt; correspondente. Se o objeto não for encontrado, retorna uma resposta HTTP com código 404.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora, podemos testar nossa aplicação acessando os endpoints criados por esse controlador. Para isso, abra um navegador ou um cliente REST (como o Postman) e acesse as URLs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;POST &lt;a href="http://localhost:8080/imoveis"&gt;http://localhost:8080/imoveis&lt;/a&gt; - para salvar um novo objeto &lt;code&gt;Imovel&lt;/code&gt;
GET &lt;a href="http://localhost:8080/imoveis"&gt;http://localhost:8080/imoveis&lt;/a&gt; - para listar todos os objetos &lt;code&gt;Imovel&lt;/code&gt;
GET &lt;a href="http://localhost:8080/imoveis/%7Bid%7D"&gt;http://localhost:8080/imoveis/{id}&lt;/a&gt; - para buscar um objeto &lt;code&gt;Imovel&lt;/code&gt; por ID
DELETE &lt;a href="http://localhost:8080/imoveis/%7Bid%7D"&gt;http://localhost:8080/imoveis/{id}&lt;/a&gt; - para excluir um objeto &lt;code&gt;Imovel&lt;/code&gt; por ID
Lembre-se de substituir "localhost" pelo endereço IP da máquina onde a aplicação está rodando.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por exemplo, para salvar um novo objeto &lt;code&gt;Imovel&lt;/code&gt; via REST, você pode enviar um POST com o seguinte corpo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tipo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Apartamento"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"endereco"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rua A, 123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"numeroQuartos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"numeroBanheiros"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"area"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;75.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"preco"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;100000.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E receber uma resposta no formato JSON com o objeto salvo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tipo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Apartamento"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"endereco"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rua A, 123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"numeroQuartos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"numeroBanheiros"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"area"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;75.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"preco"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;100000.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para listar todos os objetos &lt;code&gt;Imovel&lt;/code&gt;, você pode enviar um GET para a URL &lt;code&gt;/imoveis&lt;/code&gt; e receber uma resposta no formato JSON com uma lista de objetos &lt;code&gt;Imovel&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para buscar um objeto &lt;code&gt;Imovel&lt;/code&gt; por ID, você pode enviar um GET para a URL &lt;code&gt;/imoveis/{id}&lt;/code&gt; e receber uma resposta no formato JSON com o objeto correspondente. Se o objeto não for encontrado, você receberá uma resposta com código HTTP 404.&lt;/p&gt;

&lt;p&gt;Para excluir um objeto &lt;code&gt;Imovel&lt;/code&gt; por ID, você pode enviar um DELETE para a URL &lt;code&gt;/imoveis/{id}&lt;/code&gt; e receber uma resposta vazia com código HTTP 204. Se o objeto não for encontrado, você receberá uma resposta com código HTTP 404.&lt;/p&gt;

&lt;p&gt;Com esses endpoints, você pode manipular os objetos &lt;code&gt;Imovel&lt;/code&gt; da sua aplicação por meio de uma API RESTful simples e eficiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Neste post, vimos como criar um microserviço para gerenciar imóveis utilizando o Spring Boot e a Azure. Começamos criando um projeto Spring Boot com as dependências necessárias para a nossa aplicação. Em seguida, criamos a classe Imovel para representar um imóvel e mapeamos essa classe para o banco de dados usando o Spring Data JPA.&lt;/p&gt;

&lt;p&gt;Depois, criamos o controlador ImovelController para lidar com as requisições HTTP e acessar o repositório ImovelRepository para realizar as operações no banco de dados. Por fim, configuramos o banco de dados MariaDB no Spring Boot e vimos como criar um repositório utilizando a interface JpaRepository do Spring Data JPA.&lt;/p&gt;

&lt;p&gt;Com a nossa aplicação funcionando corretamente, podemos agora fazer o deploy em um container Docker na Azure e deixar nosso microserviço disponível na nuvem para acesso externo. O que iremos fazer na parte 2 desse tutorial.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>microservices</category>
      <category>springboot</category>
      <category>docker</category>
    </item>
    <item>
      <title>Criando um microserviço em Spring Boot com Azure - Parte 1</title>
      <dc:creator>Bruno Gonzaga Santos</dc:creator>
      <pubDate>Wed, 01 Mar 2023 04:01:12 +0000</pubDate>
      <link>https://dev.to/bgsantos86/criando-um-microservico-em-spring-boot-com-azure-parte-1-3edc</link>
      <guid>https://dev.to/bgsantos86/criando-um-microservico-em-spring-boot-com-azure-parte-1-3edc</guid>
      <description>&lt;p&gt;&lt;strong&gt;importante&lt;/strong&gt;: Todo código está em Github do projeto&lt;br&gt;
&lt;a href="https://github.com/obrunogonzaga/ClubeFutebol" rel="noopener noreferrer"&gt;https://github.com/obrunogonzaga/ClubeFutebol&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste tutorial, vou mostrar como criar um microserviço em Spring Boot utilizando o Azure. Vamos utilizar um contexto de um microserviço que controla um clube de futebol para nosso exemplo, o micro-serviço será implantando em uma aplicação docker que ficará hospedada dentro da solução de container da Azure.&lt;/p&gt;
&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;p&gt;Antes de começar, é necessário ter uma conta no Azure e ter acesso ao portal do Azure. Além disso, você precisará de uma IDE Java, como Eclipse ou IntelliJ IDEA, e uma versão recente do Java e do Maven.&lt;/p&gt;
&lt;h2&gt;
  
  
  Configurando o banco de dados
&lt;/h2&gt;

&lt;p&gt;Agora, vamos configurar o banco de dados MariaDB. Para isso, você pode criar um container Docker com a imagem oficial do MariaDB. Abra um terminal e execute o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 3306:3306 &lt;span class="nt"&gt;--name&lt;/span&gt; mariadb 
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;senha &lt;span class="nt"&gt;-d&lt;/span&gt; mariadb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando irá baixar a imagem do MariaDB e criar um container com o nome "mariadb". O parâmetro "-p" indica que a porta 3306 do container será mapeada para a porta 3306 da máquina local. O parâmetro "-e" define a senha do usuário root do banco de dados.&lt;/p&gt;

&lt;p&gt;Para verificar se o container foi criado com sucesso, execute o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você deverá ver a linha referente ao container do MariaDB com o status "Up".&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando um projeto Spring Boot
&lt;/h2&gt;

&lt;p&gt;Para criar um projeto Spring Boot para gerenciar clubes de futebol, vamos utilizar o Spring Initializr. Acesse o site &lt;a href="https://start.spring.io/" rel="noopener noreferrer"&gt;https://start.spring.io/&lt;/a&gt; e preencha as informações do projeto, como o nome, o tipo de projeto e a versão do Spring Boot. Além disso, adicione as seguintes dependências:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring Web&lt;/li&gt;
&lt;li&gt;Spring Data JPA&lt;/li&gt;
&lt;li&gt;Spring Cloud Azure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após preencher as informações do projeto, clique em "Generate" para baixar um arquivo ZIP contendo o projeto inicial.&lt;/p&gt;

&lt;p&gt;Para gerenciar clubes de futebol, vamos criar uma classe de Application que inicializa a aplicação Spring Boot. Por exemplo, crie a classe &lt;code&gt;ClubeFutebolApplication&lt;/code&gt; no pacote &lt;code&gt;br.com.devto.clube&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;br.com.devto.clube&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.boot.SpringApplication&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.boot.autoconfigure.SpringBootApplication&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@SpringBootApplication&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ClubeFutebolApplication&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;SpringApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ClubeFutebolApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A anotação &lt;code&gt;@SpringBootApplication&lt;/code&gt; indica que esta é uma classe de configuração para o Spring Boot. Ela inclui as seguintes anotações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@Configuration&lt;/code&gt;: indica que esta classe é uma classe de configuração Spring.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@EnableAutoConfiguration&lt;/code&gt;: permite que o Spring Boot configure automaticamente a aplicação com base nas dependências adicionadas ao projeto.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@ComponentScan&lt;/code&gt;: instrui o Spring a procurar e carregar todos os componentes anotados com @Component no pacote atual e em seus subpacotes.
Note que a classe &lt;code&gt;ClubeFutebolApplication&lt;/code&gt; é definida no pacote br.com.devto.clube. Isso significa que todas as classes do projeto devem ser definidas dentro do pacote &lt;code&gt;br.com.devto.clube&lt;/code&gt; ou em subpacotes deste.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por fim, adicione as seguintes dependências ao arquivo &lt;code&gt;pom.xml&lt;/code&gt; para incluir as dependências do Spring Web, Spring Data JPA e Spring Cloud Azure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-data-jpa&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.microsoft.azure&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-cloud-azure-appconfiguration-config&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.4.1&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.microsoft.azure&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;azure-storage&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;8.6.6&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com essas dependências adicionadas, você estará pronto para começar a desenvolver o seu projeto para gerenciar clubes de futebol utilizando o Spring Boot e o Azure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definindo a classe de entidade
&lt;/h2&gt;

&lt;p&gt;Para gerenciar clubes de futebol, vamos criar uma classe de entidade para representar os clubes no banco de dados. Por exemplo, crie a classe Clube no pacote &lt;code&gt;br.com.devto.clube.entity&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;br.com.devto.clube.entity&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.persistence.Entity&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.persistence.GeneratedValue&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.persistence.GenerationType&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.persistence.Id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Entity&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Clube&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Id&lt;/span&gt;
    &lt;span class="nd"&gt;@GeneratedValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GenerationType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;IDENTITY&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;divisao&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;quantidadeSocios&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// construtores, getters e setters&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A anotação &lt;code&gt;@Entity&lt;/code&gt; indica que esta é uma classe de entidade JPA. A anotação &lt;code&gt;@Id&lt;/code&gt; indica que o atributo id é a chave primária da entidade. A anotação &lt;code&gt;@GeneratedValue&lt;/code&gt; indica que o valor da chave primária é gerado automaticamente pelo banco de dados.&lt;/p&gt;

&lt;p&gt;A classe &lt;code&gt;Clube&lt;/code&gt; possui os seguintes atributos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt;: a chave primária do clube no banco de dados.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nome&lt;/code&gt;: o nome do clube.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;divisao&lt;/code&gt;: a divisão em que o clube joga.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;quantidadeSocios&lt;/code&gt;: a quantidade de sócios do clube.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note que a classe &lt;code&gt;Clube&lt;/code&gt; é definida no pacote &lt;code&gt;br.com.devto.clube.entity&lt;/code&gt;. Isso significa que todas as classes de entidade devem ser definidas dentro do pacote &lt;code&gt;br.com.devto.clube.entity&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Por fim, é preciso definir os construtores, getters e setters da classe &lt;code&gt;Clube&lt;/code&gt;. Por exemplo, podemos definir os seguintes construtores e métodos de acesso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Clube&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Clube&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;divisao&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;quantidadeSocios&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;divisao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;divisao&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;quantidadeSocios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quantidadeSocios&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="nf"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setNome&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getDivisao&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;divisao&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setDivisao&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;divisao&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;divisao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;divisao&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;getQuantidadeSocios&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;quantidadeSocios&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setQuantidadeSocios&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;quantidadeSocios&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;quantidadeSocios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quantidadeSocios&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com a classe &lt;code&gt;Clube&lt;/code&gt; definida, estamos prontos para criar os repositórios e serviços que irão gerenciar os clubes no banco de dados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando o repositório
&lt;/h2&gt;

&lt;p&gt;Para gerenciar os clubes de futebol no banco de dados, vamos criar um repositório que define as operações de leitura e escrita dos clubes. Por exemplo, crie a interface &lt;code&gt;ClubeRepository&lt;/code&gt; no pacote &lt;code&gt;br.com.devto.clube.repository&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;br.com.devto.clube.repository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;br.com.devto.clube.entity.Clube&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.data.jpa.repository.JpaRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;ClubeRepository&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;JpaRepository&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Clube&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A interface &lt;code&gt;ClubeRepository&lt;/code&gt; estende a interface &lt;code&gt;JpaRepository&lt;/code&gt; do Spring Data JPA. Isso significa que a interface &lt;code&gt;ClubeRepository&lt;/code&gt; herda as operações básicas de CRUD (Create, Read, Update e Delete) do Spring Data JPA.&lt;/p&gt;

&lt;p&gt;Além disso, note que a interface &lt;code&gt;ClubeRepository&lt;/code&gt; é definida no pacote &lt;code&gt;br.com.devto.clube.repository&lt;/code&gt;. Isso significa que todas as interfaces de repositório devem ser definidas dentro do pacote &lt;code&gt;br.com.devto.clube.repository&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para configurar o MariaDB como o banco de dados da aplicação, é preciso adicionar a dependência do MariaDB ao arquivo &lt;code&gt;pom.xml&lt;/code&gt; do projeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.mariadb.jdbc&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;mariadb-java-client&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.7.2&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida, é preciso configurar o acesso ao banco de dados no arquivo &lt;code&gt;application.properties&lt;/code&gt;. Por exemplo, adicione as seguintes propriedades ao arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spring.datasource.url&lt;span class="o"&gt;=&lt;/span&gt;jdbc:mariadb://localhost:3306/clube_futebol
spring.datasource.username&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;seu_username&amp;gt;
spring.datasource.password&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;sua_senha&amp;gt;
spring.jpa.hibernate.ddl-auto&lt;span class="o"&gt;=&lt;/span&gt;update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As propriedades acima definem o URL de conexão com o banco de dados (no exemplo, estamos utilizando o banco &lt;code&gt;clube_futebol&lt;/code&gt;), o nome de usuário e senha para acesso ao banco de dados, e a estratégia de atualização do schema do banco de dados (&lt;code&gt;update&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Com essas configurações, o Spring Boot irá automaticamente criar as tabelas do banco de dados para a entidade &lt;code&gt;Clube&lt;/code&gt; ao iniciar a aplicação. Além disso, a interface &lt;code&gt;ClubeRepository&lt;/code&gt; já está pronta para ser utilizada pelos serviços da aplicação para manipular os clubes no banco de dados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Próximos passos
&lt;/h2&gt;

&lt;p&gt;Nos próximos post iremos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criar o nosso controller&lt;/li&gt;
&lt;li&gt;Criar o serviço para gerenciar nosso clube de futebol no banco de dados&lt;/li&gt;
&lt;li&gt;criar os endpoints HTTP que irão expor os métodos do serviço &lt;code&gt;ClubeService&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Criar e configurar nosso banco de dados em um container dentro da azure.&lt;/li&gt;
&lt;li&gt;Fazer o deploy da nossa aplicação dentro da Azure utilizando docker&lt;/li&gt;
&lt;li&gt;Criar monitorações de disponibilidade e desempenho da aplicação.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Github do projeto
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/obrunogonzaga/ClubeFutebol" rel="noopener noreferrer"&gt;https://github.com/obrunogonzaga/ClubeFutebol&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pdf</category>
      <category>css</category>
      <category>webdev</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
