Desenvolvimento de Software Através de Frameworks

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 75

Desenvolvimento de Software

através de Frameworks
Engenharia DevOps

Adriano Neres
Ementa

• Fundamentos de Frameworks
• Frameworks Backend e Frontend
• Frameworks de suporte ao desenvolvimento de aplicações Web
• Frameworks de suporte ao desenvolvimento de APIs de serviço
• Frameworks de suporte à persistência de dados
Sobre o professor
Adriano Neres

• Graduado em Desenvolvimento de Sistemas para Internet.


• Pós-graduado em Engenharia de Software.
• Mais de 12 anos de experiência em desenvolvimento e consultoria em
desenvolvimento de software.
Projeto
Biblioteca IFMT

https://github.com/adrianoneres/biblioteca-ifmt
Frameworks

"Um framework é uma estrutura que serve de base para a construção de


aplicações web de nalidade especí ca cujo desenvolvimento pode ser muito
custoso e/ou problemático.” - Daniel Kriger
fi
fi
Bibliotecas e Frameworks
no desenvolvimento de software

“Biblioteca é a implementação de uma função em particular.” - Sandip Roy

“Framework é um conjunto de bibliotecas que implementam uma metodologia.”


- Sandip Roy
Bibliotecas e frameworks
Exemplos de frameworks
Desenvolvimento sem framework

• Obriga o desenvolvimento da
solução completa, sem
implementações base que auxiliem
no processo.

• Tende a ser mais custosa, tanto em


tempo quanto em esforço.

• Pode ser interessante para soluções


simples ou muito especí cas, onde
as vantagens do framework não
sejam aplicáveis.
fi
Desenvolvimento com framework

• Traz um conjunto de soluções prontas


para problemas comuns, que auxiliam no
processo de desenvolvimento.

• Tende a ser a abordagem mais produtiva


em grande parte dos casos.

• É ideal que se conheça os conceitos e


padrões que embasam cada
implementação.

• Pode ser opinado, trazendo um conjunto


de regras que devem ser seguidas para
garantir seu funcionamento.
Exemplo de consulta
JDBC x Spring Data
Frontend

• É a camada responsável pela apresentação do software, e por ser a interface


pela qual o usuário irá interagir com a aplicação.

• Em ambiente web é implementado com uso das tecnologias base: HTML,


CSS e JavaScript.

• Existem frameworks e ferramentas voltadas especi camente para o frontend,


que compilam (ou transpilam) o resultado para as tecnologias base.

fi
Backend

• Representa a camada responsável por executar as regras de negócio,


integrar com outras aplicações externas e fazer a comunicação com os
bancos de dados.

• Pode ser implementado com o uso de ferramentas como Java, C#, Python,
Ruby, Node.js, etc.

• Em arquiteturas cliente servidor, pode ser executado de forma totalmente


separada de outras camadas, disponibilizando uma interface para
comunicação.
API
Application Programming Interface

• Signi ca Application Programming Interface (Interface de Programação de


Aplicação).

• Sua arquitetura geralmente é composta por cliente e servidor, sendo a


aplicação que envia a requisição chamada de cliente, e a aplicação que
responde chamada de servidor.

• Existem várias implementações diferentes, como por exemplo SOAP, RPC,


WebSocket e REST, sendo esta última bastante popular no mercado atual
fi
Arquitetura

A Seven-Step Guide to API-First Integration, infoq. 2023.


O protocolo HTTP
HyperText Transfer Protocol

• Signi ca HyperText Transfer Protocol.


• É stateless por padrão. Uma nova conexão é feita a cada solicitação.
• As requisições e respostas podem conter cabeçalhos que identi cam, entre
outras coisas, o tipo da resposta.

• As requisições podem conter diferentes tipos de parâmetro que podem ser


utilizados pelas APIs.
fi
fi
Métodos HTTP

• GET: utilizado para requisições do tipo leitura, com o intuito de recuperar um


recurso ou uma lista de recursos.

• POST: cria um novo recurso baseado no payload enviado no corpo da


requisição.

• PUT: atualiza um recurso, baseado no payload enviado no corpo da


requisição.

• DELETE: remove um recurso, baseado no identi cador fornecido.

fi
REST
Representational State Transfer

• Signi ca Representational State Transfer, e é um modelo de arquitetura que


fornece um conjunto de regras para que aplicações web distribuídas se
comuniquem entre si.

• Utiliza um protocolo cliente servidor sem estado, onde cada mensagem


HTTP contém toda a informação necessária para atender ao pedido.

• Cada recurso é unicamente identi cado por uma sintaxe universal.


fi
fi
JSON
JavaScript Object Notation

• Signi ca JavaScript Object Notation e é uma formatação leve de troca de


dados.

