Antes de falarmos sobre o Spring, vamos estudar alguns conceitos fundamentais sobre o Desenvolvimento WEB:
- Desenvolvimento: Back-end e Front-end
- SOFEA
- API REST
- Arquitetura MVC
O Front-end, de forma sucinta, é toda parte visual de um site, a parte com a qual o usuário interage diretamente, ou seja, o código do sistema que roda no navegador.
O profissional responsável por trabalhar nessa área de um projeto desenvolve o código para a interface gráfica, normalmente por meio de linguagens de marcação, estilo e programação. Um desenvolvedor Front-end normalmente trabalha criando toda a parte visual dos sites por meio de linguagens de marcação (HTML), estilização (CSS) e programação (JavaScript e TypeScript), além de bibliotecas (React e Bootstrap) e frameworks (Angular e VUE), além de metaframeworks baseados em React, como o Next. Abaixo vemos a página principal de um Front-end que irá consumir os Recursos e os Endpoints de um Back-end.
Apesar de mais abstrato, o conceito de Back-end também é simples de entender: os dados publicados em uma rede social, como fotos e vídeos, por meio da interface do usuário precisam ser armazenados (persistidos) em algum local para poderem ser acessados posteriormente. Esse envio não é feito diretamente do Front-end para o Banco de dados da rede social. Ao invés disso, existe uma parte da aplicação que é responsável por receber essas informações, fazer operações específicas — postagens, filtros, exclusões, verificações de segurança e validações e somente após isso, armazenar no Banco de dados. Esse é o Back-end. As atribuições de um desenvolvedor Back-end não incluem a criação de páginas, como acontece com profissionais Front-end. Em vez disso, eles são responsáveis por implementar arquiteturas robustas, que se comuniquem com o Banco de dados (MySQL, PostgreSQL, SQL Server, ou Oracle) e que garantam a segurança dos dados enviados pelo usuário. Para isso utiliza linguagens de programação como o Java e o Framework Spring. Abaixo vemos uma imagem da Documentação de uma aplicação Back-end, criada com o Swagger, contendo todos os seus Recursos e respectivos endpoints (funcionalidades).
Na ilustração abaixo vemos o Front-end e o Back-end da aplicação funcionando de forma independente, se comunicando através da Internet, via requisições HTTP:
Na ilustração abaixo vemos algumas soluções para o Desenvolvimento do Front-end, Back-end e Banco de dados:
Quem trabalha tanto no Desenvolvimento do Front-end quanto no Desenvolvimento do Back-end é conhecido como “Desenvolvedor (a/e) Fullstack” ou “Programador (a/e) Fullstack”. Esse profissional é capaz de entregar um projeto do início ao fim, sem necessariamente precisar de ajuda de outras pessoas desenvolvedoras para criar uma parte do sistema, dependendo do seu tamanho, complexidade, tempo e recursos disponíveis.
SOFEA (Service Oriented Front-end Architecture - Arquitetura de Serviço Orientado ao Front-end) é uma arquitetura para Desenvolvimento WEB em Ambientes Cloud, onde o Front-end é independente do Back-end e inclusive pode estar hospedado em um Servidor diferente do Back-end. Nesta arquitetura, a lógica de apresentação (código do cliente) é desacoplada da lógica de negócios (Banco de dados e o Back-end), e a interface do usuário obterá dados dos serviços em a forma de JSON ou XML com a ajuda de solicitações HTTP Requests e Respostas HTTP Response.
A arquitetura SOFEA é desenvolvida com o auxílio do SPA (Single Page Application). Na Primeira solicitação, todo o HTML , CSS e JavaScript é baixado e, em seguida, cada página solicitada é ligada com os dados que vêm com a ajuda de Requisições HTTP.
São aplicações cuja funcionalidade está concentrada em uma única página. Ao invés de recarregar toda a página ou redirecionar o usuário para uma página nova, apenas o conteúdo principal é atualizado de forma assíncrona, mantendo toda a estrutura da página estática. Imagine um dashboard, em que os menus lateral e superior são os mesmos para todas as telas da aplicação. Ao clicar em uma opção como “Cadastro de produtos”, o usuário não precisaria recarregar toda a página para ver que no fim apenas o conteúdo central mudou. Para evitar isso, mantemos os menus fixos e alteramos apenas a parte do meio, em que estarão os formulários, tabelas, etc.
- A camada de apresentação é desacoplada da camada de negócios, o que ajuda o aplicativo a obter uma resposta mais rápida.
- Executa em uma variedade de dispositivos.
- Muito bem suportado em ambiente de nuvem.
- Escalabilidade - o servidor tem menos trabalho a fazer; chega de geração de apresentação, apenas fornece serviços
- Melhor resposta do usuário - Baixa latência = usuários finais felizes - Após o download do aplicativo, nenhuma apresentação é transportada pela rede, apenas dados de negócios
- Ajuste natural em ambiente Cloud
- Modelo de programação organizado - Os desenvolvedores do cliente se concentram na Interface com o Usuário - os desenvolvedores do lado do servidor se concentram na lógica do negócio
- Aplicativos off-line - quando a rede falha, o cliente desacoplado pode alternar dinamicamente seus objetos de modelo
- Interoperabilidade - Integração mais fácil com menor sobrecarga de várias plataformas - Os clientes não se importam se os serviços são Java, C #, Python, ou uma combinação heterogênea
Primeiro vamos compreender os 2 conceitos:
API é um acrônimo que provém do inglês Application Programming Interface (Interface de Programação de Aplicações), que se trata de um conjunto de rotinas e padrões estabelecidos e documentados por uma determinada aplicação, para que outras aplicações consigam utilizar todas as suas funcionalidades sem precisar conhecer os detalhes da implementação do software.
Desta forma, entendemos que as API’s permitem uma interoperabilidade entre aplicações. Em outras palavras, a comunicação entre aplicações e entre os usuários de uma API pode receber requisições de diversas aplicações distintas (Web, Mobile, Desktop e até mesmo de uma outra API).
REST é um acrônimo que provém do inglês, que significa Representational State Transfer, que foi criado no ano 2000 por Roy Fielding, em sua tese de doutorado, na qual ele descreve um design de arquitetura de software construído para servir aplicações em rede.
REST é um estilo de arquitetura de software para aplicações em rede, utilizada para integrar o Back-end com o Front-end, através do protocolo HTTP. Uma API Rest se comunica com o Front-end através do envio de Requests (Requisições) e do e recebimento de Responses (Respostas).
Estas Requisições e Respostas, são compostas por Objetos no formato JSON, em conjunto com os Métodos HTTP GET, POST, PUT e DELETE.
JSON (JavaScript Object Notation) é um modelo para armazenamento e transmissão de informações no formato texto. Apesar de muito simples, tem sido bastante utilizado por aplicações Web devido a sua capacidade de estruturar informações de uma forma bem mais compacta do que o modelo XML, tornando mais rápido a interpretação dessas informações. Isto explica o fato de o JSON ter sido adotado por empresas como Google e Yahoo, cujas aplicações precisam transmitir grandes volumes de dados.
O formato JSON utiliza o modelo de definição de dados conhecido como Chave-Valor, onde para cada valor representado, atribui-se um nome ou rótulo (Chave), que descreve o seu significado. Esta sintaxe é derivada do JavaScript, que utiliza este formato para representar informações. O JSON se tornou muito popular porque os principais Frameworks e Bibliotecas Front-end do Mercado (React, Angular e VUE) utilizam a Linguagem JavaScript, logo trabalham nativamente com o formato JSON.
Visualizadores JSON
Para visualizar o formato JSON corretamente no seu Navegador da Internet é necessário instalar a extensão JSON Viewer. Segue abaixo os links com a extensão específica para cada Navegador:
Podemos dizer que a API REST e a RESTful têm objetivos distintos, mas complementares.
REST (representational state transfer) é como um guia de boas práticas. Uma vez que é um modelo de arquitetura de software que define uma série de requisitos para que as APIs sejam desenvolvidas, ou seja, é uma base para a construção de APIs que conecta os usuários com as aplicações em nuvem.
RESTful é a capacidade de um determinado sistema aplicar os principios REST
Os principais critérios para uma API ser RESTful são:
- Hipermídias (HATEOAS): Basicamente, sua API deve ser um livro aberto, você não deve depender exclusivamente da documentação, pois a API se auto-descreve por meio de hipermídia.
- Stateless: Significa que cada solicitação HTTP ocorre em isolamento completo. Quando o cliente faz uma Requisição HTTP, ele inclui todas as informações necessárias para o servidor atender à solicitação. O servidor nunca depende de informações de solicitações anteriores do cliente. Se alguma dessas informações for importante, o cliente a enviará como parte da solicitação atual;
- Cacheable: Mantém em cache as Respostas das últimas Requisições;
- Cliente-Servidor;
- Layered system: O Desenvolvimento da aplicação é distribuído em Camadas com funções pré-determinadas.
Sem seguir todas estas regras, sua API não será RESTful, será apenas mais uma implementação em cima do protocolo HTTP. O primeiro ítem da lista, Hipermídias, é o item menos implementado, por isso que poucas API's são do tipo Restful.
Para definir se uma API é Rest ou Restful, foi criado o Modelo de Maturidade de Richardson:
-
Uma API que não atenda nenhuma das regras
-
Recursos: A partir do momento em que seja possível fazer requisições de diferentes recursos em diferentes endpoints.
-
Verbos HTTP: Aqui, os diferentes Métodos HTTP são colocados em prática, em contraposição ao uso quase exclusivo do POST no protocolo SOAP. Além disso, cada verbo possui sua utilidade específica: PUT para atualizar, DELETE para excluir, GET para adquirir e POST para criar. Em alguns casos o PATCH também é utilizado.
-
Hypermedia: Os recursos passam a possuir links para recursos relacionados, além de links para realizar ações em cima dessas coleções, a partir desse ponto, a API se auto-documenta e possibilita a funcionalidade de descoberta.
Na imagem acima, vemos um JSON de uma API RESTful com Hypermídia. Observe que além do Objeto, também foi retornado um link indicando o Endpoint que lista todos os Objetos da Classe Postagem.
No Bootcamp implementaremos API's REST (Nível 2).
MVC é acrônimo de Model, View e Controller, é um padrão de arquitetura de software responsável por contribuir na otimização da velocidade entre as requisições feitas pelo comando dos usuários.
A arquitetura MVC é dividida em três componentes essenciais:
Model (Modelo): Sua responsabilidade é gerenciar e controlar a forma como os dados se comportam por meio das funções, lógica e regras de negócios estabelecidas.
Controller (Controladora): A camada de controle é responsável por intermediar as requisições enviadas pelo View com as respostas fornecidas pelo Model, processando os dados que o usuário informou e repassando para outras camadas.
View (Visão): Essa camada é responsável por apresentar as informações de forma visual ao usuário. Em seu desenvolvimento devem ser aplicados apenas recursos ligados a aparência como mensagens, botões ou telas.
Um dúvida muito recorrente na programação é se no processo de desenvolvimento pode ter apenas esses 3 componentes ou se é possível acrescentar mais alguns. A resposta é sim para a possibilidade de inserir uma camada extra. Essa sequência de códigos pode ser alterada conforme a necessidade do projeto.
O Spring é um framework Open Source, utilizado no desenvolvimento do Back-end de uma aplicação WEB, através da plataforma Java, que facilita o desenvolvimento de aplicações usando os conceitos de Inversão de Controle e Injeção de Dependência. Ele é composto por vários módulos independentes, as chamadas dependências, que oferecem recursos para persistência de dados, integração, segurança, testes, desenvolvimento web, entre outros. O Spring também permite criar aplicações leves, que não dependem de servidores de aplicação pesados, e que são mais fáceis de compreender, manter e escalar.
O framework Spring foi criado para facilitar o desenvolvimento de aplicações Java corporativas, que enfrentavam problemas com a plataforma J2EE e os EJBs. Ele foi iniciado por Rod Johnson, Juergen Hoeller e Yann Caroff em 2003, baseado no livro de Johnson que criticava as complexidades do J2EE. Ele se tornou um projeto open source popular, que oferece recursos como inversão de controle, injeção de dependência, segurança, persistência, desenvolvimento web e muito mais.
J2EE (Java 2 Platform - Enterprise Edition) é uma plataforma Java, utilizada no desenvolvimento e execução de aplicações servidoras, com suporte ao desenvolvimento de aplicações robustas e escaláveis. Consiste em um conjunto de serviços, interfaces de programação de aplicação (APIs) e protocolos, que oferecem a funcionalidade para o desenvolvimento de aplicações de multicamadas, baseadas na Web.
EJB (Enterprise JavaBeans) é um componente da plataforma J2EE, que roda em um container de um servidor de aplicação. Seu principal objetivo consiste em fornecer um desenvolvimento rápido e simplificado de aplicações Java, com base em componentes distribuídos, transacionais, seguros e portáveis.
Site Oficial: Spring
Na imagem abaixo, vemos os principais Módulos do Ecossistema Spring:
- Spring Framework — módulo principal (Core) do Spring, que fornece suporte básico para injeção de dependência, gerenciamento de transações, aplicativos da web, acesso a dados, mensagens e muito mais.
- Spring Boot — módulo produtivo do Spring que impulsionou o desenvolvimento de microsserviços, além de ajudar na configuração importando e configurando automaticamente todas as dependências.
- Spring Data — módulo que fornece um modelo de programação familiar e consistente para acesso a dados (Banco de dados), enquanto ainda retém as características especiais do armazenamento de dados subjacente.
- Spring Security — módulo usado para adicionarmos autenticação e autorização de acesso a aplicação, ou seja, a segurança.
As principais características do Framework Spring são:
- Simplicidade: o Spring MVC é um módulo que implementa o padrão Model-View-Controller para o desenvolvimento web, usando anotações, validação, conversão, internacionalização e outros recursos;
- Conectividade com bancos de dados: o Spring Data é um módulo que abstrai o acesso a diferentes fontes de dados, como bancos relacionais, NoSQL, REST, etc. Ele também suporta transações, cache, auditoria e consultas dinâmicas;
- Aplicação leve: O Spring permite utilizar apenas aquilo que é necessário para o projeto. Antigamente, o Java utilizava o J2EE, que nos levava a implementar comportamentos que não eram necessários, tornando a aplicação WEB muito pesada;
- Dispensa o uso de um Servidor robusto: Com o Spring Boot, é possível rodar aplicações Java sem necessidade de servidores de aplicação tradicionais, como Tomcat ou JBoss, pois ele já adiciona na aplicação um servidor leve, que roda diretamente na JVM;
- Segurança: o Spring Security é um módulo que fornece mecanismos de autenticação, autorização, proteção contra ataques e integração com outros frameworks de segurança;
- Uso de injeção de dependência: o Spring Core é o módulo central do framework, que gerencia o ciclo de vida dos componentes da aplicação, chamados de beans. Ele permite injetar as dependências entre os beans, reduzindo o acoplamento e aumentando a coesão do código.
O Desenvolvimento de uma WEB API Spring segue o modelo de Camadas, onde cada camada possui uma responsabilidade única. A imagem abaixo ilustra as Camadas Básicas de uma API e Spring e o fluxo de interação entre as camadas:
A primeira parte do sistema que interage com a Requisição HTTP enviada pelo cliente é a Camada de Controle (Controller). Ela define os Endpoints da API, ou seja, os pontos finais das rotas. Nesta Requisição também deve ser informado o Método (GET, POST, PUT ou DELETE). O principal objetivo da Camada Controller é oferecer serviços ao cliente, ou seja, fornecer a resposta, status, entre outros. O controlador faz uso dos serviços fornecidos pela camada de serviço (Service) para atender o cliente.
A camada de Serviço (Service) destina-se a implementar as lógicas de negócio da aplicação. O principal objetivo da camada de serviço é oferecer serviços à camada controladora. Todos os tipos de cálculos com os dados, por exemplo, são executados nesta camada, portanto, a camada de serviço requer dados, que serão oferecidos pela camada Repository/DAO.
DAO significa Data Access Object (Objeto de acesso aos dados), ou seja, é um Objeto responsável por acessar os dados da sus aplicação, que foram persistidos no Banco de dados.
O principal objetivo da camada Repository é acessar (consultar) os dados de forma eficiente no Banco de dados e fornecer serviços para a camada de serviço.
Existem interfaces no Spring Boot, que nos fornecem todas as operações do CRUD (CREATE, RETRIEVE, UPDATE, DELETE). Assim, a camada Repository pode implementar qualquer um deles. A Camada Repository é como se fosse uma "Loja de Consultas", que oferece diversos tipos de consultas para a sua aplicação interagir com o Banco de dados, permitindo consultar, criar, atualizar e deletar dados.
A camada Model (Modelo) representa um objeto do mundo real como um modelo de dados, que será transformado em uma tabela no Banco de dados.
O JPA (Java Persistence API) fornece as referências ou detalhes sobre o modelo de dados, que permite mapear os atributos da classe para as colunas da tabela, usando anotações. O JPA permite que as pessoas desenvolvedoras usem objetos simples e comuns, chamados de Entidades, para persistir, consultar e gerenciar dados, sem precisar escrever consultas SQL
Através do ORM (Object Relational Mapper - Mapeamento Objeto Relacional), que é uma técnica de programação que facilita a comunicação entre bancos de dados relacionais e linguagens de programação orientadas a objetos, se encarrega de realizar operações de persistência — como criação, consulta, atualização e exclusão — diretamente com objetos, sem a necessidade de comandos SQL explícitos. No Spring, o ORM mais utilizado é o Hibernate.



















Voltar