<?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: Flávia Correia</title>
    <description>The latest articles on DEV Community by Flávia Correia (@fllaviacorreia).</description>
    <link>https://dev.to/fllaviacorreia</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%2F840080%2F1b2ebe5e-c971-4da6-bb1d-6415ff2ec04f.jpg</url>
      <title>DEV Community: Flávia Correia</title>
      <link>https://dev.to/fllaviacorreia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fllaviacorreia"/>
    <language>en</language>
    <item>
      <title>HTML e CSS em 10 minutos</title>
      <dc:creator>Flávia Correia</dc:creator>
      <pubDate>Thu, 08 Jun 2023 14:30:55 +0000</pubDate>
      <link>https://dev.to/devs-jequie/html-e-css-em-10-minutos-366i</link>
      <guid>https://dev.to/devs-jequie/html-e-css-em-10-minutos-366i</guid>
      <description>&lt;p&gt;Fala pessoal! Tudo bem?&lt;/p&gt;

&lt;p&gt;Esse post é para você iniciante e que tem dificuldade em entender o que é HTML e CSS. Mas será que dá mesmo pra entender sobre esse assunto em 10 minutos? Essa resposta é... &lt;/p&gt;




&lt;h2&gt;
  
  
  O HTML
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;HyperText Markup Language, no português brasileiro Linguagem de Marcação de Hipertextos, é uma linguagem de marcação, usada para definir a estrutura do conteúdo, o HTML é um padrão para estruturar um site, e ele possui sintaxe e semântica.&lt;/p&gt;

&lt;p&gt;O conteúdo de um documento HTML é formado por diversos tipos de elementos, então, um parágrafo, uma imagem ou uma tabela é um elemento no HTML.&lt;/p&gt;

&lt;h3&gt;
  
  
  Um elemento HTML
&lt;/h3&gt;

&lt;p&gt;Para inserir um elemento no documento HTML, é necessário uma tag (marcação), essa tag possui abertura, mas nem sempre possui fechamento, além disso, cada tag no HTML possui um nome, outra coisa necessária no elemento é o seu conteúdo (imagem,texto, vídeo, áudio, etc).&lt;/p&gt;

&lt;p&gt;A estrutura da tag de abertura é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sinal do menor que (&amp;lt;)&lt;/li&gt;
&lt;li&gt;Nome da tag&lt;/li&gt;
&lt;li&gt;Sinal do maior que (&amp;gt;)&lt;/li&gt;
&lt;li&gt;ex. &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A estrutura da tag de fechamento é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sinal do menor que (&amp;lt;)&lt;/li&gt;
&lt;li&gt;Barra (/)&lt;/li&gt;
&lt;li&gt;Nome da tag&lt;/li&gt;
&lt;li&gt;Sinal do maior que (&amp;gt;)&lt;/li&gt;
&lt;li&gt;ex. &lt;code&gt;&amp;lt;/h1&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A estrutura de um elemento título:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;h1&amp;gt; Olá Mundo! &amp;lt;/h1&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sintaxe de um documento .html
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset="utf-8"&amp;gt;
    &amp;lt;title&amp;gt;Olá Mundo!&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt; Olá Mundo! &amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt; Esse é um parágrafo. &amp;lt;/p&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;a. O &lt;strong&gt;DOCTYPE&lt;/strong&gt; é uma declaração para informar ao navegador como o documento deve se comportar.&lt;/p&gt;

&lt;p&gt;b. O elemento &lt;strong&gt;html&lt;/strong&gt; é um elemento que envolve todo o conteúdo da página, pode ser conhecido como o elemento raiz.&lt;/p&gt;

&lt;p&gt;c. O elemento &lt;strong&gt;head&lt;/strong&gt; é um elemento que envolve todo conteúdo importante para a página HTML, mas que não é relevante ao usuário sua visibilidade. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;o elemento &lt;strong&gt;meta&lt;/strong&gt; define qualquer informação de metadados que não pode ser definida por outro elemento.&lt;/li&gt;
&lt;li&gt;o &lt;strong&gt;charset&lt;/strong&gt; define a codificação de caracteres usada na página, nesse caso o UTF-8.&lt;/li&gt;
&lt;li&gt;o elemento &lt;strong&gt;title&lt;/strong&gt; define o título do documento mostrado na aba da página do navegador.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;d. O elemento &lt;strong&gt;body&lt;/strong&gt; é um elemento que envolve todo o conteúdo da página e esse sim, fica visível ao usuário.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;o elemento &lt;strong&gt;h1&lt;/strong&gt; define um título principal na página, existem elementos de título do h1 ao h6, eles agem de forma hierárquica como capítulos e subcapítulos de um livro.&lt;/li&gt;
&lt;li&gt;o elemento &lt;strong&gt;p&lt;/strong&gt; define um parágrafo no documento HTML.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Atributos
&lt;/h3&gt;

&lt;p&gt;Um elemento pode possuir atributos, como o atributo class ou o id (identificador). O atributo class e id são utilizados tanto no CSS quanto no JavaScript para selecionar o elemento e estilizá-lo ou modificá-lo através de funções ou da DOM.&lt;/p&gt;

&lt;p&gt;ex1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;h1 class="title"&amp;gt; Olá Mundo! &amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ex2.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div id="containerTitle"&amp;gt; 
   &amp;lt;h1 class="title"&amp;gt; Olá Mundo! &amp;lt;/h1&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ex3.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;meta charset="utf-8"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Para conhecer mais sobre elementos e atributos HTML, clique &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/HTML/Element" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  O CSS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;CSS ( Cascading Style Sheets ou Folhas de Estilo em Cascata) é uma linguagem de estilo usada para descrever a apresentação de um documento escrito em HTML ou em XML. Ele é definido seguindo algumas regras.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;a. A regra é aberta com um seletor. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;o seletor pode ser: o nome de uma tag, uma classe ou um id&lt;/li&gt;
&lt;li&gt;tag: h1;&lt;/li&gt;
&lt;li&gt;classe: .title;&lt;/li&gt;
&lt;li&gt;id: #containerTitle.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;b. em seguida, a abertura de chaves ( { ); &lt;/p&gt;

&lt;p&gt;c. a propriedade a ser modificada, dois pontos ( : ), o valor e ponto e vírgula ( ; )&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ex. &lt;code&gt;color : purple;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;d. por fim, o fechamento de chaves ( } );&lt;/p&gt;

&lt;p&gt;O resultado é o seguinte:&lt;/p&gt;