• É construído em duas estruturas: uma coleção de pares nome/valor ou uma


lista ordenada de valores.

• É suportada de alguma forma por todas as linguagens de programação


modernas.
fi
JSON
JavaScript Object Notation
O que é “REST"?

REST APIs Explained, mannhowie. 2023.


Spring Boot
Modules
Configuração do ambiente (Backend)

• Java
• Editor de código ou IDE de sua preferência (Visual Studio Code, Intellij IDEA, etc.)
• Rest Client (Insomnia, Postman, etc.)
• Navegador (Chrome, Edge, Firefox, etc.)
• Extensões do Visual Studio Code: Extension Pack for Java, Gradle for Java, Maven
for Java, Java Code Generators, Spring Boot Dashboard, Spring Boot Extension
Pack.
Conceitos fundamentais

• Tipos de variáveis
• Métodos
• Encapsulamento
• Programação Orientada a Objetos
• Método construtor
• Sobrecarga
• Herança (de classe e de interface)
• Sobrescrita
• Polimor smo
fi
Tipos de variáveis
Primitivos

• byte: 1 byte (-128 a 127)


• short: 2 bytes (-32768 a 32767)
• int: 4 bytes (2.147.483.648 a 2.147.483.647)
• long: 8 bytes (-9.223.372.036.854.775.808 a 9.223.372.036.854.775.807)
• oat: 4 bytes, 7 dígitos decimais

• double: 8 bytes, 16 dígitos decimais


• boolean: true ou false (1 bit)
• char: 1 character (2 bytes)
fl
Declaração de variáveis

nome

int contador = 100;


tipo valor
Valores padrões
Tipos primitivos

• byte: 0
• short: 0
• int: 0
• long: 0L
• oat: 0.0f

• double: 0.0d
• boolean: false
• char: ‘\u0000’
fl
Métodos

tipo de retorno nome parâmetros

int somar(int numero1, int numero2) {


return numero1 + numero2;
} retorno
Encapsulamento
Orientação a objetos
Conceito

"A Programação Orientada a Objetos (OOP) é um paradigma de programação em


ciência da computação que se baseia no conceito de classes e objetos. Ele é usado
para estruturar um programa de software em partes simples e reutilizáveis de
projetos de código (geralmente chamados de classes), que são usados para criar
instâncias individuais de objetos.” - Doherty, Erin.

​​
​​
​​
Orientação a objetos
Orientação a objetos
objetos

🚗
🚕
classe
🚙
🚒
Orientação a objetos
objetos

🎂
🥮
📝 🥧
classe
🧁
Método construtor
Classes

1. Deve ser público

2. Não possui tipo de retorno

3. Deve ter o mesmo nome da classe

public Carro(int id, String marca, String modelo) {


// implementação do construtor
}
Sobrecarga
Orientação a objetos
Orientação a objetos
Herança
Sobrescrita
Polimorfismo
Camadas do Backend
Principais componentes do SpringBoot

• Controller: responsável por responder às requisições


do usuário.

• Service: responsável pela manutenção das regras de


negócio.

• Repository: responsável pela persistência de dados.


Camadas do Backend
O que é “REST"?

REST APIs Explained, mannhowie. 2023.


Códigos de status HTTP

• 100 - 199: Respostas informativas

• 200 - 299: Respostas de sucesso

• 300 - 399: Respostas de redirecionamento

• 400 - 499: Respostas de erro do cliente

• 500 - 599: Respostas de erro do servidor

• Referência: https://www.httpstatus.com.br/
Validações de entrada
Corpo da requisição

• É comum haver a necessidade de validar os dados de entrada da requisição,


principalmente em relação ao corpo da requisição, que geralmente representa os
dados entrada em um cadastro ou edição.

• Podemos utilizar as anotações do pacote jakarta.validation para auxiliar neste


processo, atribuindo a anotação @Valid ao objeto de entrada e as validações
correspondentes aos atributos deste objeto.
Exceções

• Durante o desenvolvimento, é comum se haver situações não esperadas, seja por


não atender aos requisitos de alguma biblioteca ou tecnologia, ou até mesmo por
não atender à requisitos especí cos da regra de negócio.

• Nestas situações é comum que precisemos lidar com Exceções.


• Na prática, exceções podem ser entendidas como um evento não esperado, que
ocorre durante a execução do programa.
fi
Exceções
Exemplos

• Entrada inválida do usuário


• Perda de conexão com banco de dados
• Erros de código
• Acesso à um recurso não disponível (registro indisponível no banco de dados)
Erros

• Erros representam falhas não recuperáveis.


• Alguns exemplos comuns são memória insu ciente (memory leak), uso de recursos
ou bibliotecas incompatíveis, recursões in nitas.

• Erros estão fora de nosso controle e, por isso, não podemos tratá-los.

