<?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: Leonardo Ferreira</title>
    <description>The latest articles on DEV Community by Leonardo Ferreira (@leo606).</description>
    <link>https://dev.to/leo606</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%2F850251%2F2077c0f7-e4f9-4645-bf15-635a824d1aef.jpg</url>
      <title>DEV Community: Leonardo Ferreira</title>
      <link>https://dev.to/leo606</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/leo606"/>
    <language>en</language>
    <item>
      <title>Arquitetura em Camadas: Um guia para Organização de APIs</title>
      <dc:creator>Leonardo Ferreira</dc:creator>
      <pubDate>Fri, 06 Mar 2026 01:23:19 +0000</pubDate>
      <link>https://dev.to/leo606/arquitetura-em-camadas-um-guia-para-organizacao-de-apis-1pm6</link>
      <guid>https://dev.to/leo606/arquitetura-em-camadas-um-guia-para-organizacao-de-apis-1pm6</guid>
      <description>&lt;h3&gt;
  
  
  Entenda como a divisão entre Controller, Service e Repository garante escalabilidade e facilita a manutenção de sistemas modernos.
&lt;/h3&gt;

&lt;p&gt;No desenvolvimento de software, a organização do código é tão importante quanto a sua funcionalidade. Uma API desestruturada pode funcionar no primeiro dia, mas rapidamente se torna um pesadelo de manutenção. Para evitar o acúmulo de dívida técnica, a indústria consolidou um padrão de divisão em três camadas principais: &lt;strong&gt;Controller&lt;/strong&gt;, &lt;strong&gt;Service&lt;/strong&gt; e &lt;strong&gt;Repository&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Esta estrutura baseia-se no princípio da &lt;strong&gt;Responsabilidade Única&lt;/strong&gt;. Cada camada tem um papel estrito e não deve assumir tarefas que pertencem a outra.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Controller: A Interface de Entrada
&lt;/h2&gt;

&lt;p&gt;A camada de &lt;strong&gt;Controller&lt;/strong&gt; atua como o ponto de contato entre o cliente (como um aplicativo ou navegador) e a aplicação. Sua função é puramente administrativa e de fluxo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Responsabilidades:&lt;/strong&gt; Receber a requisição HTTP, validar a presença de parâmetros obrigatórios, extrair dados de cabeçalhos (headers) e do corpo (body) da mensagem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O que não deve fazer:&lt;/strong&gt; O Controller jamais deve conter regras de negócio, como cálculos de impostos ou validações de permissões complexas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após organizar os dados recebidos, o Controller os repassa para o Service correspondente. Assim que recebe o retorno, ele monta a resposta final com o status code adequado (&lt;code&gt;200 OK&lt;/code&gt;, &lt;code&gt;201 Created&lt;/code&gt;, &lt;code&gt;400 Bad Request&lt;/code&gt;, etc.).&lt;/p&gt;

&lt;h3&gt;
  
  
  O que o Controller DEVE fazer:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Capturar dados:&lt;/strong&gt; Ler parâmetros de URL, cabeçalhos (headers) e o corpo (body) da requisição.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validar o formato:&lt;/strong&gt; Verificar se o JSON enviado possui os campos obrigatórios e os tipos de dados corretos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delegar:&lt;/strong&gt; Repassar os dados já organizados para o Service responsável.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responder:&lt;/strong&gt; Retornar o status HTTP adequado (ex: 201 para criação, 404 para não encontrado) e o corpo da resposta.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  O que o Controller NÃO DEVE fazer:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lógica de Negócio:&lt;/strong&gt; Nunca deve realizar cálculos, aplicar descontos ou validar regras de permissão complexas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acesso a Dados:&lt;/strong&gt; Jamais deve importar um modelo de banco de dados ou executar queries diretamente.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Service: O Coração da Lógica de Negócio
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Service&lt;/strong&gt; é onde a inteligência da aplicação reside. É nesta camada que as regras de negócio são aplicadas, processamentos são realizados e cálculos são executados.&lt;/p&gt;

