- Índice
- Sobre
- Arquitetura Multicamadas
- Diagrama Organizacional da Entidade User
- Spring x Modelo Tradicional
- Diagrama de Classes
- Tecnologias Utilizadas
- Instalação e Uso
- Como Contribuir
- Contato
- Licença
- Status do Projeto
Este projeto é uma aplicação Web, construída com o framework Spring, projetada especificamente para usar JSP (JavaServer Pages) como mecanismo de visualização. O foco principal da aplicação é fornecer uma plataforma eficiente para o cadastro de usuários.
Desenvolvido em resposta ao Desafio "Cadastro de Usuários" proposto pela 4Seniors, a aplicação gira em torno do modelo de domínio User. Este modelo não apenas representa um usuário dentro do sistema, mas também atua como um núcleo para todas as operações relacionadas ao cadastro, integrando-se perfeitamente com as diferentes camadas da arquitetura da aplicação.
O modelo de domínio User básico, contém as seguintes propriedades:
public class User {
private Long id;
private String name;
private String email;
private String password;
// Constructors, Getters, Setters...
}
A aplicação segue uma Arquitetura Multicamadas, o que proporciona uma separação de responsabilidades e facilita a manutenção, testabilidade e escalabilidade do software.
A camada Entity contém as entidades do domínio da aplicação. São objetos que representam as tabelas do banco de dados e suas relações. Por exemplo, a entidade User
representa um usuário na aplicação.
DTOs são objetos simples usados para transferir dados entre os processos ou através das camadas da aplicação sem precisar usar as entidades diretamente. Eles são úteis para transportar informações, principalmente quando se quer enviar ou receber mais do que um campo, ou quando queremos isolar o que é enviado/recebido.
A camada Repository fornece uma abstração do banco de dados. Ela é responsável por realizar operações de CRUD (Criar, Ler, Atualizar e Deletar) no banco. O Spring Data JPA torna isso muito simples e reduz a necessidade de código boilerplate.
A camada Controller lida com a lógica de apresentação. Ela intercepta as requisições do usuário, processa-as (com a ajuda da camada de serviço) e retorna a resposta adequada, seja ela uma página JSP (nosso caso) ou dados em formato JSON/XML.
A camada Service contém a lógica de negócios da aplicação. Ela se situa entre o Controller e o Repository, assegurando que os dados estejam corretos e que regras de negócio sejam cumpridas antes de chegar ou sair do banco de dados.
+---------------+
| Controller |
+-------+-------+
|
v
+-------+-------+
| DTO |
+-------+-------+
|
v
+-------+-------+
| Service |
+-------+-------+
|
v
+-------+-------+
| Repository |
+-------+-------+
|
v
+-------+-------+
| Entity |
+-------+-------+
|
v
Database
Organização em formato de árvore:
App
|
|-- controllers
| |
| `-- UserController
|
|-- services
| |
| |-- UserService (Interface)
| `-- UserServiceImpl (Implementação da interface UserService)
|
|-- repositories
| |
| `-- UserRepository
|
|-- dtos
| |
| `-- UserDTO
|
|-- entities
| |
| `-- User
|
`-- config
|
`-- WebConfig
Esta representação exibe a organização dos componentes da aplicação:
-
controllers: Responsável por gerenciar as requisições HTTP, atua como um mediador entre a camada de serviço e a camada de visualização JSP.
-
services: Define a lógica de negócio. Tem duas partes: a interface
UserService
e sua implementaçãoUserServiceImpl
. -
repositories: Interage com o banco de dados. Usa o padrão de design
Repository
para abstrair o acesso ao banco de dados. -
dtos: Usado para transferir dados entre as camadas de aplicação.
-
entities: Representa as entidades do banco de dados e é usada para definir a tabela e suas relações no banco de dados.
-
WebConfig:
A classe WebConfig
é fundamental para definir as configurações personalizadas para a camada web da aplicação. Ela é anotada com @Configuration
, indicando que essa classe contém definições de beans do Spring que são registrados no contêiner Spring na inicialização.
A importância desse componente é que ele define a maneira como as visualizações (views/jsp) são resolvidas e localizadas dentro da aplicação. Ao fornecer uma implementação personalizada do ViewResolver
, você está essencialmente instruindo o Spring sobre onde encontrar as visualizações e como resolvê-las.
O método viewResolver()
é anotado com @Bean
, indicando que ele cria um bean que pode ser gerenciado pelo contêiner Spring. A implementação específica usada aqui, InternalResourceViewResolver
, é configurada para resolver as visualizações JSP localizadas no diretório /WEB-INF/jsp/
. Isso significa que, quando um controlador retornar o nome de uma view, por exemplo "index", o Spring procurará por um arquivo /WEB-INF/jsp/index.jsp
.
Foi utilizado essa abordagem e a classe WebConfig
por várias razões:
-
Separar as configurações do código: É sempre uma boa prática manter as configurações separadas da lógica do negócio. Assim, se precisarmos mudar a localização ou a maneira como as visualizações são resolvidas, não precisamos tocar na lógica do negócio.
-
Facilidade de Manutenção: Em projetos maiores podemos ter várias configurações personalizadas. Agrupá-los em classes de configuração dedicadas torna o projeto mais organizado.
-
Flexibilidade: Usando o
InternalResourceViewResolver
, você tem flexibilidade para definir o prefixo e o sufixo das visualizações, o que é útil quando você tem uma estrutura de diretório específica ou padrões de nomenclatura de arquivo. -
Integração com o Spring: Como o Spring controla o ciclo de vida dos beans, você pode injetar dependências, aplicar aspectos e fazer outras operações relacionadas ao Spring em beans definidos em classes de configuração.
Resumindo, a classe WebConfig
é um componente essencial que ajuda a organizar e personalizar as configurações da camada web da aplicação, garantindo que o Spring saiba como tratar e resolver as visualizações conforme necessário.
Usar uma estrutura como esta é vantajoso por várias razões, incluindo separação de responsabilidades, modularidade, além de facilitar a manutenção e escalabilidade do código.
Optar pelo Spring Framework
, particularmente pelo Spring Boot
, é devido a sua capacidade de simplificar o desenvolvimento de aplicações web modernas. Aqui estão algumas razões:
-
Configuração Zero: O Spring Boot elimina a necessidade de um
web.xml
ao usar configuração baseada em Java. Isto reduz erros de configuração e melhora a clareza. -
Rápido e Flexível: O Spring Boot permite criar aplicações standalone com servidores embutidos, o que facilita os processos de teste e implantação.
-
Injeção de Dependências: O Spring Framework é famoso por sua inversão de controle e injeção de dependências, o que torna a aplicação modular e fácil de testar.
-
Integração com JPA: O Spring Data JPA facilita as operações do banco de dados, eliminando muito do código boilerplate associado ao acesso a dados.
-
Segurança: O Spring Security fornece autenticação e autorização robustas out-of-the-box
(OBS: aqui não foi utilizado)
. -
Extensível: A vasta gama de projetos no ecossistema Spring significa que é altamente extensível e pode ser adaptado para muitos cenários diferentes.
Em resumo, ao optar pelo Spring, estamos aproveitando uma solução moderna e robusta que acelera o desenvolvimento enquanto mantém uma alta qualidade no código.
- Para entender a estrutura básica do projeto, consulte o diagrama de classes abaixo. O diagrama de classes fornece uma representação visual das classes envolvidas e suas interações, facilitando a compreensão do design do projeto.
Antes de iniciar, assegure-se de ter o ambiente Java corretamente configurado em sua máquina. Abaixo você tem a relação das tecnologias que foram utilizadas no processo de desenvolvimento do projeto.
Tecnologia | Versão | Logo / Link |
---|---|---|
Sistema Operacional | Windows 11 | |
Linguagem de Programação (JDK) | Java 17 LTS (Azul Zulu) | |
Framework | Spring Boot 3.1.2 | |
Banco de Dados | H2 Database | |
IDE | IntelliJ IDEA 2023.2 (Community Edition) |
Clone o repositório do Github:
git clone git@github.com:solucaoerp/4sr.git
Abra o projeto users
através de sua IDE, baixe as dependências e execute o projeto.
Para acessar o formulário de cadastro de usuário, use a rota principal da aplicação: http://localhost:8090
Para acessar o console H2 Database, digite o endereço http://localhost:8090/h2-console
em seu navegador de internet.
- Através da imagem abaixo você encontra as credenciais de acesso. Essas informações também podem ser encontradas no perfil de
test
no diretórioresources
.
- Este projeto é configurado para ser executado em diferentes perfis, proporcionando flexibilidade e adaptabilidade para diferentes ambientes de desenvolvimento. Para fins de demonstração, foi utilizado o perfil 'test', especificamente configurado para utilizar o banco de dados em memória H2. Isso permite a criação de um ambiente de teste ágil, facilitando a validação das funcionalidades do aplicativo sem a necessidade de configuração adicional.
O perfil ativo é definido no arquivo application.properties
:
spring.profiles.active=test
As configurações específicas para o perfil 'test' são definidas no arquivo application-test.properties
.
Com essas configurações você poderá realizar testes rapidamente e ver as consultas SQL's geradas, facilitando a identificação de possíveis problemas de desempenho ou comportamento inesperado.
Contribuições são sempre bem-vindas! Se você tem uma sugestão que poderia melhorar este projeto, por favor, abra uma issue ou um pull request, seguindo os passos abaixo.
- Crie um 'Fork' do projeto
- Crie uma 'Branch' para sua modificação (
git checkout -b feature/AmazingFeature
) - Faça o 'Commit' das suas mudanças (
git commit -m 'Add some AmazingFeature'
) - 'Push' para a 'Branch' (
git push origin feature/AmazingFeature
) - Abra uma 'Pull Request'
Se você tiver alguma dúvida, comentário ou sugestão, fique à vontade para abrir uma issue
aqui no GitHub ou me contate diretamente através do e-mail: solucao.erp@gmail.com
Este projeto está licenciado sob os termos da Licença MIT. A Licença MIT é uma licença de software livre e de código aberto que permite o uso, a cópia, a modificação e a distribuição do código-fonte. Esta licença é notória por sua simplicidade e flexibilidade, incentivando a colaboração e a inovação no software de código aberto.
Este README será atualizado conforme o projeto evolui. Fique ligado para novas funcionalidades e melhorias!