Este documento detalha a arquitetura, a estrutura do projeto e as decisões de design para a aplicação de Lista de Tarefas. O objetivo é servir como uma fonte central de conhecimento para a equipe de desenvolvimento.
A aplicação segue uma arquitetura de monorepo, separando claramente as responsabilidades do backend e do frontend. Essa abordagem facilita o desenvolvimento, o deploy e a manutenção de cada parte de forma independente.
listadetarefas_v0/
├── backend/ # Contém toda a API Spring Boot (o projeto atual)
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── br/com/curso/todolist/api/
│ │ │ ├── TodolistApiApplication.java
│ │ │ └── tarefa/
│ │ │ ├── Tarefa.java
│ │ │ ├── TarefaController.java
│ │ │ ├── TarefaRepository.java
│ │ │ └── TarefaService.java
│ │ └── resources/
│ │ ├── application.properties
│ │ └── data.sql
│ └── test/
│ └── java/
│ └── br/com/curso/todolist/api/tarefa/
│ └── TarefaControllerTest.java
│
├── frontend/ # (Exemplo) Projeto Angular, React, Vue, etc.
│ ├── package.json
│ └── src/
│
└── GUIA_DE_ARQUITETURA.md # Este arquivo
O backend adota uma arquitetura em camadas clássica, que promove a separação de responsabilidades (Separation of Concerns) e facilita os testes e a manutenção.
...api.tarefaTarefaController.java...api.tarefaTarefaService.java...api.tarefaTarefaRepository.java...api.tarefaTarefa.javaEste diagrama ilustra as principais interações que um cliente (como o frontend) pode ter com o sistema de tarefas.
flowchart LR
User("Usuário")
subgraph "Sistema"
UC1("Criar Tarefa")
UC2("Listar Todas as Tarefas")
UC3("Buscar Tarefa por ID")
UC4("Atualizar Tarefa")
UC5("Excluir Tarefa")
end
User --> UC1
User --> UC2
User --> UC3
User --> UC4
User --> UC5
Este diagrama mostra a relação entre as principais classes do backend e suas responsabilidades.
classDiagram
class TarefaController {
-TarefaService tarefaService
+criarTarefa("Tarefa") ResponseEntity~Tarefa~
+listarTarefas() List~Tarefa~
+buscarTarefaPorId("Long") ResponseEntity~Tarefa~
+atualizarTarefa("Long, Tarefa") ResponseEntity~Tarefa~
+deletarTarefa("Long") ResponseEntity~Void~
}
class TarefaService {
-TarefaRepository tarefaRepository
+criar("Tarefa") Tarefa
+listarTodas() List~Tarefa~
+buscarPorId("Long") Optional~Tarefa~
+atualizar("Long, Tarefa") Tarefa
+deletar("Long") void
}
class TarefaRepository {
<<Interface>>
+findAll()
+findById("Long")
+save("Tarefa")
+deleteById("Long")
}
class Tarefa {
-Long id
-String titulo
-String descricao
-boolean concluida
}
TarefaController ..> TarefaService : "utiliza"
TarefaService ..> TarefaRepository : "utiliza"
TarefaRepository ..> Tarefa : "gerencia"
Representação da tabela de tarefas no banco de dados.
erDiagram
TB_TAREFAS {
Long id PK "Chave Primária, Auto-incremento"
String titulo "Título da tarefa"
String descricao "Descrição detalhada"
boolean concluida "Indica se a tarefa foi finalizada"
}
Esta seção descreve o fluxo de criação dos componentes do backend.
pom.xml e application.properties)pom.xml: Define as dependências essenciais: spring-boot-starter-web para a API, spring-boot-starter-data-jpa para o acesso a dados, h2 para o banco em memória e lombok para reduzir código boilerplate.application.properties: Configura a conexão com o banco de dados H2 e habilita o defer-datasource-initialization para garantir que as tabelas sejam criadas pelo Hibernate antes da execução do data.sql.Tarefa.java)@Entity para ser reconhecida pelo JPA.@Table(name = "tb_tarefas") define o nome da tabela.@Id e @GeneratedValue(strategy = GenerationType.IDENTITY) configuram a chave primária com auto-incremento gerenciado pelo banco.TarefaRepository.java)JpaRepository<Tarefa, Long>.TarefaService.java)@Service para ser gerenciado pelo Spring.TarefaRepository via @Autowired.TarefaController.java)@RestController para indicar que os retornos dos métodos serão serializados para JSON.@RequestMapping("/tarefas") define a URL base para todos os endpoints.@GetMapping, @PostMapping, @PutMapping e @DeleteMapping para mapear os métodos HTTP para as ações CRUD, seguindo as melhores práticas REST.