&lt;p&gt;Uma característica fundamental do Service é que ele deve ser &lt;strong&gt;agnóstico à tecnologia de transporte&lt;/strong&gt;. Isso significa que o Service não "sabe" o que é HTTP. Ele não deve lidar com objetos de requisição ou resposta do framework web.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Exemplo Prático:&lt;/strong&gt; Se uma rota de busca permite filtrar nomes por vírgula (&lt;code&gt;?nomes=Ana,João&lt;/code&gt;), o Controller deve transformar essa string em um array de strings antes de passá-la ao Service. O Service recebe o dado já estruturado, focado apenas na lógica de filtragem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Além de desconhecer o protocolo de entrada, o Service também não interage diretamente com o banco de dados. Ele solicita os dados de que precisa à próxima camada: o Repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que o Service DEVE fazer:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Processamento Central:&lt;/strong&gt; Executar cálculos, aplicar regras de negócio e validações lógicas (ex: verificar se um saldo é suficiente).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orquestração:&lt;/strong&gt; Chamar múltiplos Repositories ou serviços externos se a operação exigir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trabalhar com Dados Estruturados:&lt;/strong&gt; Receber tipos de dados limpos (como arrays e objetos) e não strings brutas vindas da URL.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  O que o Service NÃO DEVE fazer:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Conhecer o HTTP:&lt;/strong&gt; Não deve lidar com objetos de &lt;code&gt;request&lt;/code&gt; ou &lt;code&gt;response&lt;/code&gt;, nem saber o que é um "Status Code".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Montar Queries:&lt;/strong&gt; Não deve conter código SQL ou sintaxe específica de bancos de dados.
## 3. Repository: A Camada de Persistência&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O &lt;strong&gt;Repository&lt;/strong&gt; é o especialista em dados. Sua única missão é gerenciar a comunicação com o mecanismo de armazenamento, seja ele um banco de dados SQL, NoSQL ou até uma integração com um sistema de arquivos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Foco Técnico:&lt;/strong&gt; Aqui ficam as queries (consultas) e a lógica de persistência.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolamento:&lt;/strong&gt; O Repository não toma decisões de negócio. Ele apenas executa comandos como "buscar usuário por ID" ou "salvar nova transação".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ao isolar o acesso aos dados, tornamos o sistema flexível. Se no futuro for necessário trocar o banco de dados, as alterações ficam restritas apenas aos Repositories, sem afetar a lógica central da aplicação.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que o Repository DEVE fazer:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Operações de CRUD:&lt;/strong&gt; Criar, ler, atualizar e deletar registros no banco de dados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Abstrair a Query:&lt;/strong&gt; Conter a implementação técnica da busca (ex: &lt;code&gt;SELECT * FROM users WHERE id = ?&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mapeamento:&lt;/strong&gt; Converter os dados brutos do banco para objetos que o Service consiga entender.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  O que o Repository NÃO DEVE fazer:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tomar Decisões:&lt;/strong&gt; Não deve decidir se um usuário "pode" ser deletado; ele apenas executa a deleção quando solicitado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encadear Lógicas:&lt;/strong&gt; Evitar chamadas de um Repository para outro; essa coordenação deve vir do Service.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Por que utilizar esta estrutura?
&lt;/h2&gt;

&lt;p&gt;A separação de contextos traz benefícios tangíveis para o ciclo de desenvolvimento:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Testabilidade:&lt;/strong&gt; Com responsabilidades divididas, podemos criar testes automatizados muito mais assertivos. É possível testar a lógica do &lt;em&gt;Service&lt;/em&gt; isoladamente, simulando (mocking) as respostas do banco de dados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reutilização de Código:&lt;/strong&gt; Um método de um Repository, como o &lt;code&gt;getUserById&lt;/code&gt;, pode ser utilizado por diversos Services diferentes. Isso evita a duplicidade de código e facilita correções globais.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manutenibilidade:&lt;/strong&gt; Quando surge um erro, é mais fácil identificar onde ele está. Problemas de conexão com o banco? Verifique o Repository. Erro no cálculo de um desconto? O problema está no Service.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