&lt;p&gt;ex1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;h1{
  color: purple;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ex2.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.title{
  color: green;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ex3.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#containerTitle{
  background-color: #dfdfdf;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Formas inserir no HTML
&lt;/h3&gt;

&lt;p&gt;Existem 3 formas simples de se utilizar o CSS no HTML&lt;/p&gt;

&lt;h4&gt;
  
  
  1a
&lt;/h4&gt;

&lt;p&gt;Essa primeira é inserindo diretamente no elemento utilizando o atributo style:&lt;/p&gt;

&lt;p&gt;ex.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;h1 style="font-size: 30px;"&amp;gt;Olá Mundo!&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perceba que a inserção da propriedade e valor seguem o padrão mencionado na seção anterior (propriedade:valor;)&lt;/p&gt;

&lt;h4&gt;
  
  
  2a
&lt;/h4&gt;

&lt;p&gt;A segunda forma de estilizar um documento HTML é utilizando o elemento style dentro do elemento head:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;style&amp;gt;
   p{
       color:darkblue;
       font-size: 15px;
    }
&amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim como temos um atributo style dentro de uma tag, temos o elemento style para estilizar, esse segundo segue o padrão de sintaxe citado na seção anterior:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;seletor&lt;/li&gt;
&lt;li&gt;abertura de chaves&lt;/li&gt;
&lt;li&gt;propriedade:valor;&lt;/li&gt;
&lt;li&gt;fechamento de chaves&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3a
&lt;/h4&gt;

&lt;p&gt;Essa terceira forma é a mais indicada para se trabalhar com o  CSS. Ela consiste em:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;criar um documento .css e adicionam-se os seletores e as modificações desejadas:
ex.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.title{
  color: green;
}

p{
  color:darkblue;
  font-size: 15px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;chamar esse documento .css no .html com o elemento link:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;link rel="stylesheet" href="css/styles.css"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;a. o link é um elemento utilizado para linkar, fazer uma ligação com outro documento ou arquivo que não se encontra dentro do documento HTML.&lt;br&gt;
b. O atributo rel define a relação entre o que está sendo importado e o documento atual. Nesse caso, é uma relação de estilização.&lt;br&gt;
o atributo href define o caminho a ser percorrido para importação. Nesse caso, o documento .css está na pasta css.&lt;/p&gt;

&lt;p&gt;Para conhecer mais sobre estilização, clique &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/CSS" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;E ai, deu para aprender em 10 minutos?&lt;/p&gt;

&lt;p&gt;Depende do seu nível de abstração, se a minha escrita foi coerente e coesa, se foi preciso ler mais de uma vez. &lt;/p&gt;

&lt;p&gt;Aprender em 10 minutos não acontece, nem em 1 mês. Fica ai o conselho: para aprender é necessário constância, pratique todos os dias, desafie a si mesmo, porque conhecimento não aplicado de nada adianta. Ele se perde, se esquece.&lt;/p&gt;

&lt;p&gt;Esse conteúdo exposto aqui é um pouquinho do mundo das linguagens de marcação e estilos. Tem muito mais. &lt;/p&gt;

&lt;p&gt;Seja curioso, pesquise e aplique.&lt;/p&gt;

&lt;p&gt;Valeu por estar até aqui.&lt;/p&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>web</category>
      <category>html</category>
      <category>css</category>
    </item>
    <item>
      <title>Qual a melhor linguagem de programação?</title>
      <dc:creator>Flávia Correia</dc:creator>
      <pubDate>Tue, 16 May 2023 01:14:08 +0000</pubDate>
      <link>https://dev.to/devs-jequie/qual-a-melhor-linguagem-de-programacao-1796</link>
      <guid>https://dev.to/devs-jequie/qual-a-melhor-linguagem-de-programacao-1796</guid>
      <description>&lt;p&gt;Fala pessoal, tudo bem?&lt;/p&gt;

&lt;p&gt;Pra você, qual a melhor linguagem de programação (LP)?&lt;/p&gt;

&lt;p&gt;A resposta correta é... Depende!&lt;/p&gt;

&lt;h2&gt;
  
  
  Lá vem o depende...
&lt;/h2&gt;

&lt;p&gt;Pois é, isso mesmo. Saber qual a melhor LP depende do contexto, da aplicação, do problema, do que precisa na aplicação, a arquitetura do cliente. E esse contexto precisa ser analisado de modo que essa escolha seja a melhor para a situação problema e não porque o colega A prefere a LP X ou Y.&lt;/p&gt;

&lt;p&gt;Vamos por partes:&lt;/p&gt;

&lt;h3&gt;
  
  
  Antes de tudo: O que é uma LP?
&lt;/h3&gt;




&lt;p&gt;Esse conceito peguei &lt;a href="https://rockcontent.com/br/blog/linguagem-de-programacao/" rel="noopener noreferrer"&gt;daqui&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;É uma linguagem formal que, através de uma série de instruções, permite que um programador escreva um conjunto de ordens, ações consecutivas, dados e algoritmos para criar programas que controlam o comportamento físico e lógico de uma máquina.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;1. LPs de baixo nível&lt;/strong&gt;&lt;br&gt;
 a. Linguagem de máquina: coleção de binários que o computador lê e interpreta.&lt;br&gt;
 b. Linguagem Assembly: primeira tentativa para uma linguagem próxima da usada por seres humanos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. LPs de alto nível&lt;/strong&gt;&lt;br&gt;
Essas usam tradutores (a) ou compiladores (b):&lt;br&gt;
 a. os códigos são executados à medida que são traduzidos.&lt;br&gt;
 b. os códigos são traduzidos de uma só vez.&lt;/p&gt;




&lt;h3&gt;
  
  
  O que se leva em consideração em um projeto de LP
&lt;/h3&gt;

&lt;p&gt;É importante ter alguns pontos que devemos levar em consideração quando vamos escolher uma LP para um projeto, como nos trás Sebesta (2011):&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%2Fd0yj3pu531aht62sd8d5.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%2Fd0yj3pu531aht62sd8d5.png" alt="Tabela 1 Critérios de avaliação de linguagens e as características que os afetam" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;legibilidade&lt;/strong&gt; diz respeito à facilidade com a qual os programas podem ser lidos e entendidos;&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;facilidade de escrita&lt;/strong&gt; é a medida da facilidade que uma linguagem pode ser usada para criar programas;&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;confiabilidade&lt;/strong&gt; diz respeito ao quanto um programa está de acordo com suas especificações em todas as condições;&lt;/li&gt;
&lt;li&gt;O &lt;strong&gt;custo&lt;/strong&gt; diz respeito a treinar programadores para usar a LP,  escrever programas na linguagem,  compilar programas na linguagem,  executar programas escritos em uma linguagem, sistema de implementação da linguagem, a confiabilidade baixa e manter programas (correções + modificações).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Algumas características que devem ser levadas em consideração: &lt;br&gt;
a. simplicidade geral (construções básicas e multiplicidade de recursos);&lt;/p&gt;

&lt;p&gt;b. ortogonalidade ( um conjunto construções primitivas pode ser combinado a um número de formas para construir as estruturas de controle e de dados da linguagem);&lt;/p&gt;

&lt;p&gt;c. tipos de dados (presença de mecanismos adequados para definir tipos e estruturas de dados);&lt;/p&gt;

&lt;p&gt;d. projeto de sintaxe (tem a ver com o formato dos identificadores, as palavras especiais e a forma e semântica);&lt;/p&gt;

&lt;p&gt;e. suporte à abstração (habilidade de definir estruturas em que muitos dos detalhes sejam ignorados);&lt;/p&gt;

&lt;p&gt;f. expressividade (existência de operadores que permitem muitas computações com um programa muito pequeno);&lt;/p&gt;

&lt;p&gt;g. verificação de tipos (execução de testes para detectar erros de tipos em um programa);&lt;/p&gt;

&lt;p&gt;h. tratamento de exceções (habilidade de um programa de interceptar erros em tempo de execução);&lt;/p&gt;

&lt;p&gt;i. restrição de apelidos (permitidos quando é possível ter um ou mais nomes para acessar a mesma célula de memória);&lt;/p&gt;

&lt;p&gt;j. portabilidade (a facilidade com a qual os programas podem ser movidos de uma implementação para outra);&lt;/p&gt;

&lt;p&gt;k. reusabilidade (diminuir a necessidade de criar diferentes subprogramas que implementam o mesmo algoritmo em diferentes tipos de dados);&lt;/p&gt;

&lt;p&gt;l. generalidade (a aplicabilidade da LP a uma ampla faixa de aplicações);&lt;/p&gt;




&lt;h2&gt;
  
  
  Programação procedural X Computação paralela
&lt;/h2&gt;

&lt;p&gt;Na programação procedural, o programador descreve de forma detalhada o que a máquina deve fazer.&lt;/p&gt;

&lt;p&gt;Já na computação paralela, resolvem-se os problemas com vários computadores trabalhando ao mesmo tempo, isso com o foco em um único alvo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Os paradigmas
&lt;/h2&gt;

&lt;p&gt;Dando um gugôu você encontra qual o significado do que é um paradigma: um exemplo que serve como modelo ou padrão.&lt;/p&gt;

&lt;p&gt;Na programação, temos diversos paradigmas, diversos modelos e padrões para resolver diversos problemas:&lt;br&gt;
&lt;strong&gt;1. Imperativo:&lt;/strong&gt; o foco da solução está em como o problema deve ser resolvido pela máquina (procedural). Usado quando a aplicação requer manutenção e mudanças a longo prazo. Linguagens como Pascal e Fortran usam esse tipo de paradigma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Orientado a Objetos:&lt;/strong&gt; os atributos e comportamentos estão contidos dentro de um único objeto, geralmente usam classes para definir esses objetos. Além disso, as aplicações são desenvolvidas e interpretadas por diferentes plataformas. C++, Java, JavaScript e Python são exemplos de projetos de LP orientados a objetos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Orientado a Eventos:&lt;/strong&gt; aqueles que definem a execução de determinadas funções conforme os eventos são disparados pelo usuário. Visual Basic e Delphi são exemplos que usam esse paradigma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Funcional:&lt;/strong&gt; indicado quando a resolução do problema querer, majoritariamente, de uma base matemática. Aqui se destaca o uso das funções e, na hora de resolver um problema, o divide em blocos onde são implementadas funções. Linguagens que usam esse paradigma são LISP e Haskell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Declarativo:&lt;/strong&gt; foca em o que deve ser resolvido, nesse paradigma são utilizadas verdades lógicas imutáveis, possuindo nível de abstração maior que os outros paradigmas, XML e HTML são exemplos de linguagens de marcação que usam esse paradigma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Lógico:&lt;/strong&gt; ou restritivo é o uso de uma notação lógica formal para comunicar processos computacionais para um computador, sendo muito utilizado para resolver problemas na área de Inteligência Artificial, baseando-se em análises lógicas e matemáticas, além disso são usados fatos, regras de inferências e busca. A Prolog é uma LP que faz uso desse paradigma.&lt;/p&gt;




&lt;p&gt;Muita coisa pra processar? É assim mesmo! Consegue perceber agora que não existe LP perfeita para todas as situações? Depois entro mais a fundo nesse tema de Conceitos de LPs. Recomendo a leitura do livro Conceitos de Linguagens de Programação do Robert W. Sebesta, nesse post usei a 9ª edição como base.&lt;/p&gt;

</description>
      <category>development</category>
      <category>programming</category>
      <category>beginners</category>
      <category>paradigm</category>
    </item>
    <item>
      <title>Um Projeto Spring Boot - P5.3</title>
      <dc:creator>Flávia Correia</dc:creator>
      <pubDate>Thu, 12 Jan 2023 20:36:54 +0000</pubDate>
      <link>https://dev.to/devs-jequie/um-projeto-spring-boot-p53-39oj</link>
      <guid>https://dev.to/devs-jequie/um-projeto-spring-boot-p53-39oj</guid>
      <description>&lt;p&gt;Fala pessoal!&lt;/p&gt;

&lt;p&gt;Mais um tutorial sobre Rest API em Java com Spring Boot chegando. E hoje vou falar um pouco sobre validações e tratamento de exceções.&lt;/p&gt;




&lt;h3&gt;
  
  
  Adicionando validação nos campos
&lt;/h3&gt;

&lt;p&gt;Algo que não queremos são erros de exceção gerados no banco de dados por causa de valores que foram enviados de forma incorreta (p.e. null, "" ou email inválido) ou que excedem o tamanho máximo da coluna. &lt;/p&gt;

&lt;p&gt;Então, antes desses dados serem salvos no banco, é preciso validá-los e ai para iniciarmos as validações vamos instalar o Validation:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;A segunda coisa a se fazer é adicionar anotações pertinentes aos campos da classe de editora como &lt;code&gt;@NotBlank&lt;/code&gt; nos itens que não podem ser nulos e nem vazios e &lt;code&gt;@Size (max = value)&lt;/code&gt; para validar se o item possui tamanho equivalente a column no banco de dados.&lt;/p&gt;




&lt;p&gt;A &lt;a href="https://jakarta.ee/specifications/bean-validation/3.0/apidocs/" rel="noopener noreferrer"&gt;documentação do Bean Validation&lt;/a&gt; possui diversas anotações úteis, como por exemplo de e-mail, vale à pena dar uma conferida. &lt;/p&gt;




&lt;p&gt;A classe de Editora ficou assim:&lt;br&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%2Fwfewqo6n3ceej5zicsf7.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%2Fwfewqo6n3ceej5zicsf7.png" alt="model de editora" width="554" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Já o último passo é inserir a anotação &lt;code&gt;@Valid&lt;/code&gt; nos métodos de POST e PUT lá no controlador:&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%2Fbczf95pubp60s4vkh7nd.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%2Fbczf95pubp60s4vkh7nd.png" alt="methods POST and PUT" width="646" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E pronto, a validação de Editora está pronta.&lt;/p&gt;

&lt;p&gt;Testando a aplicação, quando é enviado um request com todos os dados corretos temos:&lt;br&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%2F6ikrb5k66rab2i4fyqma.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%2F6ikrb5k66rab2i4fyqma.png" alt="post ok" width="800" height="188"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;retorno do que foi cadastrado + id;&lt;/li&gt;
&lt;li&gt;status = 201&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Já quando algum item não foi enviado corretamente, temos um response gigante com várias informações:&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%2Fx253itq3675dhln1caa6.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%2Fx253itq3675dhln1caa6.png" alt="error send request" width="800" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O principal (o que considero) nessa mensagem é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;status = 400;&lt;/li&gt;
&lt;li&gt;um defaultMessage com o motivo do erro;&lt;/li&gt;
&lt;li&gt;um field com o nome do campo de erro;&lt;/li&gt;
&lt;li&gt;a data e hora que ocorreu o erro.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  BÔNUS: Formatando o retorno das exceções
&lt;/h3&gt;

&lt;p&gt;Um bônus para você sobre como formatar o retorno das exceções ao endpoint:&lt;/p&gt;
&lt;h4&gt;
  
  
  P1
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;criar uma classe para o tratamento de exceções e extender a classe ResponseEntityExceptionHandler &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a minha classe se chama ApiExceptionsHandler e está no pacote library.api.exception&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;utilizar a anotação &lt;code&gt;@ControllerAdvice&lt;/code&gt; que, de forma simples, passa a ideia de que a classe é um componente Spring com o objetivo de tratar exceções globalmente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;puxar o método handleMethodArgumentNotValid&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;esse método é chamado quando ocorre algum erro que precisa ser retornado ao endpoint. Ele recebe 4 parâmetros:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;a exceção&lt;/li&gt;
&lt;li&gt;o cabeçalho&lt;/li&gt;
&lt;li&gt;o status e &lt;/li&gt;
&lt;li&gt;o que foi recebido pela API&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;com relação ao retorno do método escolhi o handleExceptionInternal porque ele permite retornar um objeto do tipo Object e ai esse objeto é que será a mensagem de retorno da API.&lt;/li&gt;
&lt;/ul&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%2Fxzc1ccuh1n9o1hvw05br.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%2Fxzc1ccuh1n9o1hvw05br.png" alt="class api exceptions" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  P2
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;criar uma classe Field dentro do pacote library.api.exception com atributos field (String) e mensage (String)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;adicionar as anotações do Lombok &lt;code&gt;@AllArgsConstructor&lt;/code&gt; e &lt;code&gt;@Getter&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fakt0n5nta9j8xu6bxsh9.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%2Fakt0n5nta9j8xu6bxsh9.png" alt="class field" width="800" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;criar a classe Error dentro do pacote library.api.exception&lt;br&gt;
e adicionar os objetos status (int), dateTime (LocalDateTime), title (String), listFields ()&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;adicionar as anotações Lombok &lt;code&gt;@Getter&lt;/code&gt; e &lt;code&gt;@Setter&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fkzsdq5jz1y0f6q68edl5.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%2Fkzsdq5jz1y0f6q68edl5.png" alt="class api error" width="800" height="296"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  P3
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;instanciar um array list do tipo Field na classe ApiExceptionHandler. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É preciso percorrer o objeto ex e para cada erro apontado pela API, pegar qual o campo que está com o erro e qual foi a defaultMessage dele. Cada item da lista de exceptions é um ObjectError e pra conseguir pegar o field é preciso do cast do tipo FieldError. Com isso, uma das possibilidades dese fazer isso é com o seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for (ObjectError error : ex.getBindingResult().getAllErrors()) {
    String field = ((FieldError) error).getField();
    String message = error.getDefaultMessage();

    fields.add(new Field(field, message));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;na classe ApiExceptionHandler instanciar um objeto Error e setar os valores&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;a. status = status.value();&lt;br&gt;
b. dateTime = LocalDateTime.now();&lt;br&gt;
c. title = "Um ou mais campos com preenchimento inválido.";&lt;br&gt;
d. listFields = o array populado anteriormente.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;retornar o erro formatado:
&lt;code&gt;return handleExceptionInternal(ex, error, headers, status, request);&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&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%2Fmtrgnya4k6ao0zcap2bd.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%2Fmtrgnya4k6ao0zcap2bd.png" alt="class api exceptions handler" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Com isso temos o resultado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;1 erro:&lt;br&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%2F5f1hrn2i4wnhom3bf3zs.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%2F5f1hrn2i4wnhom3bf3zs.png" alt="result class api exception handler" width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mais de 1 erro:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fjvu11oni2oeut46996n9.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%2Fjvu11oni2oeut46996n9.png" alt="2 result class api exception handler" width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Por hoje é isso! &lt;/p&gt;

&lt;p&gt;O link do repositório no GH: &lt;a href="https://github.com/fllaviacorreia/library-api/tree/develop" rel="noopener noreferrer"&gt;clica aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero que tenha gostado, curte, compartilha e deixa ttua opinião. &lt;/p&gt;

&lt;p&gt;Até mais!&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>website</category>
      <category>motivation</category>
      <category>gratitude</category>
    </item>
    <item>
      <title>Um Projeto Spring Boot - P5.2</title>
      <dc:creator>Flávia Correia</dc:creator>
      <pubDate>Thu, 05 Jan 2023 18:54:57 +0000</pubDate>
      <link>https://dev.to/devs-jequie/um-projeto-spring-boot-p52-15nf</link>
      <guid>https://dev.to/devs-jequie/um-projeto-spring-boot-p52-15nf</guid>
      <description>&lt;p&gt;Faala pessoal! Tudo bem? &lt;/p&gt;

&lt;p&gt;Estou de volta para mais um post sobre o projeto Rest API e para relembrar sobre o que já foi mostrado, deixo essa lista dos articles já publicados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/devs-jequie/um-projeto-rest-api-2pc9"&gt;Primeiro post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/fllaviacorreia/configurando-o-ambiente-de-desenvolvimento-4a7h"&gt;Segundo post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/fllaviacorreia/um-projeto-spring-boot-p1-nii"&gt;Terceiro post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/fllaviacorreia/um-projeto-spring-boot-p4-5931"&gt;Quarto post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/fllaviacorreia/um-projeto-spring-boot-p51-292f"&gt;Quinto post&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Continuando com o tutorial do último post:&lt;/p&gt;




&lt;h2&gt;
  
  
  Adicionando anotação para URI
&lt;/h2&gt;

&lt;p&gt;Para deixar o código mais organizado, adicionei uma anotação chamada RequestMapping e passei por parâmetro a URI da classe de controle e removi a anotação GetMapping do GET ALL editoras:&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%2Fqy2adivxa9o9wztkwtvf.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%2Fqy2adivxa9o9wztkwtvf.png" alt="request mappind add" width="787" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isso é bom porque ajuda a fazer uma manutenção mais fácil, por exemplo, se a classe de controle de usuários tivesse 100 métodos de manipulação e a URI fosse "users_controller", caso decidisse mudar para apenas "users", ou sairia removendo o "-controller" nos 100 métodos, ou daria um "Localizar + Substituir" correndo o risco de alterar alguma informação no código. &lt;/p&gt;




&lt;h2&gt;
  
  
  GET ONE
&lt;/h2&gt;

&lt;p&gt;O método para buscar todas as editoras já está pronto. Agora, podemos fazer um método que retorne uma editora em específico de acordo com o ID dessa editora.&lt;/p&gt;

&lt;p&gt;Aqui nesse ponto, podemos usar Response Entity que nos dá a possibilidade de manipular o cabeçalho, outras coisas, e o que será usado aqui será a modificação do status, sendo alguns deles que mais usarei:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;200 OK&lt;/li&gt;
&lt;li&gt;404 Not Found&lt;/li&gt;
&lt;li&gt;201 Created &lt;/li&gt;
&lt;li&gt;204 No Content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status" rel="noopener noreferrer"&gt;Aqui&lt;/a&gt; você pode ver mais sobre os códigos de status de respostas HTTP.&lt;/p&gt;

&lt;p&gt;O código mais enxuto de retorno de uma editora pode ser escritode 2 formas:&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%2Fzygg282d7627mgzrjqlc.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%2Fzygg282d7627mgzrjqlc.png" alt="método get one v1" width="742" height="116"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse é um método que recebe um id pela URI (por isso a anotação @PathVariable) e que, faz a busca pelo id, mapeia a editora e retorna com status OK(200) incluindo a editora encontrada. Caso não encontre, cai no orElse e retorna a construção de um Not Found (404). &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%2Ff1qc2unh3c587uh84hy9.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%2Ff1qc2unh3c587uh84hy9.png" alt="método get one v2" width="742" height="116"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Já nessa segunda versão, o map desse método atua da mesma forma que o primeiro, porém a construção é mais enxuta&lt;/p&gt;

&lt;p&gt;Uma terceira versão, menos enxuta, pode ser construída da seguinte forma:&lt;br&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%2F5lb9onaxfizi6xrtnq7y.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%2F5lb9onaxfizi6xrtnq7y.png" alt="método get one v3" width="787" height="169"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  GET BY NAME
&lt;/h2&gt;

&lt;p&gt;Uma terceira forma de consulta é pelo nome, por exemplo. &lt;/p&gt;

&lt;p&gt;Um modo simples é usando o &lt;a href="https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods" rel="noopener noreferrer"&gt;Query Methods&lt;/a&gt; do JPA, então na Interface repository de editora. Utilizando esse tipo de Query, tem que seguir algumas regras:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;iniciar o método com &lt;strong&gt;find&lt;/strong&gt; ou &lt;strong&gt;query&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;utilizar o &lt;strong&gt;By&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;se for a busca por propriedade, colocar o nome na classe Model da propriedade: por exemplo, na Model de Users tem um atributo chamado &lt;em&gt;nome&lt;/em&gt;, na Interface ficaria: &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;List&amp;lt;Users&amp;gt; findByNome(String nome)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Uma outra palavra reservada que pode ser utilizada é o &lt;em&gt;Containing&lt;/em&gt; no final do nome do método na Interface, que faz a busca em todas as linhas do banco que contém o conjunto de caracteres passados, ele equivale ao Like em query de DB SQL.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;List&amp;lt;Users&amp;gt; findByNomeContaining(String nome)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;OBS.: O JPA implementa esses métodos em tempo de execução, então não precisa implementá-los.&lt;/p&gt;

&lt;p&gt;A passagem do dado a ser buscado pode ser: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;pela URI, como o id e ai usa a anotação @PathVariable; &lt;/li&gt;
&lt;li&gt;pelo corpo da requisição e ai usa a anotação @RequestBody como é usado na criação e edição.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  POST
&lt;/h2&gt;

&lt;p&gt;Na imagem abaixo, temos o método para salvar uma nova editora no banco de dados:&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%2Fw3dv6fumbqwkcim88cgl.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%2Fw3dv6fumbqwkcim88cgl.png" alt="método de cadastro de editora" width="787" height="93"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A anotação @PostMapping indica que aquele método deve ser usado quando uma requisição do tipo POST é iniciada;&lt;br&gt;
A anotação @RequestBody com o status CREATED modifica o status de resposta para 201, &lt;br&gt;
Esse método retorna os dados da editora cadastrados juntamente com o ID. &lt;/p&gt;

&lt;p&gt;Essa é apenas uma opção, poderia retornar apenas o id com: &lt;code&gt;pCompanyRepository.save(pCompany).getId()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Poderia retornar uma mensagem de sucesso, ou apenas o status.  Por ora vamos deixar assim.&lt;/p&gt;




&lt;h2&gt;
  
  
  PUT
&lt;/h2&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%2Fhgs2aou0c26nmwqrpo6n.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%2Fhgs2aou0c26nmwqrpo6n.png" alt="método put" width="787" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O método de edição é muito parecido com a criação, apenas com alguns detalhes a mais, como na imagem, na ediçção primeiro verifiquei se aquela editora está cadastrada no banco de dados, caso não esteja, retorna o erro 404.&lt;/p&gt;

&lt;p&gt;Caso exista:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;seta o ID no objeto editora que veio na requisição;&lt;/li&gt;
&lt;li&gt;quando chama o save, pelo fato do atributo ID não estar vazio, o JPA vai entender que precisa editar ao invés de salvar uma nova linha no banco.&lt;/li&gt;
&lt;li&gt;no final, há o retorno da editora editada com status 200.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  DELETE
&lt;/h2&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%2Febiiuywc74czdfrfecz0.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%2Febiiuywc74czdfrfecz0.png" alt="método delete" width="787" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A deleção é bem simples também, há verificação de existência de editora, em seguida remove a editora através do ID e retorna o corpo da requisição vazio com o status 204.&lt;/p&gt;




&lt;p&gt;Bom pessoal, por hoje é isso, o repositório no GitHub pode ser acessado por &lt;a href="https://github.com/fllaviacorreia/library-api/tree/develop" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Até a próxima! &lt;/p&gt;

</description>
      <category>java</category>
      <category>spring</category>
      <category>tutorial</category>
      <category>rest</category>
    </item>
    <item>
      <title>Um Projeto Spring Boot - P5.1</title>
      <dc:creator>Flávia Correia</dc:creator>
      <pubDate>Tue, 20 Dec 2022 15:53:55 +0000</pubDate>
      <link>https://dev.to/devs-jequie/um-projeto-spring-boot-p51-292f</link>
      <guid>https://dev.to/devs-jequie/um-projeto-spring-boot-p51-292f</guid>
      <description>&lt;p&gt;Faala pessoal! Tudo bem? &lt;/p&gt;

&lt;p&gt;Estou de volta para mais um post sobre o projeto Rest API e para relembrar sobre o que já foi mostrado, deixo essa lista dos articles já publicados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/devs-jequie/um-projeto-rest-api-2pc9"&gt;Primeiro post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/fllaviacorreia/configurando-o-ambiente-de-desenvolvimento-4a7h"&gt;Segundo post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/fllaviacorreia/um-projeto-spring-boot-p1-nii"&gt;Terceiro post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/fllaviacorreia/um-projeto-spring-boot-p4-5931"&gt;Quarto post&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Ferramentas utilizadas
&lt;/h2&gt;

&lt;p&gt;Para o post de hoje, irei falar com vocês sobre persistência de dados, nessa situação estarei utilizando o &lt;a href="https://jakarta.ee/specifications/persistence/3.0/" rel="noopener noreferrer"&gt;Jakarta Persistence API&lt;/a&gt;, &lt;a href="https://spring.io/projects/spring-data-jpa" rel="noopener noreferrer"&gt;Spring Data JPA&lt;/a&gt; e &lt;a href="https://flywaydb.org/documentation/" rel="noopener noreferrer"&gt;FlyWay (FW)&lt;/a&gt;. É nesse ponto que iremos utilizar o banco de dados relacional MySQL, mas fica a seu critério se adaptar e utilizar o seu DB preferido.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Adicione o Spring Data JPA, FlyWay Migration e o MySQL Driver ao projeto;
&lt;em&gt;nesse ponto aqui, eu tive um problema com o drive do MySQL, então no pom.xml alterei a dependência do driver para:&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;&lt;br&gt;
   &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt;&lt;br&gt;
   &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt;&lt;br&gt;
   &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;&lt;br&gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Configurando a conexão com o banco de dados
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Adicione as informações do banco de dados no arquivo &lt;em&gt;application.properties&lt;/em&gt; que está dentro do pacote resources:&lt;/li&gt;
&lt;/ul&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%2Fknvyd2hihs3u3j6b9w38.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%2Fknvyd2hihs3u3j6b9w38.png" alt="dados no arquivo application.properties" width="800" height="121"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Como gerar migrations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Crie dentro de src/main/resources uma pasta 'db' e uma subpasta 'migration'. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É nelas que estarão todos os arquivos referentes ao banco de dados, como os scripts de criação/alteração/deleção de tabelas, colunas, etc.. &lt;/p&gt;

&lt;p&gt;Por padrão, o FW só lê os scripts com nome em determinado padrão, por padrão o FW percebe: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;arquivos iniciados com 'V', maiúsculo mesmo, e ai a identificação do arquivo fica a seu critério, com índice (V0001) ou data e hora (V20221213213045 - meu formato aqui está YYYY/MM/DD-HH:MM:SS)(eu vou seguir com a primeira opção);&lt;/li&gt;
&lt;li&gt;é inserido 2 underscore (__) após a versão do arquivo;&lt;/li&gt;
&lt;li&gt;é inserido a descrição do arquivo junto com a extensão .sql (p.e. create-table-books.sql)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Então no final fica: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;V0001__create-table-books.sql&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ou&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;V20221213213045__create-table-books.sql&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;OBS.: Se o projeto estiver rodando, quando criar o arquivo com a extensão .sql o devtools vai fazer o seu papel de reiniciar o servidor e o FW vai rodar o script vazio e isso vai gerar uma mudança no DB e ficar registrado na tabela referente ao FW que foi criada, a com nome &lt;em&gt;flyway_schema_history&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;É nessa tabela que são guardadas as infos referentes ao banco, como por exemplo quais os schemas rodados.&lt;/p&gt;

&lt;p&gt;Então, eu recomendo que, com o servidor inativo, crie os arquivos com a versão e extensão e, só depois de tudo certo, com o DDL inserido no arquivo, inicie o servidor.&lt;/p&gt;

&lt;p&gt;Você pode também fazer isso com o servidor ativo, ai pode criar o arquivo com o nome (ex. create-table-books.sql) e só depois alterar o nome do arquivo para o padrão.&lt;/p&gt;




&lt;h2&gt;
  
  
  Modificando a Model de Editora e criando a migration
&lt;/h2&gt;

&lt;p&gt;Como iniciei com o Model de Editora, vou criar o DDL de editora da seguinte forma:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;criei o arquivo V0001__create-table-publishing-companies.sql&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;adicionei o schema:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;CREATE TABLE IF NOT EXISTS publishing_companies(&lt;br&gt;
id BIGINT NOT NULL AUTO_INCREMENT,&lt;br&gt;
name VARCHAR(200) NOT NULL,&lt;br&gt;
city VARCHAR(50) NOT NULL,&lt;br&gt;
state VARCHAR(5) NOT NULL,&lt;br&gt;
country VARCHAR(100) NOT NULL,&lt;br&gt;
PRIMARY KEY (id)&lt;br&gt;
)&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;alterei a model de editora para garantir a persistência de dados e indicar que é uma table do banco:&lt;/li&gt;
&lt;/ul&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%2Fpl5aacq9166ei34igpmo.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%2Fpl5aacq9166ei34igpmo.png" alt="inclusão da persistência de dados v1" width="539" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;a. nas linhas 13 e 20 eu chamei mais uma funcionalidade do Lombok que é a geração de &lt;em&gt;hash code&lt;/em&gt; e &lt;em&gt;equals&lt;/em&gt;, se não tivesse o código iria fica muito poluído:&lt;br&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%2Fk1fof8tb7ylqerb1k1vy.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%2Fk1fof8tb7ylqerb1k1vy.png" alt="equals e hash code padrão" width="615" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. a linha 16 está indicando que a classe é uma entidade no banco de dados e na linha 17 referencio a tabela do DB com o nome "publishing_companies", caso o nome da tabela  fosse equivalente ao do Model, então não precisaria utilizar o Table(name = "name_table_reference")&lt;/p&gt;

&lt;p&gt;c. na linha 21 estou indicando que o atributo "id" é referencia à coluna ID da tabela;&lt;/p&gt;

&lt;p&gt;d. na linha 22 estou indicando que o ID da tabela será gerado a partir do padrão do banco, por isso a passagem do &lt;em&gt;strategy&lt;/em&gt; por parâmetro.&lt;/p&gt;

&lt;p&gt;e. repare que nos atributos seguintes não coloquei nenhuma anotação para identificar que são colunas na tabela publishing_companies, isso acaba se tornando opcional, nesse caso, porque o nome é igual. Caso não fosse esse o caso, passaria a anotação &lt;a class="mentioned-user" href="https://dev.to/column"&gt;@column&lt;/a&gt;(name = "nome_column")&lt;/p&gt;

&lt;p&gt;f. se deseja entender melhor sobre &lt;a class="mentioned-user" href="https://dev.to/entity"&gt;@entity&lt;/a&gt; e @Table, tem uma disussão no Stack Overflow sobre esse assunto &lt;a href="https://stackoverflow.com/questions/18732646/name-attribute-in-entity-and-table" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;modifiquei o GET de editora para fazer uma busca no banco de dados:&lt;/li&gt;
&lt;/ul&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%2F463as2xlj5furj2kqo1c.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%2F463as2xlj5furj2kqo1c.png" alt="publishing company controller" width="776" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;a. criei um atributo do tipo EntityManager para gerenciar o banco&lt;/p&gt;

&lt;p&gt;b. a partir dele, chamei o método para criar uma query e a busca foi feita usando &lt;a href="https://www.tutorialspoint.com/pg/jpa/jpa_jpql.htm" rel="noopener noreferrer"&gt;JPQL&lt;/a&gt; com o formato da classe de editora.&lt;/p&gt;

&lt;p&gt;c. o resultado é convertido em uma lista do tipo do model de editora e retornado para quem solicitou a busca.&lt;/p&gt;




&lt;p&gt;Como resultado, após iniciar o servidor, tive:&lt;/p&gt;

&lt;h3&gt;
  
  
  1 resultado no DB:
&lt;/h3&gt;

&lt;p&gt;a. duas tables criadas&lt;br&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%2Ftcvo0rd42s3d62cpenne.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%2Ftcvo0rd42s3d62cpenne.png" alt="tables no banco" width="800" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. a table do Flyway com 1 resultado e a column success = 1&lt;br&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%2Fwbocmn7dks5kmckm7anl.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%2Fwbocmn7dks5kmckm7anl.png" alt="table do flyway no banco" width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;c. a table de editora criada com o nome: publishing_companies e todos os atributos passados no DDL&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%2Fyjkgzbmhscsn2t4wacft.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%2Fyjkgzbmhscsn2t4wacft.png" alt="table de editora" width="800" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2 resultado no Postman:
&lt;/h3&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%2Fzlmz3zgarkze2t30y241.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%2Fzlmz3zgarkze2t30y241.png" alt="resultado no Postman" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Bom pessoal, por enquanto é isso.&lt;/p&gt;

&lt;p&gt;Na próxima publicação, vou trazer um tutorial sobre salvamento, deleção e alteração de dados.&lt;/p&gt;

&lt;p&gt;Se tiver alguma dúvida, deixa nos comentários, críticas e sugestões também são bem vindas.&lt;/p&gt;

&lt;p&gt;Até mais!&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>typescript</category>
      <category>react</category>
      <category>node</category>
    </item>
    <item>
      <title>Um projeto Spring Boot - P4</title>
      <dc:creator>Flávia Correia</dc:creator>
      <pubDate>Sat, 01 Oct 2022 18:44:50 +0000</pubDate>
      <link>https://dev.to/fllaviacorreia/um-projeto-spring-boot-p4-5931</link>
      <guid>https://dev.to/fllaviacorreia/um-projeto-spring-boot-p4-5931</guid>
      <description>&lt;p&gt;Faala pessoal, tudo bom? Vamos codar um pouco?&lt;/p&gt;

&lt;p&gt;Expandindo a pasta raiz do projeto, temos:&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%2F1wolfpswl25xle5w00wx.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%2F1wolfpswl25xle5w00wx.png" alt="estrutura de pastas do projeto" width="330" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;O src/main/java é uma estrutura padrão do Maven, nesse caminho é onde o código Java com destino à produção fica.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O src/main/resources é onde os arquivos estáticos ficam, como exemplo, aqueles arquivos de configuração.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A PublishingCompany (Editora)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Com o botão direito, clique no pacote com.projects.library &amp;gt; New &amp;gt; Class&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Edite os seguites campos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Package: com.projects.library.api.controller&lt;/li&gt;
&lt;li&gt;Name: PublishingCompanyController
e clique em Finish.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para ver se está tudo certo, vamos criar um método que retorna uma string.&lt;br&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%2Fsxt2nsrzsji51y6k6k86.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%2Fsxt2nsrzsji51y6k6k86.png" alt="primeiro código" width="800" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A linha 6 indica para o Spring que a classe é um componente Spring que trata requisições HTTP e que pode retornar respostas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alinha 9 é uma anotação que mapeia requisições do verbo Get  e toda vez que solicitar no endereço com "/publishing-companies" retorna o "Hello World" do método getPublishingCompanies.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Rodando o projeto e testando a requisição no Postman&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Na aba Boot Dashboard, expandindo a seção "local" teremos a library-api[devtools], ela é a que utilizamos para rodar o projeto&lt;br&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%2Fl6f14lotpzik093fvyxv.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%2Fl6f14lotpzik093fvyxv.png" alt="rodar o projeto" width="800" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No Postman, criei uma nova Collection, selecionei o verbo HTTP GET, adicionei a URL:PORT/URI criada no Controller. (no caso localhost:8080/publishing-companies) e dei um Send. O resultado está logo abaixo.&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%2Fxpei4nsjmcyg9q2mqgpd.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%2Fxpei4nsjmcyg9q2mqgpd.png" alt="requisição get no Postman" width="800" height="543"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Criando uma Model Publishing Company&lt;/strong&gt;&lt;br&gt;
Antes de iniciar a construção da Model, vamos configurar o Lombok, uma biblioteca que gera os Getters, Setters, Equals e HashCodes das Models, o que deixa o código mais limpo. &lt;/p&gt;

&lt;p&gt;Caso não ache necessário, pode partir para o tópico 6. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Prepare sua IDE por &lt;a href="https://projectlombok.org/" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Clique com o botão direito sobre o projeto;&lt;/li&gt;
&lt;li&gt;Vá para: Spring &amp;gt; Add starters;&lt;/li&gt;
&lt;li&gt;Selecione &lt;em&gt;Lombok&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;Clique em Next &amp;gt; Selecione pom.xml &amp;gt; Clique em Finish;&lt;/li&gt;
&lt;li&gt;Clique com o botão direito sobre o projeto;&lt;/li&gt;
&lt;li&gt;Vá para New &amp;gt; Class;&lt;/li&gt;
&lt;li&gt;Em package edite: &lt;em&gt;com.projects.library.domain.model&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;Em Name adicione: &lt;em&gt;PublishingCompanyModel&lt;/em&gt; e clique em Finish;&lt;/li&gt;
&lt;li&gt;Adicione os seguintes atributos:
&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%2Ffuulvdk8npaswiw3wsd5.png" alt="class sem lombok" width="800" height="264"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note que, existem alguns Warnings na classe pela falta de Getters e Setters, para sanar isso, como já falei antes, usaremos o Lombok, então, nas linhas 3 e 4 adiciono: &lt;br&gt;
&lt;code&gt;import lombok.Getter;&lt;br&gt;
import lombok.Setter;&lt;/code&gt;&lt;br&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%2F1idap11yndc40qmdb5fh.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%2F1idap11yndc40qmdb5fh.png" alt="class com lombok" width="800" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Assim, temos uma classe mais "enxuta" com os métodos necessários.&lt;/p&gt;

&lt;p&gt;Caso não tenha optado pelo Lombok, gere os &lt;em&gt;Getters&lt;/em&gt; e &lt;em&gt;Setters&lt;/em&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Modificando o &lt;em&gt;Controller&lt;/em&gt; de Publishing Companies&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%2F4gwp89x7yqk7dcykmn7j.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%2F4gwp89x7yqk7dcykmn7j.png" alt="modificando o método getPublishingCompanies" width="717" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Na linha 15, modifiquei para que o método retornasse uma lista de Editoras&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nas linhas 17 a 29 são criados 2 objetos instanciados do tipo da Model de Editora;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Na linha 31, através do método &lt;em&gt;asList&lt;/em&gt; da biblioteca Arrays, é retornado uma lista com os objetos.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O resultado é esse aqui:&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%2F1gz7bfrkmc5r681fhv72.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%2F1gz7bfrkmc5r681fhv72.png" alt="resultado do get de editora" width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Gerando um .jar do projeto
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;botão direito do mouse sobre o projeto&lt;/li&gt;
&lt;li&gt;Run As &amp;gt; Maven build... (o 5)&lt;/li&gt;
&lt;li&gt;Goals: clean package&lt;/li&gt;
&lt;li&gt;Run&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O arquivo .jar estará na pasta target&lt;br&gt;
Para rodar no terminal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;abra a parta target no terminal&lt;/li&gt;
&lt;li&gt;java -jar nome_projeto-0.0.1-SNAPSHOT.jar&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Com isso, podemos rodar o projeto sem precisar abrir a IDE, uma boa pra quando tiver toda a API pronta e quiser testar algum módulo.&lt;/p&gt;




&lt;p&gt;Chegamos ao fim de mais uma publicação, você pode acompanhar os posts anteriores aqui:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/devs-jequie/um-projeto-rest-api-2pc9"&gt;Primeiro post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/fllaviacorreia/configurando-o-ambiente-de-desenvolvimento-4a7h"&gt;Segundo post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/fllaviacorreia/um-projeto-spring-boot-p1-nii"&gt;Terceiro post&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O link do projeto no GitHub você acessa &lt;a href="https://github.com/fllaviacorreia/library-api" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Até mais!&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>beginners</category>
      <category>api</category>
      <category>java</category>
    </item>
    <item>
      <title>Um projeto Spring Boot - P3</title>
      <dc:creator>Flávia Correia</dc:creator>
      <pubDate>Sat, 01 Oct 2022 12:44:17 +0000</pubDate>
      <link>https://dev.to/fllaviacorreia/um-projeto-spring-boot-p1-nii</link>
      <guid>https://dev.to/fllaviacorreia/um-projeto-spring-boot-p1-nii</guid>
      <description>&lt;p&gt;Faala pessoal, tudo bom?&lt;/p&gt;

&lt;p&gt;Dando continuidade às publicações sobre REST API's, nessa publicação falo sobre como criar um novo projeto Spring. &lt;em&gt;Simbora&lt;/em&gt;?&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Gerando um novo projeto&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Com o Spring Tools Suite 4 aberto, vá em File &amp;gt; New &amp;gt; Spring Starter Project e modifique os seguintes campos:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Nome&lt;/strong&gt; : &lt;em&gt;library-api&lt;/em&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Type&lt;/strong&gt; : &lt;em&gt;Maven Project&lt;/em&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Java Version&lt;/strong&gt; : &lt;em&gt;11&lt;/em&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Group&lt;/strong&gt; : &lt;em&gt;com.projects.library&lt;/em&gt;&lt;br&gt;
esse é o identificador do projeto do Maven.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Artifact&lt;/strong&gt; : &lt;em&gt;library-api&lt;/em&gt;&lt;br&gt;
um projeto pode conter vários artefatos&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; (esse é opcional) : o meu: &lt;em&gt;API de Biblioteca&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Package&lt;/strong&gt; : &lt;em&gt;com.projects.library&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Adicionando dependências ao projeto&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Clicando em &lt;strong&gt;Next&lt;/strong&gt;, a próxima tela será para incluir as dependências do projeto. &lt;br&gt;
A versão do Spring Boot mantenho a 2.7.4.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adiciono, inicialmente, as dependências:&lt;br&gt;
&lt;strong&gt;a. Spring Web:&lt;/strong&gt;&lt;br&gt;
É um inicializador, ele serve pra adicionar um conjunto de dependências que evitam do dev inserir dependências isoladas manualmente, podendo ocorrer conflitos. Resumindo, serve pra otimizar o tempo na configuração de um novo projeto.&lt;br&gt;
&lt;strong&gt;b. Spring Boot DevTools:&lt;/strong&gt;&lt;br&gt;
é uma ferramenta que, por exemplo, toda vez em que ocorrem modificações no projeto, ele já reinicia o servidor da aplicação.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Finalizando a criação&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clica em Next &amp;gt; Finish.
Um fato interessante, o SSP gera o projeto na nuvem através do Base Url e os parâmetros de configuração estão no Full Url, então o processo é:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;-&amp;gt; Selecionamos nossas configs &lt;br&gt;
-&amp;gt; O SSP manda pra nuvem essas configurações &lt;br&gt;
-&amp;gt; Na nuvem o projeto é gerado e baixado como .zip &lt;br&gt;
-&amp;gt; O Spring descompacta o .zip no workspace. &lt;br&gt;
-&amp;gt; Seu projeto localmente é concluido.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OBS 1&lt;/strong&gt;&lt;br&gt;
Uma segunda possibilidade é gerar o .zip no &lt;a href="https://start.spring.io/" rel="noopener noreferrer"&gt;site do initializr&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OBS 2&lt;/strong&gt;&lt;br&gt;
Caso o projeto apresente algum erro siga esses passos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clique com o botão direito sobre o projeto;&lt;/li&gt;
&lt;li&gt;Selecione Maven &amp;gt; Update Project... ;&lt;/li&gt;
&lt;li&gt;Selecione "Force Update of Snapshots/Releases";&lt;/li&gt;
&lt;li&gt;Clique em OK e aguarde;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Seguindo esses passos é bem provável que o projeto já esteja configurado corretamente. &lt;/p&gt;

&lt;p&gt;Chegamos ao fim de mais uma publicação, você pode acompanhar os posts anteriores aqui:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/devs-jequie/um-projeto-rest-api-2pc9"&gt;Primeiro post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/fllaviacorreia/configurando-o-ambiente-de-desenvolvimento-4a7h"&gt;Segundo post&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O link do projeto no GitHub você acessa &lt;a href="https://github.com/fllaviacorreia/library-api" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Até mais!&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>spring</category>
      <category>java</category>
      <category>iniciante</category>
    </item>
    <item>
      <title>Configurando o ambiente de desenvolvimento - P2</title>
      <dc:creator>Flávia Correia</dc:creator>
      <pubDate>Sun, 11 Sep 2022 00:05:22 +0000</pubDate>
      <link>https://dev.to/fllaviacorreia/configurando-o-ambiente-de-desenvolvimento-4a7h</link>
      <guid>https://dev.to/fllaviacorreia/configurando-o-ambiente-de-desenvolvimento-4a7h</guid>
      <description>&lt;p&gt;Faala pessoal, tudo bom?&lt;/p&gt;

&lt;p&gt;Dando continuidade ao meu primeiro post sobre &lt;a href="https://dev.to/fllaviacorreia/um-projeto-rest-api-2pc9"&gt;REST API's&lt;/a&gt; , vim comentar um pouco sobre como configurei meu ambiente de desenvolvimento para fazer esse projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sobre o projeto
&lt;/h2&gt;

&lt;p&gt;A ideia é fazer um sistema simples de biblioteca, com CRUD de livros e usuários (leitores e administrador).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;As tabelas no banco são:&lt;/strong&gt;&lt;br&gt;
Livro; Categoria; Editora; Escritor; Empréstimo; Reserva; Usuário; etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nossas regras de negócio:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Livro possui autor, categoria, título, ano da publicação, quantidade de exemplares disponíveis, ele pode ser reservado, emprestado e devolvido.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O Leitor possui um usuário e ele pode visualizar os livros disponíveis, pode fazer uma reserva e empréstimo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O administrador faz o gerenciamento dos empréstimos, das reservas e devoluções. Além disso ele também possui usuário.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Com essa ideia, criei esse modelo de banco de dados relacional no MySQL Workbenck:&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%2F3k6o7domqudd9qzsdrk9.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%2F3k6o7domqudd9qzsdrk9.png" alt="modelagem de banco de dados para biblioteca" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;As tecnologias que irei utilizar&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Linguagem de programação: Java&lt;/li&gt;
&lt;li&gt;JRE/JDK: 11 (estou utilizando o OpenJDK)&lt;/li&gt;
&lt;li&gt;Framework: &lt;a href="https://spring.io/tools" rel="noopener noreferrer"&gt;Spring Tools Suite 4&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Banco de dados: MySQL&lt;/li&gt;
&lt;li&gt;Servidor do DB e PHPMyAdmin: Docker (você pode utilizar o MyQSQL Server e MySQL Workbenck)&lt;/li&gt;
&lt;li&gt;Realizar as requisições: Postman (você pode utilizar o Insomnia ou algum similar)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Um adendo: eu utilizo o Linux, então recomendo que utilize o WSL para rodar o Docker, caso seu SO seja Windows ou utilize as opções que citei acima.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Minhas configurações do Docker
&lt;/h2&gt;

&lt;p&gt;No estágio que faço na Fábrica de Software (CPDS-UESB) utilizamos o Laravel para desenvolver sistemas web, e por precisar rodar o Apache, o servidor de DB e a interface para acessar o banco utilizamos o Docker. &lt;/p&gt;

&lt;p&gt;Os &lt;em&gt;containers&lt;/em&gt; foram configurados pelo &lt;a href="https://www.linkedin.com/in/geneses-lopes/" rel="noopener noreferrer"&gt;Gêneses Lopes&lt;/a&gt;, junto com o &lt;a href="https://www.linkedin.com/in/tuliocalil/" rel="noopener noreferrer"&gt;Tulio Calil&lt;/a&gt; e &lt;a href="https://www.linkedin.com/in/reinaldo-bispo/" rel="noopener noreferrer"&gt;Reinaldo Bispo&lt;/a&gt;, eles deixaram tudo bonitinho, então como já tenho instalado na minha máquina preferi usá-lo.&lt;/p&gt;

&lt;p&gt;O repositório do projeto você acessa &lt;a href="https://github.com/GenesesLopes/docker" rel="noopener noreferrer"&gt;aqui&lt;/a&gt; com todas as infos de instalação e configuração.Faça alterações de portas no .env, eu fiz para o utilizar o PhpMyAdmin porque está configurado por padrão na porta 8080 e o Tomcat do Spring utiliza também a porta 8080, então modificando não terá conflito de portas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Os contêineres utilizados: phpmyadmin e mysql&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Para iniciar o Docker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No terminal:&lt;br&gt;
&lt;code&gt;sudo systemctl start docker&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Para rodar os &lt;em&gt;containers&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Normalmente, quando o Docker é iniciado o PHPMyAdmin e MySQL já estão rodando, caso não, no terminal insira o comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker container start mysql&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker container start phpmyadmin&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alternativa ao terminal&lt;/strong&gt;&lt;br&gt;
Uma outra opção é utilizar a extensão do Docker no VS Code, lá é possível ver os &lt;em&gt;containers&lt;/em&gt; rodando, iniciá-los, pará-los, reiniciá-los, excluir as imagens, enfim.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Para acessar o PhpMyAdmin&lt;/strong&gt; &lt;br&gt;
&lt;a href="http://localhost:%5Bsuaporta%5D" rel="noopener noreferrer"&gt;http://localhost:[suaporta]&lt;/a&gt; (a minha coloquei 9090)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;servidor: mysql;&lt;/li&gt;
&lt;li&gt;usuário e senha: root;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bom, é isso. &lt;br&gt;
Qualquer dúvida ou sugestão, deixe nos comentários!&lt;/p&gt;

&lt;p&gt;Fique na paz e até mais! :D&lt;/p&gt;

</description>
      <category>rest</category>
      <category>tutorial</category>
      <category>configs</category>
    </item>
    <item>
      <title>Um projeto Rest API - P1</title>
      <dc:creator>Flávia Correia</dc:creator>
      <pubDate>Sun, 04 Sep 2022 13:13:31 +0000</pubDate>
      <link>https://dev.to/devs-jequie/um-projeto-rest-api-2pc9</link>
      <guid>https://dev.to/devs-jequie/um-projeto-rest-api-2pc9</guid>
      <description>&lt;p&gt;Fala pessoal! Tudo bem? &lt;/p&gt;

&lt;p&gt;Hoje vim falar um pouco com vocês sobre Rest API's. Um assunto bem comentado e muito necessário no aprendizado do dev backend, até porque saber desenvolver aplicações baseadas em Rest se tornou um dos pré-requisitos para conquistar aquele primeiro emprego.&lt;/p&gt;

&lt;p&gt;Se você é alguém que está buscando novos conhecimentos, querendo se aprofundar um pouco nesse mundo de Rest ou até mesmo relembrar conceitos básicos, mas necessários, continue aqui nesse post.&lt;/p&gt;

&lt;p&gt;Boa leitura e espero que goste! :D&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é REST?
&lt;/h2&gt;

&lt;p&gt;REpresentational State Transfer significa, de forma literal, Transferência de Estado Representacional, Rest não é um framework, uma linguagem, aplicação, nem nada disso. &lt;/p&gt;

&lt;p&gt;É um &lt;strong&gt;modelo&lt;/strong&gt; para desenvolvimento de arquiteturas que traz em seu escopo diretrizes/padrões de comunicação para serem utilizadas na definição bem as interfaces de projetos e as mesmas devem ser muito bem delimitadas. Esse modelo possibilita a produção de sistemas distribuídos mais eficientes e confiáveis.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Na internet, a REST é um estilo, e o HTTP é um padrão.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  As constraints REST
&lt;/h2&gt;

&lt;p&gt;As mesmas que são determinadas pela arquitetura Rest são:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Cliente-Servidor&lt;/strong&gt;: ambos separados e independentes;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Stateless&lt;/strong&gt;: a comunicação entre o cliente e o servidor deve ser sem estado &lt;em&gt;(No escopo da requisição deve conter tudo o que é necessário para que seja processada da forma correta)&lt;/em&gt;;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Cache&lt;/strong&gt;: as respostas devem informar de modo claro se devem ser armazenadas em cache ou não;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Interface uniforme&lt;/strong&gt;: todos os provedores e consumidores devem compartilhar uma única interface do usuário para todas as operações &lt;em&gt;(Dá possibilidade para que as partes envolvidas evoluam de forma independente)&lt;/em&gt;;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Sistema em camadas&lt;/strong&gt;: habilidade de adicionar ou remover intermediários em tempo de execução sem que haja a interrupção do sistema;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Codificação sob demanda (opcional)&lt;/strong&gt;: a lógica em clientes pode ser atualizada independentemente da lógica do servidor usando código executável fornecido de provedores no lado cliente.&lt;/p&gt;

&lt;p&gt;Lembrando que, aplicações que implementam a arquitetura RESTful, são aquelas que implementam todas as restrições citadas acima.&lt;/p&gt;

&lt;p&gt;Uma das vantagens é que aplicações REST são independentes de linguagens,por exemplo, o backend pode ser em Java e o frontend em React.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mas, e API?
&lt;/h2&gt;

&lt;p&gt;As API's (Application Programming Interface) são um conjunto de requisições que permite a comunicação de dados entre as aplicações. Como no exemplo citado acima, o Cliente-Servidor.&lt;/p&gt;

&lt;p&gt;As API's utilizam-se das requisições HTTP que são responsáveis pela manipulação de dados, ou seja solicitar o CRUD em um dado armazenado, aquele a gente vê em Banco de Dados (Create Read, Update e Delete), aqui são responsáveis por isso os verbos POST, GET, PUT, DELETE, PATCH, OPTIONS, HEAD, e mais uma infinidade deles.&lt;/p&gt;




&lt;h2&gt;
  
  
  E agora?
&lt;/h2&gt;

&lt;p&gt;Nas próximas publicações pretendo trazer a produção de uma Rest API usando o Spring Tools Suite 4, além do Docker para rodar o MySQL e o PHPMyAdmin, Jakarta EE, Lombok, FlyWay, e, por enquanto, vamos ver os resultados através do Postman. &lt;em&gt;Futuramente, vou estar publicando um projeto frontend utilizando React.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Aguardem!&lt;br&gt;
Fique na Paz e até mais! &lt;/p&gt;

&lt;p&gt;.&lt;br&gt;
.&lt;br&gt;
.&lt;br&gt;
(viu algum erro ou discrepância? manda uma mensagem :D)&lt;/p&gt;

</description>
      <category>rest</category>
      <category>api</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>CARREIRA DEV: por onde começar?</title>
      <dc:creator>Flávia Correia</dc:creator>
      <pubDate>Sun, 04 Sep 2022 00:55:06 +0000</pubDate>
      <link>https://dev.to/devs-jequie/carreira-dev-por-onde-comecar-2i6k</link>
      <guid>https://dev.to/devs-jequie/carreira-dev-por-onde-comecar-2i6k</guid>
      <description>&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%2Fproaf3uzxze5jsleu8a5.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%2Fproaf3uzxze5jsleu8a5.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Faaala! Tudo bom? &lt;/p&gt;

&lt;p&gt;Pra dar início às minhas publicações aqui na comunidade, vim trazer pra vocês um artigo que publiquei alguns meses atrás sobre como começar na carreira dev.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/pulse/carreira-dev-por-onde-come%C3%A7ar-fl%C3%A1via-correia/" rel="noopener noreferrer"&gt;O artigo no Linkedin!&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Por onde eu começo?
&lt;/h2&gt;

&lt;p&gt;É muito comum, em um mar de conhecimento, a gente ficar perdido sobre qual caminho seguir, o que estudar, no que focar, se a nossa aptidão está mais em desenvolvimento, planejamento, gestão ou alguma outra função. E não é diferente na área de TI.&lt;/p&gt;

&lt;p&gt;Eu indico você a ler esse artigo bem bacana do Tulio Calil: &lt;br&gt;
&lt;a href="https://dev.to/tuliocalil/desenvolvimento-talvez-nao-seja-pra-voce-5dnk"&gt;"Desenvolvimento talvez não seja pra você"&lt;/a&gt;, porque é super importante nesse ponto inicial você compreender em que localização você está, se essa área de desenvolvimento se encaixa no seu perfil.&lt;/p&gt;

&lt;p&gt;Pra você que se interessa na carreira de desenvolvedor, seja em qualquer nicho, é importante analisar qual é o atual panorama desse ambiente, além das reais possibilidades, e saiba que tem muita vaga pra diversas subáreas e falta profissional qualificado.&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%2Fwh37r1ol316opqsp9sj2.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%2Fwh37r1ol316opqsp9sj2.png" alt=" " width="519" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fiz a análise, e agora?
&lt;/h2&gt;

&lt;p&gt;Analisou? Conseguiu se encontrar nessa rede gigante?&lt;br&gt;
Busque uma direção, exemplo, quero ser dev mobile, então escolho com quais tecs quero quer trabalhar, iOS ou Android? Se quero realizar desenvolvimento nativo com Swift ou Java, ou se prefiro trabalhar com desenvolvimento híbrido com Flutter ou React Native, tem também a Xamarin e Web Apps.&lt;/p&gt;

&lt;p&gt;É nesse momento que você consegue ver que a linha de pesquisa se afunila, busque entender o que você passará e o que será preciso aprender como dev dessa tecnologia. É aqui que se busca o desenvolvimento das habilidades, é preciso persistência e disciplina.&lt;/p&gt;

&lt;p&gt;Faça um roadmap (um site muito bom &lt;a href="https://roadmap.sh/" rel="noopener noreferrer"&gt;https://roadmap.sh/&lt;/a&gt;), aprenda sobre a sua stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;procure um bom curso de lógica de programação, aprenda a teoria por trás dos algoritmos, as diferentes estruturas de dados;&lt;/li&gt;
&lt;li&gt;veja quais são os fundamentos da sua stack;&lt;/li&gt;
&lt;li&gt;leia sobre layouts, a componentização de uma UI;&lt;/li&gt;
&lt;li&gt;procure sobre responsividade.&lt;/li&gt;
&lt;li&gt;compreenda sobre como é utilizada a memória, como otimizar e como gerenciar;&lt;/li&gt;
&lt;li&gt;compreenda sobre processamento, multithreading e gestão das filas;&lt;/li&gt;
&lt;li&gt;como realizar o gerenciamento de dependências;&lt;/li&gt;
&lt;li&gt;coloque em prática as boas práticas de arquitetura e design patterns&lt;/li&gt;
&lt;li&gt;faça testes, sempre!&lt;/li&gt;
&lt;li&gt;leia sobre CI e CD&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tenha em mente o processo de melhoria contínua, principalmente no que diz respeito à qualidade do seu código, siga as convenções e padrões, nada de colocar nomes de variáveis e de funções que não são legíveis, responsabilidades bem definidas e separadas também são importantes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Os diferenciais que posso ter
&lt;/h2&gt;

&lt;p&gt;Busque colocar em prática alguns princípios e metodologias como o TDD, KISS e SOLID. Seja faminto por conhecimento e seja humilde o suficiente para dizer que sabe pouco sobre alguma coisa, mesmo que sua bagagem seja grande. Já dizia Steve Jobs:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Stay hungry, stay foolish.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Desenvolva sua autonomia no aprendizado, focando em evolução contínua porque você precisa ser sua própria motivação, saiba filtrar o que lhe cai bem dentro da sua bagagem de conhecimento, seja organizado, seja curioso, corra atrás.&lt;/p&gt;

&lt;p&gt;Vale à pena sim saber sobre hardskills e principalmente softskills, super importante para quem quer evoluir e ser dev sênior. Trabalhe sua comunicação, a proatividade, a resiliência, saiba gerenciar seu tempo, mais uma coisa, não se apegue a uma linguagem de programação, tecnologias vêm e vão, mas a teoria por trás delas são as mesmas.&lt;/p&gt;

&lt;p&gt;E é isso pessoal! Gostou? Compartilha!&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>develop</category>
    </item>
  </channel>
</rss>
