Uma aplicação backend desenvolvida com Spring Boot 3.4.5 e Java 21 para gerenciamento de uma lista de jogos, com autenticação segura via JWT e integração com banco de dados.
- Visão geral
- Arquitetura do Projeto
- Tecnologias Utilizadas
- Como Executar
- Endpoints Principais
- Autenticação e Segurança
- Estrutura de Dados
- Testes
- Boas Práticas Implementadas
- Troubleshooting
- Estrutura do Frontend (Angular)
O DSList é um projeto que demonstra boas práticas de desenvolvimento de APIs REST usando o ecossistema Spring. A aplicação permite:
- ✅ Listar jogos e criar listas de jogos personalizadas
- ✅ Autenticação segura de usuários com Spring Security e JWT
- ✅ Criptografia de senhas com BCrypt
- ✅ Consultas otimizadas com JPA/Hibernate
- ✅ Suporte a múltiplos perfis (test, dev, prod)
- ✅ CORS configurado para conexão com front-ends
dslist/
├── src/
│ ├── main/
│ │ ├── java/com/devsuperior/dslist/
│ │ │ ├── config/ # Configurações (Security, CORS, etc)
│ │ │ ├── controllers/ # Controllers REST (@RestController)
│ │ │ ├── dto/ # Data Transfer Objects (DTOs)
│ │ │ ├── entities/ # Entidades JPA (@Entity)
│ │ │ ├── projections/ # Projeções para queries personalizadas
│ │ │ ├── repositories/ # Interfaces de acesso a dados
│ │ │ ├── services/ # Lógica de negócio
│ │ │ ├── security/ # Configuração de segurança JWT
│ │ │ └── DslistApplication.java # Classe principal
│ │ └── resources/
│ │ ├── application.properties
│ │ ├── application-test.properties
│ │ └── import.sql # Scripts de inicialização do BD
│ └── test/
│ └── java/... # Testes unitários
└── pom.xml # Dependências do Maven
O projeto segue a arquitetura de camadas:
- Controller: Recebe requisições HTTP e retorna respostas
- Service: Contém a lógica de negócio e validações
- Repository: Responsável pela persistência de dados (acesso ao BD)
- Entity: Representa as tabelas do banco de dados
- DTO: Objetos usados para transferir dados entre camadas
| Tecnologia | Versão | Propósito |
|---|---|---|
| Java | 21 | Linguagem principal |
| Spring Boot | 3.4.5 | Framework web e injeção de dependências |
| Spring Data JPA | - | ORM para acesso a dados |
| Spring Security | - | Autenticação e autorização |
| JWT | 0.11.5 | Tokens para autenticação stateless |
| Spring Security Crypto | - | Criptografia BCrypt de senhas |
| Lombok | 1.18.30 | Redução de boilerplate (@Getter, @Setter) |
| PostgreSQL | - | Banco de dados em produção |
| H2 | - | Banco de dados em memória para testes |
| Maven | - | Gerenciador de dependências |
- Java 21 instalado
- Maven instalado (ou use o
mvnwincluído no projeto) - PostgreSQL instalado (opcional, para produção)
cd dslistPara usar PostgreSQL em produção, configure as variáveis de ambiente:
export APP_PROFILE=prod
export DB_HOST=localhost
export DB_NAME=dslist_db
export DB_USER=seu_usuario
export DB_PASSWORD=sua_senhaOu edite o arquivo application.properties:
spring.profiles.active=test # test (H2) ou prod (PostgreSQL)Com Maven:
mvn spring-boot:runOu compile e rode o JAR:
mvn clean package
java -jar target/dslist-0.0.1-SNAPSHOT.jarA API estará disponível em: http://localhost:8080
| Método | Endpoint | Descrição |
|---|---|---|
GET |
/games |
Listar todos os jogos |
GET |
/games/{id} |
Obter detalhes de um jogo |
GET |
/games/list/{listId} |
Listar jogos de uma lista específica |
| Método | Endpoint | Descrição |
|---|---|---|
GET |
/lists |
Listar todas as listas |
GET |
/lists/{id} |
Obter detalhes de uma lista |
| Método | Endpoint | Descrição |
|---|---|---|
POST |
/auth/login |
Fazer login (retorna JWT) |
POST |
/auth/register |
Registrar novo usuário |
A aplicação usa JWT para autenticação stateless:
- Login: O usuário envia credenciais
- Token: O servidor retorna um JWT válido
- Requisições: O cliente envia o token no header
Authorization: Bearer <token> - Validação: O servidor valida o token antes de processar
As senhas são criptografadas com BCrypt antes de serem armazenadas no banco de dados.
A aplicação está configurada para aceitar requisições de:
http://localhost:5173(Vite)http://localhost:3000(React/Node)
Configure outras origens no arquivo application.properties ou na classe SecurityConfig:
cors.origins=http://localhost:5173,http://localhost:3000,http://seu-dominio.com- id: Long (PK)
- title: String
- year: Integer
- genre: String
- platforms: String
- score: Double
- imgUrl: String
- shortDescription: String
- longDescription: String- id: Long (PK)
- name: String- id: GameBelongingPK (FK: game_id, list_id)
- position: Integer- id: Long (PK)
- username: String (UNIQUE)
- password: String (criptografado)
- email: StringExecute os testes com Maven:
mvn testOu teste específico:
mvn test -Dtest=DslistApplicationTests- ✅ Injeção de Dependência: Uso de
@Autowirede construtores - ✅ DTOs: Separação entre modelo de dados (Entity) e dados transferidos
- ✅ Camadas: Separação clara entre controllers, services e repositories
- ✅ Tratamento de Erros: Exceptions customizadas e tratamento global
- ✅ Queries Otimizadas: Uso de
@Querynativa com JPA para joins complexos - ✅ Segurança: Spring Security, JWT e criptografia BCrypt
- ✅ CORS: Configuração para múltiplas origens
- ✅ Perfis de Aplicação: test (H2), dev e prod (PostgreSQL)
Solução: Configure a origem no application.properties:
cors.origins=http://seu-dominio.comSolução: Faça login novamente para obter um novo token.
Se estiver usando Angular, a estrutura esperada é:
dslist-frontend/
├── src/app/
│ ├── components/
│ │ └── game-list/
│ ├── services/
│ │ └── game.service.ts
│ └── app.component.ts
├── environment.ts
└── package.json
Configure a URL da API no environment.ts:
export const environment = {
apiUrl: 'http://localhost:8080'
};Matheus096 - GitHub Profile
Desenvolvido usando Spring 3.4 e Java