Um aplicativo clássico de lista de tarefas (To-Do List) construído com uma arquitetura robusta e moderna, focada em boas práticas de desenvolvimento backend (Spring Boot) e frontend (React com TypeScript).
Este projeto serve como a fundação do meu roadmap, demonstrando domínio em APIs RESTful, persistência de dados com JPA e gerenciamento de estado no frontend.
Este projeto é dividido em duas partes principais, contidas nas pastas /backend e /frontend.
- Java 17
- Spring Boot 3: Para a criação da API RESTful.
- Spring Data JPA: Para persistência de dados.
- PostgreSQL: Banco de dados relacional.
- Lombok: Para redução de código boilerplate.
- Maven: Gerenciador de dependências.
- JUnit 5 / Mockito: Para testes unitários e de integração.
- React 18
- TypeScript: Para tipagem estática e segurança no desenvolvimento.
- Vite: Build tool de frontend moderna e rápida.
- Zustand: Gerenciamento de estado leve e moderno.
- Axios: Para chamadas à API REST.
- Docker e Docker Compose: Para containerizar e orquestrar a aplicação completa (Backend, Frontend e Banco de Dados) com um único comando.
- CRUD Completo de Tarefas (Criar, Ler, Atualizar, Deletar).
- Validação de Dados no backend (ex:
titleobrigatório,priorityválida). - Gerenciamento de Prioridade (LOW, MEDIUM, HIGH).
- Marcar Tarefas como completas/pendentes (via
PATCH). - Tratamento de Erros robusto com um
GlobalExceptionHandler(retornando 400, 404 e 500 de forma amigável).
O design deste projeto foca na separação clara de responsabilidades, seguindo padrões de mercado.
-
Arquitetura em 3 Camadas (Backend):
Controller: Responsável por expor os endpoints REST, receber DTOs e lidar com respostas HTTP.Service: Onde mora a lógica de negócio (ex: como criar ou atualizar uma tarefa). Programado para a interface (TaskService) para desacoplamento.Repository: Camada de acesso a dados, usando Spring Data JPA.
-
Padrão DTO (Data Transfer Object):
- A API não expõe a entidade do banco (
Task.java) diretamente. - Usamos DTOs (ex:
TaskCreateUpdateDTO,TaskResponseDTO) para validar entradas e formatar saídas, garantindo uma API segura e estável.
- A API não expõe a entidade do banco (
-
Ambiente Containerizado:
- A aplicação inteira (backend, frontend e DB) é gerenciada pelo
docker-compose.yml. - O frontend é servido por um container Nginx otimizado para produção.
- A aplicação inteira (backend, frontend e DB) é gerenciada pelo
Caso queira saber como foi o desenvolvimento do projeto, abaixo descrevo um pouco dos desafios que enfrentei. (PS. Podem haver situações relativamente bobas, mas sem julgamentos, viu?)
Backend Clique aqui
Você pode rodar este projeto de duas formas. A mais fácil e recomendada é usando o Docker.
Este método sobe o banco de dados, o backend e o frontend de uma vez.
Pré-requisitos:
- Docker Desktop instalado e rodando.
Passos:
- Clone este repositório:
git clone [https://seu-link-do-repo.git](https://seu-link-do-repo.git)
- Navegue até a pasta deste projeto:
cd nome-do-repo/projeto-1 - Execute o Docker Compose (o
--buildé necessário na primeira vez):docker-compose up --build
- Pronto!
- O frontend estará acessível em:
http://localhost:3000 - A API do backend estará acessível em:
http://localhost:8080
- O frontend estará acessível em:
Se preferir rodar cada parte separadamente (sem Docker).
Pré-requisitos:
- Java 17 (JDK)
- Node.js v18+
- Um banco PostgreSQL rodando manualmente em
localhost:5432com as credenciais doapplication.properties.
Passo 1: Rodar o Backend
# Navegue até a pasta do backend
cd projeto-1/backend
# Instale as dependências e rode
mvn spring-boot:run