fi
fi
Erros x Exceções

• Erros representam falhas não recuperáveis, problemas graves que não podemos
tratar.

• Exceções representam condições não esperadas que podemos tratar.


Erros e Exceções
Hierarquia

• geeksforgeeks, 2023.
Tipos de Exceções
Tipos

• geeksforgeeks, 2023.
Tratamento de exceções específicas
Argumentos inválidos

• Em muitos casos precisamos lidar com Exceções especí cas de bibliotecas que
adicionamos ao nosso projeto. Um exemplo são as validações de argumentos, que
lançam uma exceção do tipo MethodArgumentNotValidException.

• Nestes casos é necessário se atentar para a estrutura do objeto construído pela


biblioteca e trabalhar a forma adequada à nossa aplicação.

fi
Internacionalização

• É uma estratégia utilizada para permitir o tratamento de mensagens em diferentes


idiomas pela aplicação.

• Outra vantagem é a centralização das mensagens em um ponto central, facilitando


a manutenção.

• Muitos Frameworks facilitam a implementação da internacionalização, tanto no


Backend quanto no Frontend. O SpringBoot, por sua vez, possui componentes
para esta nalidade.

• O cabeçalho Accept-Language é parte importante desta solução.


fi
Repositórios

• É a camada responsável pela manutenção da


persistência de dados.

• A especi cação JPA (Java Persistence API), é uma


implementação leve para persistência de dados. O
Spring Data JPA é o módulo da stack Spring que
implementa esta especi cação.

• O Spring Data permite a comunicação com o banco de


dados tanto pela assinatura de métodos baseada em
convenção (query methods) quanto por querys
baseadas em JPQL (Java Persistence Query Language).
fi
fi
Design patterns

• São soluções típicas de problemas comuns em projetos de software.


• É um conceito geral que propõe diretrizes para a solução de um problema
especí co.

• Não é um algoritmo, mas uma descrição em alto nível de uma solução.


fi
Anatomia da URL

• geeksforgeeks, 2023.
Segurança

• Uma necessidade comum no desenvolvimento de software é a segurança, mais


especi camente em relação à autenticação e à autorização.

• Quando trabalhamos com APIs REST, no entanto, devido à natureza da arquitetura,


o tratamento da autenticação tende a ser diferente da abordagem que conhecemos
por autenticação por sessão e geralmente utiliza a autenticação por token.

• Como esta arquitetura utiliza o protocolo HTTP, que por padrão é stateless, toda
requisição deve conter toda a informação necessária. Por isso, é comum utilizar a
estratégia de geração e manutenção de tokens.
fi
Segurança
Autenticação por sessão

• Alura, 2023.
Segurança
Autenticação por sessão

• O estado da sessão é mantido pelo servidor (stateful).


• O número de sessões está limitado à capacidade do servidor, podendo até causar
um overload em casos extremos.

• Necessita de uma estratégia especí ca caso haja a necessidade de escalar os


servidores de forma horizontal. Um exemplo de estratégia para isso é o Sticky
Session.
fi
Segurança
Autenticação por token

• Alura, 2023.
Segurança
Autenticação por token

• Os dados da “sessão" são mantidos internamente no token, que será enviado pelo
cliente à cada requisição.

• Uma vez gerado, o token é devolvido ao cliente, que deverá mantê-lo. Nenhuma
informação do token é armazenada no servidor e sua validação posterior é feita
com base em sua assinatura.

• É possível escalar os servidores com pouco ou nenhum esforço relacionado à


autenticação, já que diferentes instâncias da API poderão responder à requisições
que tenham ou não sido geradas por eles, desde que o token contenha uma
assinatura válida.
JWT
JSON Web Token

• É um padrão aberto utilizado para compartilhar informações entre duas partes.


• Em APIs REST é comum utilizar este padrão para de nição dos tokens utilizados
pela aplicação.

• Um token de autenticação geralmente é conhecido como access token, mas


podem haver outros, a depender da necessidade da aplicação. Um caso de uso
bastante comum é a necessidade de “refrescar a sessão”, que pode ser realizado
por meio do uso de um refresh token.

fi
JWT
JSON Web Token

O token JWT possui a seguinte estrutura:

cabeçalho.payload.assinatura

• O cabeçalho é composto por duas partes: o tipo de algoritmo utilizado e o tipo de token,
que no nosso caso será JWT.

• O payload contém os atributos de nidos pelo usuário no momento de sua criação (claims),
além de alguns dados como o criador (issuer), data de expiração (expiration time), etc.

• A assinatura é o hash do header e do payload. Graças à esta parte conseguimos garantir a


integridade do token.
fi
JWT
JSON Web Token

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFt
ZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.S KxwRJSMeKKF2QT4fwpM
eJf36POk6yJV_adQssw5c

