📊 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:

  1. Controle de Gastos 01 (Interatividade com HTMX)
  2. Lista de Tarefas 01 (API REST desacoplada em 4 camadas)
  3. 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)

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)

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)

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

  1. 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.
  2. 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.
  3. 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).
  4. 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.
  5. 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.