<?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: Audrey-Albuquerque</title>
    <description>The latest articles on DEV Community by Audrey-Albuquerque (@a_audrey).</description>
    <link>https://dev.to/a_audrey</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%2F1016657%2F29723522-e6c5-486a-955a-57905e47dcaa.png</url>
      <title>DEV Community: Audrey-Albuquerque</title>
      <link>https://dev.to/a_audrey</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/a_audrey"/>
    <language>en</language>
    <item>
      <title>Paginação Simples e Eficiente com Spring Data 🧙‍♂️</title>
      <dc:creator>Audrey-Albuquerque</dc:creator>
      <pubDate>Sat, 25 Oct 2025 13:46:32 +0000</pubDate>
      <link>https://dev.to/a_audrey/paginacao-simples-e-eficiente-com-spring-data-51h5</link>
      <guid>https://dev.to/a_audrey/paginacao-simples-e-eficiente-com-spring-data-51h5</guid>
      <description>&lt;p&gt;Fala, dev! Hoje vamos falar sobre um recurso essencial em qualquer API REST: &lt;strong&gt;paginação&lt;/strong&gt;. Se você já teve que lidar com endpoints que retornam milhares de registros de uma vez, sabe o caos que isso pode causar. Vamos aprender a implementar paginação de forma elegante usando Spring Boot, e para deixar mais divertido, usaremos personagens do Senhor dos Anéis! &lt;/p&gt;

&lt;h2&gt;
  
  
  Por que paginar?
&lt;/h2&gt;

&lt;p&gt;Imagine que você tem um endpoint que retorna todos os personagens da Terra Média. São centenas deles! Sem paginação, você teria problemas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance ruim&lt;/strong&gt;: Carregar tudo de uma vez consome muita memória&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Experiência do usuário prejudicada&lt;/strong&gt;: Ninguém quer esperar 10 segundos para ver uma lista&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desperdício de recursos&lt;/strong&gt;: Muitas vezes o usuário só quer ver os primeiros resultados&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O que você precisa ter pronto? 📋
&lt;/h2&gt;

&lt;p&gt;Antes de começar, certifique-se de que você já tem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Uma entidade JPA&lt;/strong&gt; (no nosso caso, &lt;code&gt;Personagem&lt;/code&gt;)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&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;Personagem&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;raca&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;arma&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;ol&gt;
&lt;li&gt;
&lt;strong&gt;Um Repository&lt;/strong&gt; que estende &lt;code&gt;JpaRepository&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&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="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;PersonagemRepository&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;Personagem&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="c1"&gt;// O método findAll(Pageable) já vem pronto!&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Um DTO de resposta&lt;/strong&gt; (explicaremos o porquê logo abaixo!)
&lt;/li&gt;
&lt;/ol&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PersonagemResponseDTO&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;raca&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;arma&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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🎯 Por que usar DTO em vez de retornar a Entidade direto?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Essa é uma dúvida muito comum! Parece mais trabalho criar uma classe DTO só pra retornar os mesmos dados, né? Mas tem bons motivos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Segurança e Controle&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sua entidade pode ter campos sensíveis (senha, dados internos) que você não quer expor na API&lt;/li&gt;
&lt;li&gt;Com DTO, você escolhe exatamente o que vai na resposta&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Desacoplamento&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mudanças no banco de dados (entidade) não quebram sua API&lt;/li&gt;
&lt;li&gt;Você pode ter uma estrutura de banco diferente da estrutura de resposta&lt;/li&gt;
&lt;li&gt;Exemplo: no banco você tem &lt;code&gt;nome_completo&lt;/code&gt;, mas na API retorna &lt;code&gt;nome&lt;/code&gt; e &lt;code&gt;sobrenome&lt;/code&gt; separados&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Performance&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Você envia apenas os dados necessários pela rede&lt;/li&gt;
&lt;li&gt;Evita serializar informações desnecessárias ou relacionamentos complexos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Versionamento de API&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fica mais fácil manter múltiplas versões da API (v1, v2) com DTOs diferentes usando a mesma entidade&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Na prática:&lt;/strong&gt; Sempre use DTOs em APIs REST profissionais. É uma das principais boas práticas de arquitetura! 💪&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Uma Service com método de conversão&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&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;PersonagemService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;PersonagemRepository&lt;/span&gt; &lt;span class="n"&gt;repository&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;PersonagemService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PersonagemRepository&lt;/span&gt; &lt;span class="n"&gt;repository&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;repository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="o"&gt;;&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;PersonagemResponseDTO&lt;/span&gt; &lt;span class="nf"&gt;entityParaResponseDTO&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Personagem&lt;/span&gt; &lt;span class="n"&gt;personagem&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="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PersonagemResponseDTO&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;personagem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;personagem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;personagem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRaca&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;personagem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getArma&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="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Uma Controller REST&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&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;"/api/personagens"&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;PersonagemController&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;PersonagemService&lt;/span&gt; &lt;span class="n"&gt;service&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;PersonagemController&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PersonagemService&lt;/span&gt; &lt;span class="n"&gt;service&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;service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;service&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;Pronto! Com essa base, agora vamos adicionar a paginação! 🚀&lt;/p&gt;

&lt;p&gt;Quero compartilhar o link do meu repositorio onde apliquei paginação: &lt;br&gt;
&lt;a href="https://github.com/eu-audrey/ApiNaruto" rel="noopener noreferrer"&gt;https://github.com/eu-audrey/ApiNaruto&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Mãos à obra! 🛠️
&lt;/h2&gt;

&lt;p&gt;A boa notícia é que o Spring Data JPA torna isso super simples. Vamos precisar mexer apenas na &lt;strong&gt;Service&lt;/strong&gt; e na &lt;strong&gt;Controller&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Implementando na Service Layer
&lt;/h3&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="nc"&gt;Page&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;PersonagemResponseDTO&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;listarPersonagensPaginado&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Pageable&lt;/span&gt; &lt;span class="n"&gt;pageable&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Page&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Personagem&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;paginasDePersonagens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;personagemRepository&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="n"&gt;pageable&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;paginasDePersonagens&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&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="n"&gt;entityParaResponseDTO&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;&lt;strong&gt;O que está acontecendo aqui?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recebemos um objeto &lt;code&gt;Pageable&lt;/code&gt; que contém todas as informações de paginação (página atual, tamanho, ordenação)&lt;/li&gt;
&lt;li&gt;O método &lt;code&gt;findAll(pageable)&lt;/code&gt; do repository já faz toda a mágica de paginar no banco de dados&lt;/li&gt;
&lt;li&gt;Usamos &lt;code&gt;map()&lt;/code&gt; para converter cada entidade em DTO, mantendo a estrutura de página&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2. Criando o endpoint na Controller
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@GetMapping&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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;PersonagemResponseDTO&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;listarPersonagensPaginado&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="nd"&gt;@PageableDefault&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sort&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"nome"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Sort&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Direction&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ASC&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; 
    &lt;span class="nc"&gt;Pageable&lt;/span&gt; &lt;span class="n"&gt;pageable&lt;/span&gt;&lt;span class="o"&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;PersonagemResponseDTO&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;paginaDePersonagens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
        &lt;span class="n"&gt;personagemService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listarPersonagensPaginado&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pageable&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getContent&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paginaDePersonagens&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;&lt;strong&gt;Destrinchando o código:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@PageableDefault&lt;/code&gt; define valores padrão: primeira página, 10 itens por página, ordenado por nome&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;getContent()&lt;/code&gt; extrai apenas a lista de itens da página&lt;/li&gt;
&lt;li&gt;O Spring automaticamente reconhece parâmetros de query como &lt;code&gt;?page=0&amp;amp;size=10&amp;amp;sort=nome,asc&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Como usar na prática?
&lt;/h2&gt;

&lt;p&gt;Agora você pode fazer requisições como:&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;# Primeira página com 10 personagens&lt;/span&gt;
GET /api/personagens?page&lt;span class="o"&gt;=&lt;/span&gt;0&amp;amp;size&lt;span class="o"&gt;=&lt;/span&gt;10

&lt;span class="c"&gt;# Segunda página com 5 personagens, ordenados por raça&lt;/span&gt;
GET /api/personagens?page&lt;span class="o"&gt;=&lt;/span&gt;1&amp;amp;size&lt;span class="o"&gt;=&lt;/span&gt;5&amp;amp;sort&lt;span class="o"&gt;=&lt;/span&gt;raca,asc

&lt;span class="c"&gt;# Ordenação por múltiplos campos&lt;/span&gt;
GET /api/personagens?page&lt;span class="o"&gt;=&lt;/span&gt;0&amp;amp;size&lt;span class="o"&gt;=&lt;/span&gt;10&amp;amp;sort&lt;span class="o"&gt;=&lt;/span&gt;raca,asc&amp;amp;sort&lt;span class="o"&gt;=&lt;/span&gt;nome,asc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwunc1tnqfdff1jbe7mwl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwunc1tnqfdff1jbe7mwl.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Testando tudo! 🧪
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Testando manualmente dentro da aplicação
&lt;/h3&gt;

