Conceitos básicos de backend
Tags: webdev, node, database, pattern
Published: 2023-04-07 22:29:54

Uma vez perguntei a um professor de desenvolvimento, que também era dev, o que um desenvolvedor backend junior precisava saber, isso há pouco mais de 2 anos atrás, essa foi a resposta dele:

## 1. Separação de camadas

É importante em uma aplicação backend que as responsabilidades sejam separadas, de maneira que as funções do seu código sejam independentes, mas que ao mesmo tempo trabalhem juntos, isso facilita na troca futura de ferramentas, manutenção do código e etc. Utilizando de uma explicação mais expositiva, olhe está imagem, mas não se preocupe em entender tudo agora:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wgzr2bw53wkks0z0hvpw.png)

Agora vamos por partes, nessa primeira parte temos a camada de _routes_, esta camada irá guardar as rotas da sua aplicação, que é basicamente a rota e o recurso que ela vai entregar - exemplo abaixo -, você pode utilizar de agrupamentos de rotas para modularizar mais ainda seu código. 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4oi2w8mp9ml7zucfx5n2.png)

Exemplo de _routes_: 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ewx6rth236kmg5v53e0u.png)

## 2. O que vai no _controller_?

Agora, a camada _Routes_ comunica com a _Controllers_, e essa, como o próprio nome sugere, controla o fluxo da requisição, é por ela e SOMENTE por ela que ocorre o recebimento da requisição e o envio da resposta, dentro dela não é aplicada nenhuma lógica ou regra de negócio. Segue abaixo um exemplo de controllers para login:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9s63wjf1nq42522cy4e0.png)



## 3. O que vai no _services_?

Falando sobre _services_, essa é a parte divertida, aqui você aplica toda a lógica e regra de negócio da sua aplicação e retorna para o _controller_, **PORÉM** não faça conexões com o banco de dados aqui, não coloque SQL e nem crie modelos do seu banco, **APENAS** lógica e regras de negócio. Então tá, senão aqui, onde aplicaríamos isso? Leia o próximo tópico.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/26qfytb0lu2y30ebnheb.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jlbnq1rtuqawd2ipabjl.png)

## 3. _Repository pattern_?
Já falamos das rotas, da camada de controle e da aplicação de regra de negócio, resta a _repository_, essa é responsável pela manipulação do banco de dados, ela persiste, modifica e busca dados.

Se vai fazer login, é nesta que faz a busca do usuário, se vai cadastrar um novo usuário, é aqui que salva, se vai atualizar, também é aqui e assim por diante, toda comunicação com o banco de dados é por essa camada. Um exemplo muito simples abaixo de uma busca de usuário no banco Mongo, onde só é necessário passar um id utilizando o model.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ehhl6kismw9cexx042xn.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/le0w9dtv7c145oqspx94.png)

Leia mais [aqui](https://renicius-pagotto.medium.com/entendendo-o-repository-pattern-fcdd0c36b63b)

## 4. O que é um _model_?
Existe um modelo de projeto chamado MVC, onde o M significa _model _e nesse tipo de projeto implica na lógica completa da sua aplicação, inclusive na conexão do banco. Porém, na linha de raciocínio exposta anteriormente, essa pasta pode ser utilizada para organizar as estruturas básicas que envolvem seu banco, modelo de entidades/tabelas e schemas. Por exemplo, no mongo você utiliza de schemas que é um objeto JSON que define a estrutura e o conteúdo do seu dados e para realizar uma busca no banco, é utilizado o Schema para fazer isso, o model é uma boa pasta para deixar o Schema.

## 5. O que é um ORM?
Por fim, os ORM são ferramentas para abstração de querys de buscas em bancos de dados, garantindo segurança e velocidade no desenvolvimento. Ele faz a conversa entre um objeto e um banco relacional, que possui paradigmas diferentes de funcionamento. Conectar, buscar, inserir e etc, é responsabilidade da ORM. Uma ferramenta bem conhecida é a sequelize: 
Leia mais [aqui](https://blog.betrybe.com/tecnologia/orm/)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g2nia8hhdqx2oboeqkdt.png)

Por fim, existem outras camadas que podem ser aplicadas e a melhor estrutura a ser utilizada depende do projeto, então o desenvolvedor deve analisar para saber qual faz mais sentido.
Saiba mais [aqui](https://medium.com/@stroklabs/como-organizar-e-estruturar-projetos-com-node-js-4845be004899)