fl
Autenticação com SpringBoot

• O Spring Boot possui um módulo especí co para a manutenção da autenticação e


da autorização. Este módulo é o Spring Boot Starter Security.

• Esta estratégia diminui bastante o esforço de implementação de toda a camada de


autenticação, no entanto, precisamos “ensinar" o Spring Boot a efetuar as
validações atendendo à lógica e necessidades de nosso projeto.

• Esta implementação consiste basicamente em atender uma série de “contratos" e


requisitos impostos pela implementação da camada de segurança do Spring Boot.
fi
Autenticação com SpringBoot
Passo-a-passo

• Adicionar bibliotecas
• Con gurar o projeto
• De nir a entidade referente aos usuários e criar seu repositório
• Criar um serviço que mantenha a lógica de autenticação
• Criar um controller para receber as chamadas referentes à segurança
• Criar um serviço que mantenha a lógica do Token JWT
fi
fi
Autenticação com SpringBoot
Instalação das bibliotecas

• Para esta implementação, precisaremos adicionar duas bibliotecas ao projeto:


• Spring Boot Starter Security

• Java JWT
Autenticação com SpringBoot
Con gurações do projeto

• Habilite a segurança no projeto adicionando a anotação @EnableWebSecurity à


classe principal do projeto.

• Crie uma classe de con gurações que “ensine" o Spring Boot qual o codi cador
de senhas e qual o gerenciador de autenticação ele utilizará.

• Ainda nesta classe de con gurações, con gure um ltro de requisições e de na a


lógica de autenticação dos endpoints.
fi
fi
fi
fi
fi
fi
fi
Autenticação com SpringBoot
Con guração do Usuário

• Crie uma entidade que represente o usuário


• A entidade deve implementar a interface UserDetails. Com isso, devemos
“ensinar” ao Spring Boot como obter os atributos de um usuário necessários para
a autenticação.

• Crie um repositório para esta entidade e implemente um método para buscar o


usuário pelo login.
fi
Autenticação com SpringBoot
Serviço de autenticação

• Crie um serviço responsável pela autenticação e anote com @Service

• Neste serviço Implemente a interface UserDetailsService e crie o método


correspondente para atender ao contrato.

• É interessante notar que este método não será utilizado explicitamente pela nossa
implementação, mas o Spring Boot irá utilizá-lo internamente para obter o usuário
pelo login quando necessário.
Autenticação com SpringBoot
Controller de segurança

• Crie um Controller, responsável por manter os endpoints de segurança.


• Na implementação do endpoint de login, utilize o
UsernamePasswordAuthenticationToken para delegar a implementação de
segurança para o Spring Boot. Utilize a instância deste objeto para criar o objeto
Authentication.

• A instância de Authentication contém os dados especí cos do usuário, que


poderão ser usados para a criaçãod o Token JWT.

fi
Autenticação com SpringBoot
Serviço de criação do Token

• Crie um serviço responsável pela manutenção do Token JWT.


• Crie um método que receba os dados do usuário e gere o Token com base nestes
dados.
Autenticação com SpringBoot
Resolvendo a autenticação com Token JWT

• Quando con guramos o Spring Boot Security de nimos que todas as requisições para /seguranca
seriam permitidos sem autenticação, já requisições à quaisquer outros contextos exigiriam
autenticação.

• Para que a API possa validar a autenticação do usuário precisaremos enviar o token em cada
requisição.

• No cliente, precisaremos garantir esta informação seja sempre enviada. É bastante comum que o token
seja enviado no cabeçalho Authorization das requisições, geralmente precedido da palavra Bearer.

• Na servidor, precisaremos criar um ltro que valide o token, crie o objeto de autenticação e repasse ao
Spring Boot. Desta forma, quando o Spring checar se a requisição foi autenticada ele terá todos os
dados necessários para esta validação.
fi
fi
fi
Cliente
req

resp
API

Filtro de Autenticação

Spring Boot Security Filter

Controller
Autenticação com SpringBoot

Service

Repository
BD
Autenticação com SpringBoot
Interceptando exceções lançadas por ltros

• Quando criamos o ResourceExceptionHandler notamos que ele é capaz de


interceptar qualquer exceção que seja lançada pelos controllers ou por qualquer
camada abaixo da camada de controle.

• No entanto, se observarmos a disposição das camadas perceberemos que nosso ltro


de autenticação está no topo da pilha de componentes. Isso signi ca que as exceções
lançadas por este ltro não serão interceptadas pelo ResourceExceptionHandler.

• Para aproveitar a mesma implementação que zemos para o


ResourceExceptionHandler, precisaremos capturar as exceções e delegá-las para o
handler explicitamente dentro do ltro.
fi
fi
fi
fi
fi
fi

Você também pode gostar