&lt;p&gt;A forma mais rápida de testar é usando sua própria aplicação. Veja como:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Popule seu banco com dados de teste&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Crie uma classe &lt;code&gt;DataLoader&lt;/code&gt; para inserir personagens:&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;@Component&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;PersonagemDataLoader&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;CommandLineRunner&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;PersonagemRepository&lt;/span&gt; &lt;span class="n"&gt;repository&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;PersonagemDataLoader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PersonagemRepository&lt;/span&gt; &lt;span class="n"&gt;repository&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;repository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&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;run&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="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&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;repository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saveAll&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Personagem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Frodo"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hobbit"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Bolseiro"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
                &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Personagem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Aragorn"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Humano"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Montante"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
                &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Personagem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Gandalf"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Maia"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Cajado"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
                &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Personagem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Legolas"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Elfo"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Arco e Flecha"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
                &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Personagem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Gimli"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Anão"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Machado"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
                &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Personagem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Sam"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hobbit"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Panelas"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
                &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Personagem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Boromir"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Humano"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Espada e Escudo"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
                &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Personagem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Merry"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hobbit"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Espada"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
                &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Personagem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Pippin"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hobbit"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Espada"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
                &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Personagem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Galadriel"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Elfa"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Magia"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
                &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Personagem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Elrond"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Elfo"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Espada e Magia"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
                &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Personagem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Saruman"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Maia"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Cajado"&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="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;&lt;strong&gt;2. Use ferramentas como Postman, Insomnia ou cURL&lt;/strong&gt;&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;# Teste básico&lt;/span&gt;
curl http://localhost:8080/api/personagens

&lt;span class="c"&gt;# Teste com paginação customizada&lt;/span&gt;
curl &lt;span class="s2"&gt;"http://localhost:8080/api/personagens?page=1&amp;amp;size=3&amp;amp;sort=nome,desc"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Adicione logs temporários na Service&lt;/strong&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="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Page&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;PersonagemResponseDTO&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;listarPersonagensPaginado&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Pageable&lt;/span&gt; &lt;span class="n"&gt;pageable&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Página solicitada: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;pageable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPageNumber&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Tamanho da página: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;pageable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPageSize&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ordenação: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;pageable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSort&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

    &lt;span class="nc"&gt;Page&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Personagem&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;paginasDePersonagens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;personagemRepository&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="n"&gt;pageable&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Total de elementos: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;paginasDePersonagens&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getTotalElements&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Total de páginas: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;paginasDePersonagens&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getTotalPages&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;paginasDePersonagens&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&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="n"&gt;entityParaResponseDTO&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;&lt;strong&gt;4. Verifique o SQL gerado&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Adicione isso no seu &lt;code&gt;application.properties&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;spring.jpa.show-sql&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;spring.jpa.properties.hibernate.format_sql&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você verá o SQL com &lt;code&gt;LIMIT&lt;/code&gt; e &lt;code&gt;OFFSET&lt;/code&gt; sendo gerado automaticamente!&lt;/p&gt;

&lt;h3&gt;
  
  
  Testando com Testes Unitários
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@SpringBootTest&lt;/span&gt;
&lt;span class="nd"&gt;@AutoConfigureMockMvc&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PersonagemControllerTest&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;MockMvc&lt;/span&gt; &lt;span class="n"&gt;mockMvc&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Test&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveRetornarPrimeiraPaginaComDezPersonagens&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mockMvc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;perform&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api/personagens"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;param&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"page"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"0"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;param&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"size"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;andExpect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;isOk&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;andExpect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jsonPath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"$.length()"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Test&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveOrdenarPersonagensPorNome&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mockMvc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;perform&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api/personagens"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;param&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"sort"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"nome,asc"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;andExpect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;isOk&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;andExpect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jsonPath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"$[0].nome"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Aragorn"&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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📌 Nota sobre @Autowired:&lt;/strong&gt; Nos testes, o &lt;code&gt;@Autowired&lt;/code&gt; ainda é usado porque o MockMvc precisa ser injetado pelo framework de testes. Mas no código de produção (Service, Controller, DataLoader), sempre prefira injeção por construtor!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Por que usar Injeção por Construtor? 🤔
&lt;/h2&gt;

&lt;p&gt;Você deve ter notado que no &lt;code&gt;DataLoader&lt;/code&gt; usamos injeção por construtor ao invés de &lt;code&gt;@Autowired&lt;/code&gt; no campo. Isso é uma &lt;strong&gt;boa prática&lt;/strong&gt; muito recomendada! Aqui está o porquê:&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens da Injeção por Construtor
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Imutabilidade com &lt;code&gt;final&lt;/code&gt;&lt;/strong&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="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;PersonagemRepository&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// ✅ Pode ser final!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com construtor, você pode marcar suas dependências como &lt;code&gt;final&lt;/code&gt;, garantindo que elas nunca sejam alteradas após a criação do objeto. Com &lt;code&gt;@Autowired&lt;/code&gt; no campo, isso não é possível.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Testabilidade&lt;/strong&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="c1"&gt;// Fica muito mais fácil testar!&lt;/span&gt;
&lt;span class="nc"&gt;PersonagemService&lt;/span&gt; &lt;span class="n"&gt;service&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;PersonagemService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mockRepository&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode criar instâncias da classe manualmente em testes, sem precisar do Spring. Com &lt;code&gt;@Autowired&lt;/code&gt; no campo, você fica preso ao container do Spring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Dependências obrigatórias explícitas&lt;/strong&gt;&lt;br&gt;
O construtor deixa claro quais são as dependências necessárias. Se você tentar criar um objeto sem passar as dependências, o código nem compila! Com &lt;code&gt;@Autowired&lt;/code&gt;, você só descobre em tempo de execução.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Menos "magia" do Spring&lt;/strong&gt;&lt;br&gt;
O código fica mais próximo do Java "puro", facilitando o entendimento por quem está aprendendo. Você vê claramente que está passando dependências, não precisa conhecer anotações específicas do Spring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Código mais limpo&lt;/strong&gt;&lt;br&gt;
A partir do Spring 4.3, se você tem apenas um construtor, nem precisa da anotação &lt;code&gt;@Autowired&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="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;PersonagemService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;PersonagemRepository&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Nem precisa de @Autowired aqui! O Spring injeta automaticamente&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;PersonagemService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PersonagemRepository&lt;/span&gt; &lt;span class="n"&gt;repository&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;repository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repository&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;h3&gt;
  
  
  Quando usar @Autowired então?
&lt;/h3&gt;

