API REST para gestão financeira construída com Spring Boot, focada em segurança, consistência transacional e arquitetura em camadas.
O sistema permite:
- autenticação com JWT (access + refresh)
- gestão de usuários e contas
- registro de transações financeiras
- auditoria de ações sensíveis
O projeto foi desenvolvido com foco em clareza arquitetural e decisões técnicas explícitas, não apenas entrega funcional.
A aplicação não funciona corretamente sem configuração adequada das variáveis abaixo.
JWT_SECRET=your-secret-key- Utilizada para assinatura dos tokens JWT
- Deve ser consistente entre ambientes
- Valor inválido quebra autenticação silenciosamente
- Credenciais do banco estão em claro (
application.properties) - Uso exclusivo para desenvolvimento
- Não adequado para produção
Existem dois arquivos:
| Caminho | Função |
|---|---|
/docker-compose.yml |
Apenas PostgreSQL |
/finances-api/docker-compose.yml |
API + Banco (principal) |
cd finances-api
docker compose up --buildCliente
│
▼
Spring Boot API
│
├── Security (JWT + Rate Limit)
├── Controllers
├── Services
├── Audit (AOP)
├── Exception Handling
└── Persistence (JPA + PostgreSQL + Flyway)
Arquitetura em camadas:
Controller → Service → Repository → Domain
-
JWT (access + refresh)
-
BCrypt para hashing de senha
-
Roles:
ROLE_USERROLE_ADMIN
| Tipo | Expiração |
|---|---|
| Access Token | 1 hora |
| Refresh Token | 7 dias |
- Refresh token persistido em banco
- Rotação ativa de refresh token
Aplicado em endpoints críticos:
| Endpoint | Limite |
|---|---|
/auth/login |
5 req/min |
/auth/refresh |
10 req/min |
Implementado via filtro customizado.
POST /auth/register
POST /auth/login
POST /auth/refresh
GET /users
GET /users/{id}
PATCH /users/{id}/deactivate
Regras:
- ADMIN lista usuários
- usuário acessa apenas seus próprios dados
POST /accounts
GET /accounts
GET /accounts/{id}
DELETE /accounts/{id}
POST /accounts/{id}/transactions
GET /accounts/{id}/transactions
Regras:
- valores positivos
- não permite saldo negativo
- transações são imutáveis
GET /accounts?page=0&size=10&sort=createdAt,desc- PostgreSQL
- Spring Data JPA
- Hibernate
- Flyway
baseline-on-migrate=true
clean-disabled=trueEsta seção documenta decisões conscientes do projeto.
accounts.balance
Saldo armazenado diretamente na entidade.
- leitura rápida
- menor custo computacional
- exige controle rigoroso de consistência
- risco de divergência se regras falharem
Uso de:
SELECT ... FOR UPDATE- evitar race conditions em transações financeiras
spring.jpa.hibernate.ddl-auto=update- agilidade no desenvolvimento
- conflita com Flyway como fonte única de schema
- não recomendado em produção
logging.level.org.springframework.security=TRACE- debugging de autenticação
- alto volume de logs
- possível exposição de informações sensíveis
Implementada via AOP com anotação @Audited.
- login
- criação de usuário
- criação de conta
- transações
- ações administrativas
user_id
action
entity
entity_id
timestamp
Padrão adotado:
ProblemDetail(RFC 7807)ValidationErrorResponse
- respostas consistentes
- fácil integração com frontend
- padronização de erros
- logs de aplicação
- logs detalhados de segurança
- ❌ não há correlação de requisições (trace-id)
A documentação anterior sugeria correlação completa — isso foi corrigido para refletir o estado real do projeto.
- unitários → camada service
- integração → endpoints
- JUnit
- Testcontainers (PostgreSQL real)
Disponível em:
/swagger-ui.html
- endpoints
- DTOs
- autenticação Bearer
Itens além do escopo básico:
- Rate limiting por endpoint
- Auditoria via AOP
- Refresh token com rotação
- Lock pessimista em transações
- Paginação consistente
- Tratamento de erro padronizado (RFC 7807)
O projeto segue abordagem:
Monólito modular orientado a domínio
Motivações:
- simplicidade operacional
- menor overhead
- facilidade de manutenção
- Redis para cache
- fila assíncrona (RabbitMQ/Kafka)
- correlation-id (observabilidade completa)
- métricas com Micrometer
- tracing distribuído
- CI/CD pipeline
Este projeto demonstra:
- domínio do ecossistema Spring
- aplicação de segurança real (JWT + rotação)
- controle de concorrência
- clareza arquitetural
- decisões técnicas explícitas