Material de apoio para aprendizagem de desenvolvimento de APIs REST/backend. Além de conceitos, apresentamos como fazer usando o ecossistema Spring Boot.
Em uma aplicação Web típica, a tarefa do backend é receber uma requisição HTTP, ler, identificar o que precisa ser feito e fazer o que precisa ser feito. Isto envolve vários componentes, desde ler informações que vem do usuário passadas pelo frontend até a autenticação de usuários, verificação de permissões de acesso, leitura/escrita dos dados no banco de dados, calculos/processamento da informação, formação da resposta adequada (HTTP) a ser enviada de volta ao usuário (passada ao frontend). Essas atividades podem parecer simples na forma como são mencionadas, mas na verdade são bastante complexas e requerem toda uma orquestração de diversos serviços dentro do código do backend. Por exemplo, alguém precisa transformar o JSON recebido em um objeto dentro da aplicação backend para que possa ser manipulado. Processo inverso deve ocorrer ao enviar a resposta para o frontend. Alguém precisa empacotar tudo em uma resposta HTTP bem formada, com corpo, headers e código apropriados. Ao acessar dados é preciso levar em conta a natureza das bases de dados sendo acessadas para que a comunicação seja eficaz. Se vários clientes estiverem conectados ao servidor (backend) é preciso de alguma forma orquestrar quem vai ser atendido e quando, tendo estruturas de dados internas que possam gerenciar esse escalonamento.
Para nossa sorte existem diversos frameworks para desenvolvimento de backend que vão realizar pra gente a maioria das tarefas que são obrigatórias para todas as aplicações, como todas as que menciono acima. Neste curso usaremos o spring boot.
De forma geral, o framework de desenvolvimento vai oferecer serviços genéricos que irão aumentar a produtividade do programador de backend. O programador deixa de se preocupar com atividades que são comuns a todas as aplicações, já que estas atividades são feitas pelo framework. O desenvolvedor apenas tem que saber ativar as ações corretas do framework, desenvolvendo a aplicação para o framework específico. Isso é algo ruim, pois a aplicação fica acoplada ao framework escolhido. Por esta razão é bom usar frameworks que tenham chance de viver ainda por um bom tempo.
Como o framework vai realizar muitas tarefas importantes de forma transparente, o programador perde um pouco o controle sobre o que realmente está acontecendo internamente. Isso pode dificultar um pouco o debugging, mas de forma geral usar o framework é vantajoso em termos de produtividade. Com a experiência de uso de um determinado framework o desenvolvedor começa a entender melhor os serviços oferecidos, como configurá-los e como esses serviços são realizados. Para isso é importante entender aos poucos os serviços oferecidos pelo framework, quando e como são - não fazer por fazer, na tentativa e erro).
Você já parou pra pensar na diferença entre um framework e uma biblioteca? Quando você importa uma biblioteca no seu código, você passa a poder chamar operações desta biblioteca dentro do seu código. Quem controla quando e como cada operação de biblioteca é chamada é o seu código. Quando usamos um framework, esse controle passa para o framework. Quem controla todo o fluxo de execução da aplicação é o framework. Quem faz new de componentes, quem chama os componentes específicos quando necessário, quem faz o bind entre a aplicação e a porta TCP… Tudo quem faz é o framework. O que fazemos é apenas introduzir código específico de nossa aplicação. Então, por exemplo, quando chega uma requisição HTTP o código do framework (o container) sabe que precisa passar esse pedido para algum método de algum controlador. O que fazemos é seguir certas regras para produzir esse controlador de forma que o container/framework saiba exatamente para que controlador enviar esta requisição. Você vai perceber em Spring Boot, por exemplo, que nunca fazemos new de nada, quem faz é o container do framework que sabe o que quer rodar e quando.
O backend pode usar, além das bibliotecas do framework de desenvolvimento, outras bibliotecas já prontas. Tudo em nome de aumentar a produtividade, então não precisamos desenvolver do zero (from scratch) o que alguém já desenvolveu e testou. O próprio framework vai fazer uso de bibliotecas externas em muitas situações. Para facilitar a implantação (deploy) do código de backend nós usamos uma ferramenta que vai gerenciar as dependências desse software de backend. Neste curso vamos usar o maven para controle de dependências.
Para entender mais detalhes leia este artigo já em português, bastante didático sobre a gerência de dependências em aplicações java.