&lt;p&gt;Em pouquíssimos casos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Injeção em testes (como no &lt;code&gt;MockMvc&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Campos opcionais com &lt;code&gt;@Autowired(required = false)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Dependências circulares (mas isso geralmente indica problema de design!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resumo:&lt;/strong&gt; Use injeção por construtor sempre que possível. É a forma mais profissional e recomendada pela comunidade Spring! 💪&lt;/p&gt;

&lt;h2&gt;
  
  
  Dicas importantes! 💡
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Defina limites razoáveis&lt;/strong&gt;: Evite permitir que o cliente solicite 10.000 itens de uma vez&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use indices no banco&lt;/strong&gt;: Certifique-se de ter índices nas colunas usadas para ordenação&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Considere retornar metadados&lt;/strong&gt;: Em APIs REST maduras, é comum retornar informações como total de páginas e total de elementos&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Paginação com Spring Boot é realmente simples! Com poucas linhas de código, você tem uma API profissional e eficiente. O Spring Data faz o trabalho pesado, e você só precisa conectar as peças.&lt;/p&gt;

&lt;p&gt;Agora sua aplicação está pronta para lidar com a Sociedade do Anel inteira, e até mesmo todos os habitantes da Terra Média! 🗡️&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Gostou do conteúdo?&lt;/strong&gt; Deixe seu ❤️ e compartilhe com outros devs que estão começando com Spring Boot!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tem dúvidas?&lt;/strong&gt; Comenta aqui embaixo que a gente se ajuda! 🚀&lt;/p&gt;

</description>
      <category>springboot</category>
      <category>java</category>
      <category>tutorial</category>
      <category>backend</category>
    </item>
    <item>
      <title>Entendendo Interfaces em Java: O Modelo Que Garante Ordem no Seu Código</title>
      <dc:creator>Audrey-Albuquerque</dc:creator>
      <pubDate>Fri, 24 Oct 2025 04:03:07 +0000</pubDate>
      <link>https://dev.to/a_audrey/entendendo-interfaces-em-java-o-modelo-que-garante-ordem-no-seu-codigo-4jdp</link>
      <guid>https://dev.to/a_audrey/entendendo-interfaces-em-java-o-modelo-que-garante-ordem-no-seu-codigo-4jdp</guid>
      <description>&lt;p&gt;Olá, dev! 👋&lt;/p&gt;

&lt;p&gt;Se você está mergulhando no mundo do Java e já se perguntou o que exatamente é uma &lt;strong&gt;interface&lt;/strong&gt;, este post é pra você.&lt;br&gt;&lt;br&gt;
Vamos quebrar tudo em partes simples — sem enrolação — e entender por que as interfaces são tão poderosas e essenciais pra quem quer escrever código limpo, escalável e bem estruturado.  &lt;/p&gt;


&lt;h2&gt;
  
  
  🎯 O Papel Fundamental de uma Interface em Java
&lt;/h2&gt;

&lt;p&gt;Em poucas palavras, uma &lt;strong&gt;interface&lt;/strong&gt; é um &lt;strong&gt;modelo (ou contrato)&lt;/strong&gt; que uma classe se compromete a seguir.&lt;br&gt;&lt;br&gt;
Pense assim: ela define &lt;strong&gt;o que uma classe deve fazer&lt;/strong&gt;, mas &lt;strong&gt;não como&lt;/strong&gt; isso deve ser feito.  &lt;/p&gt;

&lt;p&gt;Quando uma classe “assina esse contrato”, ou seja, &lt;strong&gt;implementa&lt;/strong&gt; uma interface, ela precisa cumprir todas as promessas definidas ali — implementando cada método que a interface declara.  &lt;/p&gt;
&lt;h3&gt;
  
  
  👉 Em resumo:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A interface &lt;strong&gt;especifica obrigações&lt;/strong&gt; — o que uma classe deve ter.
&lt;/li&gt;
&lt;li&gt;A classe &lt;strong&gt;garante a implementação&lt;/strong&gt; — como ela vai fazer isso.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um ótimo exemplo é o de uma classe &lt;code&gt;Peixe&lt;/code&gt; que implementa as interfaces &lt;code&gt;Presa&lt;/code&gt; e &lt;code&gt;Predador&lt;/code&gt; .&lt;br&gt;&lt;br&gt;
Isso significa que um peixe pode tanto &lt;strong&gt;fugir de predadores&lt;/strong&gt; quanto &lt;strong&gt;caçar peixes menores&lt;/strong&gt;. 🐟⚔️  &lt;/p&gt;


&lt;h2&gt;
  
  
  💡 Características-Chave das Interfaces
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. ✅ Suporte a Múltiplas Implementações
&lt;/h3&gt;

&lt;p&gt;Essa é uma das maiores vantagens das interfaces: &lt;strong&gt;uma classe pode implementar várias interfaces ao mesmo tempo&lt;/strong&gt;.  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Diferente da herança tradicional, onde uma classe só pode ter &lt;strong&gt;uma superclasse&lt;/strong&gt;, aqui você pode “misturar comportamentos” livremente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;📘 Exemplo:&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Peixe&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Presa&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Predador&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 caso, o Peixe herda os métodos tanto de Presa quanto de Predador.&lt;br&gt;
Resultado? O peixe pode caçar  e também fugir.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. 🧱 Métodos Abstratos por Padrão
&lt;/h3&gt;

&lt;p&gt;Dentro de uma interface, os métodos são abstratos por padrão — ou seja, não têm corpo.&lt;br&gt;
Você só declara o método, e quem for implementar é que define o comportamento.&lt;/p&gt;

&lt;p&gt;📘 Exemplo:&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="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Presa&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;fugir&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 classe que implementar essa interface precisa obrigatoriamente dizer o que o método fugir() vai fazer:&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Coelho&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Presa&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&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;fugir&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"O coelho está fugindo!"&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;Simples assim. 🐇💨&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Implementação Obrigatória
&lt;/h3&gt;

&lt;p&gt;Toda classe que usa &lt;code&gt;(implements)&lt;/code&gt; uma interface precisa implementar todos os métodos declarados nessa interface.&lt;br&gt;
Se não fizer isso, o compilador já reclama — sem dó nem piedade.&lt;/p&gt;

&lt;p&gt;📘 Exemplo:&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Hawk&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Predador&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&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;ataca&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"O falcão está atacando!"&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;Se você tentar chamar falcao.fugir(), o método nem vai existir — afinal, Falcão só implementa Predador, não Presa.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Declaração de Variáveis
&lt;/h3&gt;

&lt;p&gt;Assim como nas classes, é possível declarar variáveis dentro de uma interface.&lt;br&gt;
Mas atenção: elas são automaticamente &lt;code&gt;públicas, estáticas e finais&lt;/code&gt; (public static final).&lt;br&gt;
Ou seja, funcionam como constantes que podem ser usadas por quem implementar a interface.&lt;/p&gt;
&lt;h4&gt;
  
  
  Exemplo Completo
&lt;/h4&gt;

&lt;p&gt;Aqui está um exemplo completo com todas as classes mencionadas no vídeo:&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="c1"&gt;// Interface Presa&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;Presa&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;flee&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Interface Predador&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;Predador&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;hunt&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Classe Coelho (implementa Presa)&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;Coelho&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Presa&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&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;flee&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"O coelho está fugindo saltitando!"&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="c1"&gt;// Classe Hawk (implementa Predador)&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;Hawk&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Predador&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&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;hunt&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"O falcão está atacando!"&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="c1"&gt;// Classe Peixe (implementa Presa e Predador)&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;Peixe&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Presa&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Predador&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&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;flee&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"O peixe está fugindo de um peixe maior!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&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;hunt&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"O peixe está atacando um peixe menor"&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="c1"&gt;// Classe Principal&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;Main&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;Coelho&lt;/span&gt; &lt;span class="n"&gt;coelho&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;Coelho&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;coelho&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fugir&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="nc"&gt;Falcao&lt;/span&gt; &lt;span class="n"&gt;falcao&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;Falcao&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;falcao&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;atacar&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="nc"&gt;Peixe&lt;/span&gt; &lt;span class="n"&gt;peixe&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;Peixe&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;peixe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hunt&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;peixe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;flee&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;Saída esperada:&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="no"&gt;O&lt;/span&gt; &lt;span class="n"&gt;coelho&lt;/span&gt; &lt;span class="n"&gt;está&lt;/span&gt; &lt;span class="n"&gt;fugindo&lt;/span&gt; &lt;span class="n"&gt;saltitando&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="no"&gt;O&lt;/span&gt; &lt;span class="n"&gt;falcão&lt;/span&gt; &lt;span class="n"&gt;está&lt;/span&gt; &lt;span class="n"&gt;atacando&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="no"&gt;O&lt;/span&gt; &lt;span class="n"&gt;peixe&lt;/span&gt; &lt;span class="n"&gt;está&lt;/span&gt; &lt;span class="n"&gt;fugindo&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;um&lt;/span&gt; &lt;span class="n"&gt;peixe&lt;/span&gt; &lt;span class="n"&gt;maior&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="no"&gt;O&lt;/span&gt; &lt;span class="n"&gt;peixe&lt;/span&gt; &lt;span class="n"&gt;está&lt;/span&gt; &lt;span class="n"&gt;atacando&lt;/span&gt; &lt;span class="n"&gt;um&lt;/span&gt; &lt;span class="n"&gt;peixe&lt;/span&gt; &lt;span class="n"&gt;menor&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Pense nas interfaces como contratos ou modelos de comportamento.&lt;br&gt;
Elas não dizem “como” algo deve ser feito, mas garantem que seja feito.&lt;/p&gt;

&lt;p&gt;Elas são o coração da programação orientada a interfaces, que é uma das boas práticas mais poderosas no Java moderno.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Conceito&lt;/th&gt;
&lt;th&gt;Explicação&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;O que é&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Um contrato que define métodos que uma classe deve implementar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Palavra-chave&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;implements&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Métodos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Abstratos por padrão (sem corpo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Herança múltipla&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sim, pode implementar várias interfaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Uso típico&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Garantir comportamentos padronizados entre classes diferentes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Em resumo:
&lt;/h4&gt;

&lt;p&gt;Interfaces trazem clareza, organização e flexibilidade. Elas são o jeitinho Java de dizer:&lt;/p&gt;

&lt;p&gt;“Ei, se você quiser fazer parte desse grupo, siga essas regras!” 😄&lt;br&gt;
&lt;strong&gt;E aí, já usou interfaces em algum projeto?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>inheritance</category>
      <category>heranca</category>
      <category>java</category>
      <category>interface</category>
    </item>
    <item>
      <title>Monolito vs. Microsserviços: Um Guia Detalhado para Entender a Arquitetura de Software</title>
      <dc:creator>Audrey-Albuquerque</dc:creator>
      <pubDate>Sun, 19 Oct 2025 23:15:29 +0000</pubDate>
      <link>https://dev.to/a_audrey/monolito-vs-microsservicos-um-guia-detalhado-para-entender-a-arquitetura-de-software-1l9i</link>
      <guid>https://dev.to/a_audrey/monolito-vs-microsservicos-um-guia-detalhado-para-entender-a-arquitetura-de-software-1l9i</guid>
      <description>&lt;h2&gt;
  
  
  Indo Além do Código: A Hora de Entender o "Porquê"
&lt;/h2&gt;

&lt;p&gt;Olá! Chegou um momento importante na jornada de todo desenvolvedor: a hora de evoluir de apenas seguir tutoriais e focar em aulas práticas para realmente começar a entender a engenharia de software em um nível mais profundo. O objetivo é se tornar um(a) programador(a) que sabe não apenas o "como", mas principalmente o "porquê".&lt;/p&gt;

&lt;p&gt;É necessário entender quando usar um monolito e quando usar microsserviços.&lt;/p&gt;

&lt;p&gt;Muitas vezes nos deparamos com um paradoxo: por que tantas empresas pedem experiência em microsserviços em suas vagas, se a grande maioria das aplicações que conhecemos, incluindo as delas, foram construídas com base em monolitos? Você precisa entender essa dinâmica, porque se você não compreender o &lt;strong&gt;motivo&lt;/strong&gt; por trás de uma decisão de arquitetura, você não vai entender completamente &lt;strong&gt;o que&lt;/strong&gt; está construindo.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é um Monolito?
&lt;/h2&gt;

&lt;p&gt;Vamos visualizar um cenário comum. Toda empresa precisa, no mínimo, de um cadastro de usuários. Então, para começar, nosso sistema precisará de:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Uma aplicação (usando Spring, por exemplo) para cadastrar os usuários.&lt;/li&gt;
&lt;li&gt; Um banco de dados para armazenar as informações desses usuários.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Agora, vamos adicionar uma funcionalidade: esse usuário poderá fazer uma compra. Após a aprovação dessa compra, precisamos pegar os dados desse usuário, como endereço, nome completo e CPF, e enviar para o sistema de entrega.&lt;/p&gt;

&lt;p&gt;Se estamos trabalhando com um &lt;strong&gt;monolito&lt;/strong&gt;, todos esses sistemas — o de cadastro de pessoas, o de pagamentos com suas validações, e o de delivery — estarão contidos dentro da mesma aplicação, da mesma base de código.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O monolito é basicamente uma aplicação que faz tudo. É um sistema unificado que possui uma única codebase(o código em si) e, frequentemente, um único banco de dados para todas as suas funções.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esse código único vai lidar com o &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cadastro de usuários, &lt;/li&gt;
&lt;li&gt;a autenticação, &lt;/li&gt;
&lt;li&gt;o processamento do pagamento, &lt;/li&gt;
&lt;li&gt;a consulta ao banco de dados para obter o endereço e, por fim, &lt;/li&gt;
&lt;li&gt;acionar o serviço de entrega. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tudo isso está dentro da mesma base de código. É um sistema unificado, um "bloco" único de código, e por isso o chamamos de &lt;em&gt;monolito&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Grande Vantagem do Monolito: A Comunicação
&lt;/h3&gt;

&lt;p&gt;À primeira vista, parece a abordagem perfeita, certo? Em muitos aspectos, ela oferece grandes vantagens, principalmente na comunicação interna.&lt;/p&gt;

&lt;p&gt;Vamos aprofundar nisso. No nosso exemplo, para saber se um usuário pagou, o sistema de entrega precisa dos dados do usuário. &lt;/p&gt;

&lt;p&gt;Dentro de um monolito, ele simplesmente acessa a função ou a tabela do banco de dados que está ali, do lado, dentro do mesmo servidor.&lt;/p&gt;

&lt;p&gt;Pense no monolito como a sua casa. Se você precisa de uma informação de alguém que mora na mesma casa que você, ela está no mesmo ambiente. É só perguntar, e a resposta vem de forma rápida e direta. Essa é a grande vantagem da comunicação em um monolito: ela é prática e veloz, pois tudo está "em casa".&lt;/p&gt;

&lt;h2&gt;
  
  
  E os Microsserviços?
&lt;/h2&gt;

&lt;p&gt;Agora, como seria transformar esse mesmo produto em microsserviços? A ideia é que cada funcionalidade principal se torne um serviço independente e focado.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Microsserviços não são serviços pequenos, mas serviços &lt;strong&gt;especializados&lt;/strong&gt;. E há uma diferença muito grande nisso.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Aqui, o cenário vai se complicar um pouco. Teríamos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Um microsserviço de &lt;strong&gt;Usuários&lt;/strong&gt;, com seu próprio banco de dados e rodando em seu próprio servidor.&lt;/li&gt;
&lt;li&gt;  Um microsserviço de &lt;strong&gt;Pagamentos&lt;/strong&gt;, também com seu banco de dados e servidor independentes.&lt;/li&gt;
&lt;li&gt;  Um microsserviço de &lt;strong&gt;Delivery&lt;/strong&gt;, seguindo o mesmo padrão.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se cada um está em um servidor separado, com seu próprio banco de dados, &lt;strong&gt;como eles se comunicam?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Diferente do monolito, onde seu irmão estava na mesma casa, agora é como se ele morasse em outra cidade. Você não pode mais simplesmente "gritar" pela informação. Você precisa fazer uma "ligação", enviar uma mensagem via "whatsapp", ou seja, uma requisição de rede, seja via &lt;strong&gt;HTTP&lt;/strong&gt; ou &lt;strong&gt;RPC&lt;/strong&gt; (Remote Procedure Call).&lt;/p&gt;

&lt;p&gt;O fluxo de comunicação se torna mais complexo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; O microsserviço de &lt;strong&gt;Usuário&lt;/strong&gt; precisa enviar uma requisição para o de &lt;strong&gt;Pagamento&lt;/strong&gt; para validar uma compra.&lt;/li&gt;
&lt;li&gt; O serviço de &lt;strong&gt;Pagamento&lt;/strong&gt;, uma vez que a compra é validada, precisa fazer uma consulta ao serviço de &lt;strong&gt;Usuário&lt;/strong&gt; para obter o endereço de entrega.&lt;/li&gt;
&lt;li&gt; Após receber o endereço, ele precisa enviar todas essas informações para o microsserviço de &lt;strong&gt;Delivery&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  A Complexidade Adicional
&lt;/h3&gt;

&lt;p&gt;Cada uma dessas comunicações entre serviços precisa ser &lt;strong&gt;autenticada&lt;/strong&gt;. Nenhum serviço pode acessar o outro sem antes se identificar e provar que tem permissão. É como se ninguém pudesse entrar na sua casa sem se autenticar primeiro. Isso adiciona mais uma camada de complexidade ao sistema.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Toda vez que lidamos com microsserviços, estamos aumentando consideravelmente a complexidade do que estamos construindo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O que antes era uma simples chamada de função dentro da mesma aplicação, agora se transforma em uma série de requisições de rede que precisam de autenticação, tratamento de falhas, latência e muito mais. Esse desafio de gerenciar e monitorar a comunicação e o estado de múltiplos serviços tem um nome: &lt;strong&gt;Observabilidade Distribuída&lt;/strong&gt; (&lt;em&gt;Distributed Observability&lt;/em&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Então, por que as empresas buscam Microsserviços?
&lt;/h2&gt;

&lt;p&gt;Se é uma abordagem tão mais complexa, qual é a vantagem? A resposta, na maioria das vezes, se resume a uma palavra: &lt;strong&gt;dinheiro&lt;/strong&gt;. E, mais especificamente, o estágio de maturidade e os recursos financeiros da empresa.&lt;/p&gt;

&lt;p&gt;Mas antes, um fato crucial que responde à nossa pergunta inicial:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Praticamente todas as grandes aplicações que você já usou na vida &lt;strong&gt;começaram como monolitos&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;É extremamente raro, talvez impossível, ver um novo projeto ou uma nova empresa começando do zero com uma arquitetura de microsserviços. O motivo é simples: monolitos são mais fáceis, rápidos e baratos para começar.&lt;/p&gt;

&lt;h3&gt;
  
  
  O Desafio do Monolito que Envelhece
&lt;/h3&gt;

&lt;p&gt;Imagine uma codebase que começou lá em 2004. Com o passar dos anos, novas funcionalidades, regras de negócio e equipes foram adicionadas. O que acontece é que o monolito pode se tornar tão grande e complexo que a manutenção se torna um pesadelo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Conflitos de Merge:&lt;/strong&gt; Com uma equipe grande trabalhando na mesma codebase, a chance de um desenvolvedor, sem querer, quebrar a funcionalidade de outro ("skipar") é enorme.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Código Morto:&lt;/strong&gt; Funcionalidades antigas e abandonadas se acumulam, e ninguém tem segurança para removê-las, gerando um código "inchado" e difícil de entender.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Dificuldade de Manutenção:&lt;/strong&gt; Corrigir um bug ou adicionar uma nova feature pode se tornar uma tarefa lenta e arriscada, pois uma pequena mudança pode ter efeitos inesperados em outra parte do sistema.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Onde os Microsserviços Brilham
&lt;/h3&gt;

&lt;p&gt;É nesse ponto que, quando uma empresa atinge um certo nível de maturidade e, principalmente, tem &lt;strong&gt;caixa (dinheiro)&lt;/strong&gt; para investir, ela pode decidir migrar para uma arquitetura de microsserviços.&lt;/p&gt;

&lt;p&gt;O motivo é estratégico e financeiro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Times Especializados:&lt;/strong&gt; Empresas grandes podem se dar ao luxo de ter um time focado apenas no serviço de pagamento, outro no de usuários, e assim por diante. Isso custa mais caro, mas permite que cada equipe desenvolva autonomia e expertise.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Escalabilidade Independente:&lt;/strong&gt; Se o serviço de busca recebe 100x mais tráfego que o de faturamento, você pode escalar apenas o serviço de busca, otimizando o uso de recursos.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Resiliência:&lt;/strong&gt; Se o serviço de envio de notificações falha, o sistema de pagamento e o de cadastro de produtos continuam funcionando normalmente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A transição raramente é um "big bang". Geralmente, ela é gradual. A empresa pode, por exemplo, extrair o sistema de pagamentos do monolito e transformá-lo em um microsserviço que se comunica com o restante da aplicação. O Pinterest, por exemplo, possui microsserviços para comentários e notificações que operam junto ao seu sistema principal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão: Qual é o melhor? Monolito ou Microsserviço?
&lt;/h2&gt;

&lt;p&gt;Se você chegou até aqui, provavelmente já entendeu que essa &lt;strong&gt;é uma pergunta boba&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Não existe uma arquitetura "melhor" ou "pior" em termos absolutos. A escolha da arquitetura depende muito mais da maturidade do negócio, do tamanho da equipe e, claro, do orçamento, do que de uma preferência técnica. Como pessoa desenvolvedora, você não escolhe isso.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Monolitos:&lt;/strong&gt; São excelentes para começar. São mais baratos, menos complexos e ideais para times menores e projetos em estágio inicial.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Microsserviços:&lt;/strong&gt; São caros e complexos. Exigem times maiores, mais especializados e uma cultura de DevOps madura, mas oferecem escalabilidade, resiliência e autonomia para empresas em crescimento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A realidade do mercado é esta: quase todas as empresas começam como monolitos e, com o tempo, o crescimento e os recursos, decidem migrar algumas (ou todas) as suas funcionalidades para microsserviços.&lt;/p&gt;




&lt;p&gt;E aí, qual é a sua experiência com essas arquiteturas? Deixe um comentário &lt;/p&gt;

</description>
      <category>arquitetura</category>
      <category>backend</category>
      <category>monolito</category>
      <category>microsservicos</category>
    </item>
    <item>
      <title>Cliente e Servidor: Definição e Interação</title>
      <dc:creator>Audrey-Albuquerque</dc:creator>
      <pubDate>Tue, 01 Jul 2025 13:00:49 +0000</pubDate>
      <link>https://dev.to/a_audrey/cliente-e-servidor-definicao-e-interacao-1ibc</link>
      <guid>https://dev.to/a_audrey/cliente-e-servidor-definicao-e-interacao-1ibc</guid>
      <description>&lt;p&gt;Antes de começar eu tenho &lt;strong&gt;algumas perguntas pra te fazer&lt;/strong&gt;:&lt;br&gt;
Em primeiro lugar, uma pergunta simples, mas muito importante.&lt;br&gt;
Você sabe a diferença entre um &lt;strong&gt;cliente e um servidor&lt;/strong&gt; para a infraestrutura da internet?&lt;br&gt;
Você sabe diferenciar basicamente dentro de uma infraestrutura de redes, o que é um cliente suas tarefas?&lt;br&gt;
e o que é um servidor e suas tarefas? &lt;br&gt;
Outra coisa, você sabe diferenciar as tecnologias HTML, CSS, JavaScript e o que cada uma faz?&lt;br&gt;
Quais são as especialidades de cada uma? Para que cada uma serve?&lt;/p&gt;

&lt;p&gt;No modelo da infraestrutura da internet, &lt;strong&gt;o cliente é o seu dispositivo,&lt;/strong&gt; ou seja, é um computador ou um celular, que está solicitando ou utilizando um serviço. &lt;/p&gt;

&lt;p&gt;O servidor, por sua vez, é a máquina de alta performance que fornece os dados ou serviços necessários ao cliente.&lt;/p&gt;

&lt;p&gt;Neste exato momento você está lendo esse conteúdo com seu computador ligado, ou até mesmo no celular. Pois saiba que o seu computador&lt;br&gt;
ou celular &lt;strong&gt;são os nossos clientes&lt;/strong&gt;. No momento em que você usa um dispositivo, ele é um cliente e precisa de dados de um servidor, às vezes  até &lt;strong&gt;mais de um&lt;/strong&gt; servidor.&lt;/p&gt;

&lt;p&gt;E como você faz esse acesso na internet? Você usa &lt;strong&gt;um navegador&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Você está utilizando um serviço que está sendo fornecido por um servidor&lt;br&gt;
nesse exato momento, por exemplo, você está pegando dados dos servidores do Dev.to.&lt;/p&gt;

&lt;p&gt;Esses servidores, essas máquinas de alta performance são quem estão &lt;strong&gt;fornecendo os dados.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Esse servidor é parecido com a sua máquina de maneira fundamental. Ele tem um sistema operacional, ele tem pastas, ele tem diretórios internos. Dentro dessas pastas ele tem arquivos. &lt;br&gt;
Esse arquivo é no que você está interessado. Pode ser uma foto, pode ser um texto, pode ser um vídeo. E na maioria das vezes é um documento HTML.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz19853sqliaz9igz4fz9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz19853sqliaz9igz4fz9.png" alt=" " width="800" height="666"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A interação funciona da seguinte forma:
&lt;/h2&gt;

&lt;p&gt;• O cliente, através de um navegador ( Google Chrome, Edge, Mozilla, etc), digita uma URL (endereço) e envia uma solicitação para a infraestrutura da internet.&lt;br&gt;
• Essa infraestrutura (representada como uma "nuvem") direciona a solicitação para um servidor específico.&lt;br&gt;
• O servidor possui arquivos (como documentos HTML, imagens, textos ou vídeos) armazenados em suas pastas e diretórios.&lt;br&gt;
• Ao receber a solicitação, o servidor envia uma cópia desse arquivo para o navegador do cliente.&lt;br&gt;
Essa cópia é enviada diretamente para o cliente, você. No seu navegador web.&lt;br&gt;
O seu navegador a partir daí vai começar a trabalhar para gerar o efeito visual, para gerar o site exatamente como você está vendo agora&lt;br&gt;
• O navegador do cliente, então, trabalha para gerar o efeito visual e exibir o site conforme o usuário o vê.&lt;br&gt;
Em resumo, o cliente busca arquivos, e os servidores os enviam. Existem tecnologias para clientes (client-side) e tecnologias para servidores (server-side).&lt;/p&gt;

&lt;h2&gt;
  
  
  O Papel do JavaScript no Modelo Cliente-Servidor
&lt;/h2&gt;

&lt;p&gt;Historicamente, o JavaScript surgiu como uma tecnologia exclusivamente para clientes (client-side). Isso significa que seu foco inicial e principal no curso é a interatividade e a manipulação de elementos diretamente no navegador do usuário1011.&lt;/p&gt;

&lt;p&gt;No entanto, as fontes destacam que o JavaScript evoluiu e, com o surgimento do Node.js em 2009 (baseado no motor V8 do Google Chrome), ele pode ser executado também no lado do servidor (server-side).&lt;br&gt;
Para o desenvolvimento de sites do lado do cliente, o JavaScript trabalha em conjunto com outras duas tecnologias essenciais:&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;HTML (HyperText Markup Language)&lt;/strong&gt;: Responsável pelo conteúdo e pela estrutura do site. É comparado a um jornalista que escreve o texto e organiza o material11....&lt;br&gt;
• &lt;strong&gt;CSS (Cascading Style Sheets)&lt;/strong&gt;: Encarregado do estilo e do design visual do site, tornando-o mais atraente. É comparado a um designer que organiza cores, tamanhos e posições....&lt;br&gt;
• &lt;strong&gt;JavaScript:&lt;/strong&gt; Adiciona a interatividade e as integrações. É a "parte do programador" que trata da engenharia da entrega e da dinâmica do jornal/site.&lt;/p&gt;

&lt;p&gt;É crucial entender que HTML e CSS não são linguagens de programação, mas sim tecnologias de construção de sites, enquanto o JavaScript é uma linguagem de programação completa.&lt;/p&gt;

&lt;p&gt;Essas três tecnologias funcionam em conjunto para compor a parte do cliente na maioria dos sites modernos&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como criar uma imagem Mysql no Docker e conectar ao Dbeaver 😉</title>
      <dc:creator>Audrey-Albuquerque</dc:creator>
      <pubDate>Sun, 12 Jan 2025 03:23:05 +0000</pubDate>
      <link>https://dev.to/a_audrey/como-criar-uma-imagem-mysql-no-docker-e-conectar-ao-dbeaver-496h</link>
      <guid>https://dev.to/a_audrey/como-criar-uma-imagem-mysql-no-docker-e-conectar-ao-dbeaver-496h</guid>
      <description>&lt;h3&gt;
  
  
  Por que usar Docker e DBeaver para trabalhar com MySQL?
&lt;/h3&gt;

&lt;p&gt;Se você já trabalhou com bancos de dados, sabe que configurar tudo direitinho no seu computador pode ser complicado e demorado. Felizmente, temos algumas ferramentas que tornam isso muito mais fácil, como &lt;strong&gt;o Docker e o DBeaver&lt;/strong&gt;. Vou te explicar um pouco sobre elas e como elas podem te ajudar a criar e gerenciar bancos de dados de forma rápida e simples.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é o Docker e por que usá-lo?
&lt;/h3&gt;

&lt;p&gt;O Docker é uma ferramenta que ajuda a criar ambientes de desenvolvimento, ou seja, é como se você tivesse uma "caixinha" que já vem pronta para rodar um software, sem precisar se preocupar em configurar tudo do zero. Imagine que você quer usar o MySQL, um dos bancos de dados mais populares, mas não quer perder tempo instalando e configurando ele manualmente. O Docker te ajuda com isso!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo:&lt;/strong&gt; Você quer rodar um banco de dados MySQL no seu computador, mas não quer precisar instalar o MySQL de verdade. Com o Docker, você pode "rodar" uma versão do MySQL dentro de uma "caixa" virtual, chamada container, e essa "caixa" já vem com tudo o que o MySQL precisa para funcionar. Ou seja, &lt;strong&gt;você não precisa configurar nada manualmente!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Facilidade:&lt;/strong&gt; Usar o Docker é rápido e fácil. Você pode rodar o MySQL em minutos sem se preocupar com complicação.&lt;br&gt;
&lt;strong&gt;Consistência:&lt;/strong&gt; O legal do Docker é que, quando você cria um ambiente, ele funciona do mesmo jeito em qualquer computador. Isso significa que, se você tiver um colega de trabalho e ele rodar o mesmo banco de dados no Docker, tudo vai funcionar igualzinho no computador dele!&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é o DBeaver e por que usá-lo?
&lt;/h3&gt;

&lt;p&gt;Agora que você tem o MySQL rodando no Docker, precisa de uma ferramenta para visualizar e interagir com o banco de dados de forma fácil, certo? É aí que entra o DBeaver. &lt;strong&gt;O DBeaver&lt;/strong&gt; é um programa que permite que você se conecte ao MySQL (e outros bancos de dados também) e faça tudo o que precisa: &lt;strong&gt;criar tabelas, adicionar dados, rodar comandos SQL e muito mais,&lt;/strong&gt; tudo com uma interface bem simples e bonita.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo:&lt;/strong&gt; Quando você abre o DBeaver, ele vai mostrar uma tela onde você pode clicar para ver as tabelas que você criou no MySQL, inserir novos dados ou até rodar consultas (comandos SQL) para pegar informações específicas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interface fácil de usar:&lt;/strong&gt; Mesmo que você seja iniciante, o DBeaver facilita porque tem uma interface gráfica. Ao invés de digitar tudo em comandos, você pode clicar e fazer as coisas de maneira visual.&lt;br&gt;
Multibanco de dados: O DBeaver não serve só para MySQL, você pode conectar a vários tipos de bancos de dados ao mesmo tempo, tudo em um único programa!&lt;br&gt;
➡️&lt;strong&gt;Por que essa combinação é tão boa?&lt;/strong&gt;&lt;br&gt;
Juntar o Docker e o DBeaver é uma &lt;strong&gt;solução simples e poderosa.&lt;/strong&gt; O Docker facilita a instalação e o gerenciamento do banco de dados (no nosso caso, o MySQL), enquanto o DBeaver te ajuda a gerenciar os dados de forma bem mais prática e visual.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo final:&lt;/strong&gt; Com o Docker, você instala o MySQL em minutos e, com o DBeaver, você consegue visualizar e trabalhar com os dados de forma fácil. Juntas, essas ferramentas são uma excelente escolha para quem quer ganhar tempo e evitar complicação na hora de trabalhar com banco de dados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pré-requisitos: Aplicativos Necessários
&lt;/h3&gt;

&lt;p&gt;Antes de começar, certifique-se de ter os seguintes aplicativos instalados em sua máquina:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F083801kclf6h7m71uy8d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F083801kclf6h7m71uy8d.png" alt=" " width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker Desktop:&lt;/strong&gt; Necessário para criar e gerenciar containers, como o banco de dados MySQL. &lt;br&gt;
Baixe aqui: &lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;https://www.docker.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DBeaver:&lt;/strong&gt; Ferramenta para gerenciar bancos de dados e testar conexões com o MySQL.&lt;/p&gt;

&lt;p&gt;Baixe o DBeaver aqui: &lt;a href="https://dbeaver.io/download/" rel="noopener noreferrer"&gt;https://dbeaver.io/download/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Criação do Container Docker para MySQL
&lt;/h2&gt;

&lt;p&gt;Para começar, precisamos criar um container Docker que hospedará nosso banco de dados MySQL. Abra seu app Docker Desktop&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyemrsbgiagjfvez37f3i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyemrsbgiagjfvez37f3i.png" alt=" " width="710" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clique em Abrir. Minimize e abra o CMD como administrador e siga os passos abaixo:&lt;/p&gt;

&lt;h3&gt;
  
  
  Comando para criar o container
&lt;/h3&gt;

&lt;p&gt;Execute o seguinte comando no terminal:`&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
docker run --name meu_db -e MYSQL_ROOT_PASSWORD=senha123 -e MYSQL_DATABASE=gerenciador_contato -p 3306:3306 -d mysql:8&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explicação:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;--name meu_db:&lt;/strong&gt; meu_db deve ser alterado por você, é aqui que você define o nome do seu container.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-e MYSQL_ROOT_PASSWORD=senha123:&lt;/strong&gt; Configura a senha do usuário root como "senha123".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-e MYSQL_DATABASE=gerenciador_contato:&lt;/strong&gt; Aqui você dá o nome desejado para o banco de dados. Dixamos como chamado "gerenciador_contato".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-p 3306:3306:&lt;/strong&gt; Mapeia a porta 3306 do MySQL no container para a mesma porta na máquina local.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-d mysql:8:&lt;/strong&gt; Usa a imagem MySQL versão 8 e roda o container em segundo plano.&lt;/p&gt;

&lt;p&gt;Pronto! O banco de dados está rodando no Docker.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Conexão e Teste no DBeaver
&lt;/h2&gt;

&lt;p&gt;Com o container MySQL rodando, vamos conectar no banco pelo DBeaver:&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 1: Configuração da conexão
&lt;/h3&gt;

&lt;p&gt;Abra o DBeaver e clique em File &amp;gt; New Database Connection.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1epkmo963ytbfzsliaq9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1epkmo963ytbfzsliaq9.png" alt=" " width="328" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Escolha "MySQL" na lista de bancos de dados.&lt;/p&gt;

&lt;p&gt;Configure os seguintes campos com os dados que você coloccou na &lt;strong&gt;criaçao do container Docker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Host: localhost&lt;/p&gt;

&lt;p&gt;Port: 3306&lt;/p&gt;

&lt;p&gt;Database: gerenciador_contato&lt;/p&gt;

&lt;p&gt;Username: root&lt;/p&gt;

&lt;p&gt;Password: senha123&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clique em Test Connection.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se tudo estiver correto, o DBeaver se conectará ao banco com sucesso!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu94g278g85sxlvr1t9g4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu94g278g85sxlvr1t9g4.png" alt=" " width="572" height="696"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para mim ocorreu uma menagem de erro de PublicKeyRetrieval. Se esse for o seu caso também, vá na aba Propriedades do Driver e &lt;strong&gt;escreva true na allowPublicKeyRetrieval&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbxog5ofxzdl5tfa9mx3g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbxog5ofxzdl5tfa9mx3g.png" alt=" " width="480" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E a mensagem de Conectado deve aparecer&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe5c30bfijxq09vqk93oq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe5c30bfijxq09vqk93oq.png" alt=" " width="472" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fex7urqxh5zdkainonr3w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fex7urqxh5zdkainonr3w.png" alt=" " width="236" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Dicas de SQL para Iniciantes: Consultando Proprietários de Animais de Estimação (Joins)</title>
      <dc:creator>Audrey-Albuquerque</dc:creator>
      <pubDate>Tue, 08 Oct 2024 20:22:08 +0000</pubDate>
      <link>https://dev.to/a_audrey/criando-e-manipulando-um-banco-de-dados-p93</link>
      <guid>https://dev.to/a_audrey/criando-e-manipulando-um-banco-de-dados-p93</guid>
      <description>&lt;p&gt;O SGBD escolhido para essa amostra foi o MySql, e seu Workbench. &lt;/p&gt;

&lt;p&gt;Vamos criar um banco de dados. &lt;/p&gt;

&lt;p&gt;Imagine que temos um hotelzinho de pets e vamos hospedar Gatos e Caezinhos. Precisamos também ter o nome de seus donos, chamaremos essa tabela de Pessoa.&lt;/p&gt;

&lt;p&gt;As tabelas serão simples para focar no conceito.&lt;/p&gt;

&lt;h3&gt;
  
  
  Explicando o Projeto
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Tabelas:
&lt;/h4&gt;

&lt;h4&gt;
  
  
  Gato: 🐈‍⬛contém os gatos que estão no hotelzinho.
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;id_gato&lt;/li&gt;
&lt;li&gt;nome_gato&lt;/li&gt;
&lt;li&gt;id_pessoa&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cachorro: 🐕‍🦺contém os cachorros que estão no hotelzinho.
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;id_cachorro&lt;/li&gt;
&lt;li&gt;nome_cachorro&lt;/li&gt;
&lt;li&gt;id_pessoa&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Pessoa: 🚶🏻‍♂️contém as pessoas que são donas dos pets.
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;id_pessoa&lt;/li&gt;
&lt;li&gt;nome_pessoa&lt;/li&gt;
&lt;li&gt;cpf&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Criando o Banco
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Vamos iniciar nosso banco:
&lt;/h4&gt;

&lt;p&gt;Logo que abrimos os schemas temos a query1. Vamos utilizá-la.&lt;br&gt;
Digitamos o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE DATABASE hotelzinho;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e em seguida o raiozinho com o número 1. &lt;br&gt;
Esse botão nos permite executar uma linha de cada vez.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2j93bsj4drm8zpng77wp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2j93bsj4drm8zpng77wp.png" alt=" " width="353" height="141"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;o check verdinho indica que tudo deu certo na criação do nosso Banco&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuyd1l7ssknwkhcp5y353.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuyd1l7ssknwkhcp5y353.png" alt=" " width="505" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;e você pode salvar esse Script, indo em &lt;strong&gt;File&lt;/strong&gt;, save Script as :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faa973eota4j60c4sdu09.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faa973eota4j60c4sdu09.png" alt=" " width="283" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aqui eu salvei como HotelzinhoPets em uma pasta somente de Scripts Sql que facilitam a minha vida.😄&lt;/p&gt;

&lt;p&gt;Para criarmos tabelas dentro do nosso banco &lt;strong&gt;hotelzinho&lt;/strong&gt; temos que indicar que queremos usar o banco. Para isso precisamos do comando: &lt;br&gt;
&lt;strong&gt;USE hotelzinho;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1x7jdo2i3dsdytszk9s4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1x7jdo2i3dsdytszk9s4.png" alt=" " width="344" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para executar um comando no MySQL Workbench, basta posicionar o cursor na linha desejada e clicar no botão: "Execute o comando debaixo do meu cursor". Eu prefiro chamar esse botão de "raio único", ok? 😊&lt;/p&gt;

&lt;p&gt;Quando o comando for executado com sucesso, um check verde aparecerá, indicando que tudo está correto.&lt;/p&gt;
&lt;h3&gt;
  
  
  Criando as Tabelas
&lt;/h3&gt;

&lt;p&gt;Agora, vamos criar as tabelas Pessoa, Gato e Cachorro.&lt;/p&gt;

&lt;p&gt;⚠️ Dica: Se você preferir usar os nomes das tabelas no plural (como Gatos, Cachorros e Pessoas), certifique-se de que todas as tabelas sigam esse padrão. Isso mantém o projeto dentro das boas práticas de consistência na nomeação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fap6nzxd1mjdbmxzv6ugs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fap6nzxd1mjdbmxzv6ugs.png" alt=" " width="587" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
Vamos criar a tabela &lt;strong&gt;Pessoa&lt;/strong&gt; primeiro, pois ela será a nossa chave estrangeira nas outras duas tabelas:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7iaighwvb1lih9e7x3lh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7iaighwvb1lih9e7x3lh.png" alt=" " width="371" height="108"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este comando cria uma tabela &lt;strong&gt;chamada Pessoa&lt;/strong&gt; que armazena informações sobre pessoas, com três colunas: id_pessoa, nome_pessoa e cpf. &lt;/p&gt;

&lt;p&gt;A coluna id_pessoa é um &lt;strong&gt;identificador único&lt;/strong&gt; que se incrementa automaticamente, enquanto nome_pessoa e cpf devem ser fornecidos sempre que uma nova pessoa é adicionada, garantindo que o CPF seja único na tabela.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Em seguida, as demais tabelas:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02yj7zq08fcexq8wn88x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02yj7zq08fcexq8wn88x.png" alt=" " width="462" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nessas outras tabelas Cachorro e Gato, podemos dar um nome que faça mais sentido para o dono do pet. Por exemplo, podemos chamar a pessoa de Proprietário na tabela Gato, o que torna a relação mais intuitiva.&lt;br&gt;
 Dessa forma, o nome da coluna será &lt;strong&gt;id_proprietario&lt;/strong&gt;, e ela ainda funcionará como uma Foreign Key, referenciando a chave primária da tabela Pessoa.&lt;/p&gt;

&lt;p&gt;Isso deixa claro tanto o propósito da coluna quanto o processo de criação da chave estrangeira, mantendo a integridade do banco de dados.&lt;/p&gt;

&lt;p&gt;Posicione o cursor em cima da primeira linha de cada comando de criação de tabela e clique no botão raio único para executar, uma tabela de cada vez. Isso permite que você crie as tabelas separadamente e garanta que cada uma seja processada corretamente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxe84kh1ivxrw0fq4wmg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxe84kh1ivxrw0fq4wmg.png" alt=" " width="709" height="63"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;sucesso! &lt;/p&gt;

&lt;p&gt;Até o momento, usamos comandos &lt;strong&gt;DDL&lt;/strong&gt; (Data Definition Language) do SQL, que são responsáveis pela definição e estruturação do banco de dados. Esses comandos incluem a &lt;strong&gt;criação de tabelas e a definição de chaves estrangeiras&lt;/strong&gt;, como vimos nos exemplos anteriores.&lt;/p&gt;
&lt;h3&gt;
  
  
  Inserindo Valores nas Tabelas
&lt;/h3&gt;

&lt;p&gt;A partir de agora, vamos usar um pouco de &lt;strong&gt;DML (Data Manipulation Language)&lt;/strong&gt;, que é responsável por &lt;strong&gt;manipular nossos dados&lt;/strong&gt;. Com esses comandos, vamos inserir valores nas colunas das tabelas que criamos para podermos utilizar os &lt;strong&gt;Joins&lt;/strong&gt; em seguida.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F86jqkw1ycpdv49h2zq2r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F86jqkw1ycpdv49h2zq2r.png" alt=" " width="547" height="139"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para inserir os dados em uma tabela em que o Id é do tipo Auto_increment, não é necessário lhe dar algum valor. Isso é feito automaticamente.&lt;/p&gt;

&lt;p&gt;Usamos o comando &lt;strong&gt;INSERT INTO&lt;/strong&gt; seguido do nome da tabela. Em seguida, abrimos parênteses e digitamos os nomes das colunas que queremos popular. Fechamos os parênteses e acrescentamos a palavra &lt;strong&gt;VALUES&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para cada registro, abrimos parênteses, inserimos os valores separados por vírgula, e, quando chegamos ao final, usamos o ponto e vírgula para finalizar o comando.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvca6ppxa7ty81mj0rile.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvca6ppxa7ty81mj0rile.png" alt=" " width="343" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao final da inserção de cada tabela, é importante clicar no &lt;strong&gt;Raio único&lt;/strong&gt;, para que a próxima tabela possa usar corretamente o &lt;strong&gt;id_proprietario&lt;/strong&gt; ao referenciar a tabela &lt;strong&gt;Pessoa&lt;/strong&gt;. Isso garante que o relacionamento entre as tabelas seja feito corretamente.&lt;/p&gt;

&lt;p&gt;Fazemos isso também com as demais tabelas, garantindo que cada uma seja inserida e relacionada adequadamente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqdre9n2yjx3fz76z1kdn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqdre9n2yjx3fz76z1kdn.png" alt=" " width="415" height="375"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Consultando as tabelas
&lt;/h3&gt;

&lt;p&gt;Com o comando &lt;strong&gt;SELECT * FROM&lt;/strong&gt; seguido do nome da tabela, podemos visualizar todos os valores presentes nela. A sintaxe é a seguinte:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3ckfg19192z168wk0oc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3ckfg19192z168wk0oc.png" alt=" " width="352" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff7f1mlkyc7poqrpbgb3u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff7f1mlkyc7poqrpbgb3u.png" alt=" " width="338" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F484v07ni787g78c7iy3t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F484v07ni787g78c7iy3t.png" alt=" " width="320" height="270"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1. INNER JOIN - Listando todas as Pessoas que têm gatos no hotelzinho
&lt;/h3&gt;

&lt;p&gt;Agora, precisamos saber a lista de todas as pessoas que deixaram seus gatos em nosso hotel. Queremos ofertar uma raçao especial para estes proprietários de gatos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT 
    Pessoa.nome_pessoa,
        Gato.nome
FROM
        Pessoa
INNER JOIN
        Gato
ON
        Pessoa.id_pessoa = Gato.id_proprietario;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Traduzindo a Consulta:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Select Pessoa.nome_pessoa, Gato.nome&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;isso é o que eu preciso na minha consulta&lt;/strong&gt;: &lt;br&gt;
o &lt;strong&gt;nome da pessoa&lt;/strong&gt;, na tabela &lt;strong&gt;Pessoa&lt;/strong&gt;, e o &lt;strong&gt;nome&lt;/strong&gt; na tabela &lt;strong&gt;Gato&lt;/strong&gt;. &lt;br&gt;
Poderiam ter mais atributos, como telefone, se fosse o caso, ou o cpf, email, etc&lt;/p&gt;

&lt;p&gt;Em seguida &lt;br&gt;
&lt;code&gt;FROM Pessoa INNER JOIN Gato&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FROM&lt;/strong&gt;: Esta palavra-chave indica de qual tabela queremos recuperar os dados.&lt;br&gt;
&lt;strong&gt;Pessoa&lt;/strong&gt;: Estamos especificando que a tabela principal de onde vamos buscar os dados é a tabela &lt;strong&gt;Pessoa&lt;/strong&gt;. Ou seja, as informações que você obtém inicialmente virão desta tabela.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;INNER JOIN&lt;/strong&gt;: Este comando indica que estamos combinando (ou "juntando") a &lt;strong&gt;tabela Pessoa com outra tabela&lt;/strong&gt;, que neste caso é a &lt;strong&gt;tabela Gato&lt;/strong&gt;. O INNER JOIN retorna apenas as linhas que têm &lt;strong&gt;correspondência em ambas as tabelas.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gato&lt;/strong&gt;: Estamos especificando que a segunda tabela que queremos juntar à tabela Pessoa é a tabela Gato. Isso significa que estamos interessados em obter dados de ambas as tabelas.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ON Pessoa.id_pessoa = Gato.id_proprietario;&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;ON&lt;/strong&gt; aqui podemos entender o ON como um &lt;strong&gt;EM QUE&lt;/strong&gt; o id_pessoa na tabela Pessoa &lt;strong&gt;seja igual&lt;/strong&gt; ao id_proprietario na tabela Gato.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpe8xy9wuwqpj1vypau1g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpe8xy9wuwqpj1vypau1g.png" alt=" " width="419" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh44z2h3mhqulzamfn7y0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh44z2h3mhqulzamfn7y0.png" alt=" " width="607" height="207"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2. LEFT JOIN:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT 
    Pessoa.nome_pessoa, 
    Gato.nome 
FROM 
    Pessoa 
LEFT JOIN 
    Gato 
ON 
    Pessoa.id_pessoa = Gato.id_proprietario;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;O LEFT JOIN é como se você estivesse dizendo: "Quero ver todas as pessoas, e se elas tiverem gatos, mostre os gatos também. Se não tiver, tudo bem, só mostre as pessoas mesmo!"&lt;/p&gt;

&lt;p&gt;Dessa forma, o LEFT JOIN garante que todas as Pessoa sejam vistos, mesmo que alguns não tenham Gato.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fum3qy47vmue5rivwt41v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fum3qy47vmue5rivwt41v.png" alt=" " width="421" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note que Roberto Carlos e a Mariana não tem gato, mas estão aparecendo. Esse é o Left Join.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. RIGHT JOIN
&lt;/h3&gt;

&lt;p&gt;O RIGHT JOIN retorna todas as linhas da tabela à direita (Cachorro) e as linhas correspondentes da tabela à esquerda (Pessoa). Se não houver correspondência, os resultados da tabela à esquerda serão NULL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
SELECT 
    Pessoa.nome_pessoa, 
    Cachorro.nome 
FROM 
    Pessoa 
RIGHT JOIN 
    Cachorro 
ON 
    Pessoa.id_pessoa = Cachorro.id_proprietario;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando retorna todos os cachorros, incluindo aqueles que não têm um proprietário registrado. Mas no nosso hotelzinho todos os cachorros tem seus proprietários, por isso nao tivemos um null.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdgjly250gkd3hlzh6c1e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdgjly250gkd3hlzh6c1e.png" alt=" " width="429" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. FULL OUTER JOIN
&lt;/h3&gt;

&lt;p&gt;O FULL OUTER JOIN retorna todas as linhas quando há uma correspondência em uma das tabelas. Porém, esse tipo de JOIN não é suportado diretamente pelo MySQL. Você pode simular um FULL OUTER JOIN usando a combinação de LEFT JOIN e RIGHT JOIN.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp2qh53cc3fmb49v3ckal.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp2qh53cc3fmb49v3ckal.png" alt=" " width="271" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se por exemplo tivéssemos Gatos sem o id_proprietario apareceria aqui com essa consulta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT 
    Pessoa.nome_pessoa, 
    Gato.nome 
FROM 
    Pessoa 
LEFT JOIN 
    Gato 
ON 
    Pessoa.id_pessoa = Gato.id_proprietario

UNION

SELECT 
    Pessoa.nome_pessoa, 
    Gato.nome

FROM 
    Pessoa 
RIGHT JOIN 
    Gato 
ON 
    Pessoa.id_pessoa = Gato.id_proprietario;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkovh2psi770h1negrtuu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkovh2psi770h1negrtuu.png" alt=" " width="439" height="700"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora precisamos de uma última consulta. Precisamos de uma listagem por Pessoa de todos os animais que elas tem. Cachorros, Gatos ou ambos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT 
    Pessoa.nome_pessoa,cpf,
    Gato.nome AS nome_gato,
    Cachorro.nome AS nome_cachorro
FROM 
    Pessoa
LEFT JOIN 
    Gato ON Pessoa.id_pessoa = Gato.id_proprietario
LEFT JOIN 
    Cachorro ON Pessoa.id_pessoa = Cachorro.id_proprietario;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explicação da Consulta&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SELECT&lt;/strong&gt;: Estamos selecionando o nome da pessoa, o cpf dela;  o nome do gato e o nome do cachorro. E como quero identificar os nomes dos animais de um modo mais específico, passo Gato.nome As nome_gato. A palavra-chave AS significa Como&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FROM&lt;/strong&gt;: Começamos pela tabela Pessoa, que é a nossa tabela principal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LEFT JOIN&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gato&lt;/strong&gt;: Estamos unindo a tabela Gato à tabela Pessoa usando a coluna id_proprietario. Isso traz os gatos dos proprietários.&lt;br&gt;
&lt;strong&gt;Cachorro&lt;/strong&gt;: Fazemos o mesmo para a tabela Cachorro.&lt;br&gt;
&lt;strong&gt;Resultado&lt;/strong&gt;: Esta consulta retorna todos os proprietários. Se um proprietário não tiver um gato ou um cachorro, o resultado mostrará NULL (ou uma célula em branco, dependendo do cliente SQL que você está usando).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fajpjohae3gn8emrafl5n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fajpjohae3gn8emrafl5n.png" alt=" " width="497" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6j7i2lnz9c9t8caje67q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6j7i2lnz9c9t8caje67q.png" alt=" " width="141" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sql</category>
      <category>mysql</category>
      <category>ddl</category>
      <category>dml</category>
    </item>
  </channel>
</rss>
