📊 Relatório Comparativo Completo: Java (Spring Boot) ➔ Python (FastAPI)
Este relatório consolida a análise técnica e o mapeamento De / Para completo entre as implementações em Java (Spring Boot) e Python (FastAPI + SQLAlchemy 2.0) dos 3 projetos da trilha full-stack:
- Controle de Gastos 01 (Interatividade com HTMX)
- Lista de Tarefas 01 (API REST desacoplada em 4 camadas)
- Biblioteca de Jogos 01 (Interface Web com Bootstrap 5 e formulários)
1. 🌐 Matriz Global da Stack: De / Para
| Componente Arquitetural |
Stack Java (Original) |
Stack Python (Equivalente Moderno) |
Racional Técnico da Equivalência |
| Linguagem & Runtime |
Java 21 (LTS) |
Python 3.11+ |
Ambas com tipagem estática moderna e alto desempenho. |
| Framework Web Principal |
Spring Boot 3.x (Spring MVC) |
FastAPI + Uvicorn |
FastAPI é o padrão moderno para APIs assíncronas e renderização server-side em Python. |
| ORM / Persistência |
Hibernate / Spring Data JPA |
SQLAlchemy 2.0 |
Uso de Mapped[...] e mapped_column() equivale diretamente às anotações @Entity, @Id, @Column. |
| Injeção de Dependências |
@Autowired / Spring IoC |
FastAPI Depends() |
Injeção explícita por escopo de requisição com gerenciamento de ciclo de vida (yield). |
| DTOs & Validação |
Bean Validation (@Valid, Lombok) |
Pydantic v2 (BaseModel, Field) |
Validação estrita de tipos, serialização JSON automática e conversão de atributos. |
| Template Engine |
Thymeleaf (th:*) |
Jinja2 ({% ... %}) |
Motores de renderização server-side com suporte a includes e herança de templates. |
| Banco Local (Dev) |
H2 Database (em memória) |
SQLite (sqlite:///./app.db) |
Banco embarcado sem necessidade de serviço externo rodando. |
| Banco Produção (Prod) |
PostgreSQL (Neon Cloud) |
PostgreSQL (Neon Cloud) via psycopg |
Driver PostgreSQL nativo de alta performance v3. |
| Configuração de Ambiente |
Spring Profiles (application-prod.properties) |
pydantic-settings (.env) |
Leitura tipada de variáveis de ambiente com fallback para desenvolvimento local. |
| Documentação da API |
SpringDoc OpenAPI / Swagger UI |
Swagger UI / ReDoc Nativos (/docs) |
Geração automática e interativa a partir dos tipos do Pydantic e FastAPI. |
| Testes Automatizados |
JUnit 5 + Spring Boot Test |
pytest + httpx (TestClient) |
Execução rápida de testes de integração com banco isolado em memória (StaticPool). |
| Containerização |
Eclipse Temurin 21 JDK/JRE |
python:3.11-slim |
Imagens Docker leves e otimizadas para deploy em nuvem (Render/Railway). |
2. 🔍 Análise Comparativa Detalhada por Projeto
Projeto 1: Controle de Gastos 01 (HTMX + Single Page Experience)
- Foco Didático: Renderização reativa de fragmentos HTML sem frameworks JavaScript pesados (React/Angular).
- Nível Simulado: Estagiário / Júnior.
flowchart LR
subgraph Java_Flow ["☕ Versão Java"]
J_Browser["Navegador (HTMX)"] -->|POST / DELETE| J_Controller["LancamentoController"]
J_Controller -->|Spring Data| J_Repo["LancamentoRepository"]
J_Controller -->|Fragmento| J_Thyme["index.html :: lista-lancamentos"]
end
subgraph Python_Flow ["🐍 Versão Python"]
P_Browser["Navegador (HTMX / Swagger)"] -->|POST / DELETE| P_Routes["routes.py"]
P_Routes -->|SQLAlchemy Session| P_DB["database.py (get_db)"]
P_Routes -->|Fragmento| P_Jinja["partials/lista_lancamentos.html"]
end
De / Para de Implementação:
| Recurso |
Versão Java (Spring Boot) |
Versão Python (FastAPI) |
| Modelo de Dados |
@Entity public class Lancamento com BigDecimal e enum TipoLancamento |
class Lancamento(Base) com Numeric(10, 2) e SQLEnum(TipoLancamento) |
| Acesso a Dados |
Interface LancamentoRepository extends JpaRepository<Lancamento, Long> |
Sessão SQLAlchemy injetada via db: Session = Depends(get_db) |
| Fragmento HTMX |
th:fragment="lista-lancamentos" retornado como "index :: lista-lancamentos" |
Arquivo separado partials/lista_lancamentos.html incluído via Jinja2 |
| Exclusão no Frontend |
th:hx-delete="@{/lancamentos/{id}(id=${lancamento.id})}" |
hx-delete="/lancamentos/{ { lancamento.id } }" |
| Swap HTMX |
hx-target="#lista-lancamentos" + hx-swap="outerHTML" |
hx-target="#lista-lancamentos" + hx-swap="outerHTML" |
| API REST JSON |
Não inclusa na v1 Java |
Inclusa com /api/lancamentos e documentada no Swagger UI |
| Testes Automatizados |
Verificação manual via checkpoint |
pytest com 4 cenários (listagem, cadastro HTMX, exclusão e API REST) |
Projeto 2: Lista de Tarefas 01 (API REST em Camadas Desacoplada)
- Foco Didático: Arquitetura limpa em camadas (Separation of Concerns), expondo endpoints RESTful com CORS aberto para múltiplos frontends (Web, Mobile, Desktop).
- Nível Simulado: Estagiário / Júnior.
flowchart TD
subgraph Java_Architecture ["☕ Java 4-Layers"]
JC["TarefaController (@RestController)"] --> JS["TarefaService (@Service)"]
JS --> JR["TarefaRepository (JpaRepository)"]
JR --> JM["Tarefa (@Entity)"]
end
subgraph Python_Architecture ["🐍 Python 4-Layers"]
PR["tarefas.py (APIRouter)"] --> PS["TarefaService"]
PS --> PRepo["TarefaRepository"]
PRepo --> PM["Tarefa (SQLAlchemy Model)"]
end
De / Para de Implementação:
| Camada / Recurso |
Versão Java (Spring Boot) |
Versão Python (FastAPI) |
| 1. Apresentação (Router) |
TarefaController.java (@RestController, @RequestMapping("/api/tarefas")) |
app/routers/tarefas.py (APIRouter(prefix="/api/tarefas")) |
| 2. Regras de Negócio (Service) |
TarefaService.java (@Service) com métodos listarTodas, criar, atualizar, deletar |
app/services/tarefa_service.py (TarefaService) com tratamento de HTTPException(404) |
| 3. Acesso a Dados (Repository) |
TarefaRepository.java (Interface JpaRepository<Tarefa, Long>) |
app/repositories/tarefa_repository.py (TarefaRepository) encapsulando Session |
| 4. Entidade & DTOs |
Tarefa.java com Lombok (@Data, @Entity) |
app/models/tarefa.py (Model) + app/schemas/tarefa.py (DTOs Pydantic) |
| CORS |
@CrossOrigin(origins = "*") na classe do Controller |
CORSMiddleware global no main.py com origens configuráveis |
| Documentação da API |
Dependência externa SpringDoc necessária |
Nativa: Swagger UI (/docs), ReDoc (/redoc) e OpenAPI 3.1 |
| Respostas HTTP |
200 OK, 204 NoContent com ResponseEntity |
Tipadas com status_code=status.HTTP_201_CREATED, 204_NO_CONTENT |
Projeto 3: Biblioteca de Jogos 01 (Interface Web Bootstrap 5)
- Foco Didático: Aplicação web tradicional com renderização de formulários, controle de coleção e redirecionamentos HTTP (
PRG: Post-Redirect-Get).
- Nível Simulado: Estagiário.
flowchart LR
subgraph Java_Web ["☕ Java (Thymeleaf)"]
JForm["Formulário HTML"] -->|POST /jogos/{id}/concluir| JCtrl["JogoController"]
JCtrl -->|"save()"| JRep["JogoRepository"]
JCtrl -->|Redirect| JRedir["redirect:/"]
end
subgraph Python_Web ["🐍 Python (Jinja2 + FastAPI)"]
PForm["Formulário HTML"] -->|POST /jogos/{id}/concluir| PRoutes["routes.py"]
PRoutes -->|"commit()"| PDB["Session (database.py)"]
PRoutes -->|Redirect 303| PRedir["RedirectResponse(url='/', status=303)"]
end
De / Para de Implementação:
| Recurso |
Versão Java (Spring Boot) |
Versão Python (FastAPI) |
| Arquitetura Simplificada |
Controller interagindo diretamente com o Repositório (sem Service) |
routes.py interagindo diretamente com a Sessão SQLAlchemy (sem Service) |
| Template Frontend |
jogos.html com Thymeleaf (th:action, th:field, th:if, th:unless) |
jogos.html com Jinja2 (action, name, {% if %}, {% else %}) + Bootstrap 5 |
| Redirecionamento Pós-POST |
return "redirect:/"; (Spring MVC) |
return RedirectResponse(url="/", status_code=303) (FastAPI) |
| Ações de Registro |
POST /jogos/{id}/concluir e POST /jogos/{id}/apagar |
POST /jogos/{id}/concluir e POST /jogos/{id}/apagar |
| API REST Adicional |
Não inclusa na v1 |
Inclusa: GET, POST, PUT, PATCH, DELETE em /api/jogos |
| Documentação Interativa |
Não configurada na v1 |
Botão no cabeçalho apontando para o Swagger UI (/docs) |
3. 📂 Mapeamento Estrutural De / Para de Arquivos
3.1. Controle de Gastos
JAVA (javaweb_gastos_01_htmx) PYTHON (controledegastos_python_01)
------------------------------------------------- -------------------------------------------------
controle-de-gastos/pom.xml controledegastos_python_01/requirements.txt
controle-de-gastos/Dockerfile controledegastos_python_01/Dockerfile
src/main/resources/application.properties controledegastos_python_01/app/config.py + .env
src/main/resources/application-prod.properties controledegastos_python_01/app/config.py (Neon URL)
.../model/Lancamento.java .../app/models.py (Lancamento)
.../model/TipoLancamento.java .../app/models.py (TipoLancamento Enum)
.../app/schemas.py (Pydantic DTOs)
.../repository/LancamentoRepository.java .../app/database.py (Session SQLAlchemy / get_db)
.../controller/LancamentoController.java .../app/routes.py (FastAPI Router)
.../ControleDeGastosApplication.java .../app/main.py (FastAPI App & Lifespan)
src/main/resources/templates/index.html .../app/templates/index.html
(fragmento dentro do index.html) .../app/templates/partials/lista_lancamentos.html
(sem testes automatizados na v1) .../tests/conftest.py + test_lancamentos.py
index.md (Guia didático) index.md (Guia didático atualizado)
3.2. Lista de Tarefas
JAVA (listadetarefas_01) PYTHON (listadetarefas_python_01)
------------------------------------------------- -------------------------------------------------
listadetarefas-api/pom.xml listadetarefas_python_01/requirements.txt
listadetarefas-api/Dockerfile listadetarefas_python_01/Dockerfile
src/main/resources/application.properties .../app/config.py + .env
.../tarefa/Tarefa.java .../app/models/tarefa.py
(sem DTOs explícitos na v1) .../app/schemas/tarefa.py (Create, Update, Response)
.../tarefa/TarefaRepository.java .../app/repositories/tarefa_repository.py
.../tarefa/TarefaService.java .../app/services/tarefa_service.py
.../tarefa/TarefaController.java .../app/routers/tarefas.py
.../ListadetarefasApiApplication.java .../app/main.py (CORS + Lifespan)
(sem testes automatizados na v1) .../tests/conftest.py + test_tarefas_api.py
index.md (Guia didático) index.md (Guia didático atualizado)
3.3. Biblioteca de Jogos
JAVA (javaweb_jogos_01_crud) PYTHON (bibliotecajogos_python_01)
------------------------------------------------- -------------------------------------------------
bibliotecajogos/pom.xml bibliotecajogos_python_01/requirements.txt
bibliotecajogos/Dockerfile bibliotecajogos_python_01/Dockerfile
src/main/resources/application.properties .../app/config.py + .env
.../entity/Jogo.java .../app/models.py (Jogo)
.../app/schemas.py (JogoCreate, Response)
.../repository/JogoRepository.java .../app/database.py (Session SQLAlchemy)
.../controller/JogoController.java .../app/routes.py (Web + REST)
.../BibliotecajogosApplication.java .../app/main.py
src/main/resources/templates/jogos.html .../app/templates/jogos.html (Bootstrap 5)
(sem testes automatizados na v1) .../tests/conftest.py + test_jogos.py
index.md (Guia didático) index.md (Guia didático atualizado)
4. 🚀 Tabela de Mapeamento de Endpoints e Ações HTTP
| Projeto |
Ação do Sistema |
Rota Java (Spring) |
Rota Python (FastAPI) |
Tipo de Retorno (Python) |
| Controle de Gastos |
Carregar página inicial |
GET / |
GET / |
HTMLResponse (Jinja2) |
| |
Adicionar lançamento (HTMX) |
POST /lancamentos |
POST /lancamentos |
HTMLResponse (Fragmento) |
| |
Excluir lançamento (HTMX) |
DELETE /lancamentos/{id} |
DELETE /lancamentos/{id} |
HTMLResponse (Fragmento) |
| |
Listar lançamentos (REST JSON) |
(N/A na v1) |
GET /api/lancamentos |
list[LancamentoResponse] |
| |
Criar lançamento (REST JSON) |
(N/A na v1) |
POST /api/lancamentos |
LancamentoResponse (201) |
| |
Excluir lançamento (REST JSON) |
(N/A na v1) |
DELETE /api/lancamentos/{id} |
Status 204 No Content |
| Lista de Tarefas |
Listar tarefas |
GET /api/tarefas |
GET /api/tarefas |
list[TarefaResponse] |
| |
Buscar por ID |
GET /api/tarefas/{id} |
GET /api/tarefas/{id} |
TarefaResponse |
| |
Criar tarefa |
POST /api/tarefas |
POST /api/tarefas |
TarefaResponse (201) |
| |
Atualizar tarefa |
PUT /api/tarefas/{id} |
PUT /api/tarefas/{id} |
TarefaResponse |
| |
Deletar tarefa |
DELETE /api/tarefas/{id} |
DELETE /api/tarefas/{id} |
Status 204 No Content |
| Biblioteca de Jogos |
Listar jogos (Web) |
GET / |
GET / |
HTMLResponse (Bootstrap 5) |
| |
Adicionar jogo (Web Form) |
POST /jogos |
POST /jogos |
RedirectResponse (303) |
| |
Alternar status zerado (Web) |
POST /jogos/{id}/concluir |
POST /jogos/{id}/concluir |
RedirectResponse (303) |
| |
Apagar jogo (Web Form) |
POST /jogos/{id}/apagar |
POST /jogos/{id}/apagar |
RedirectResponse (303) |
| |
Listar jogos (REST JSON) |
(N/A na v1) |
GET /api/jogos |
list[JogoResponse] |
| |
Alternar status (REST JSON) |
(N/A na v1) |
PATCH /api/jogos/{id}/concluir |
JogoResponse |
5. 💡 Diferenças Críticas & Ganhos na Versão Python
- Documentação Swagger UI Integrada em Todos os Projetos:
- Enquanto no Spring Boot é necessário adicionar dependências adicionais (
springdoc-openapi-starter-webmvc-ui), o FastAPI expõe automaticamente o Swagger UI (/docs), ReDoc (/redoc) e a especificação OpenAPI JSON (/openapi.json) sem nenhuma configuração extra.
- Tipagem e DTOs com Pydantic v2:
- O Pydantic valida os tipos em tempo de execução e gera documentação automática. No Java, isso exigiria anotações manuais do Bean Validation (
@NotNull, @Size) e classes de DTO separadas desde o primeiro dia.
- Injeção de Dependência Leve:
- Em vez de anotações mágicas de reflexão (
@Autowired), o FastAPI utiliza Depends(), tornando o fluxo de dados e o ciclo de vida da conexão do banco 100% explícitos e fáceis de substituir em testes automatizados (app.dependency_overrides).
- Suite de Testes com
pytest Padronizada:
- Os 3 projetos em Python contam com suítes de testes prontas em
tests/, executando sobre bancos SQLite isolados em memória com StaticPool, garantindo velocidade instantânea nos testes de integração e validação de regressão.
- Deploy Simples e Rápido:
- O
Dockerfile baseado em python:3.11-slim gera imagens leves com inicialização instantânea no Render, contornando os tempos maiores de inicialização (cold starts) típicos da JVM.