Pular para conteúdo

Aula 04 - Estrutura de Projeto e Camadas 🏗️

Hoje vamos organizar nosso projeto Spring Boot em camadas profissionais — a base de qualquer API bem arquitetada que construiremos no restante do curso.

😊 A Arquitetura em Camadas

Um projeto Spring Boot bem estruturado separa responsabilidades em camadas claras:

  • Controller: Recebe requisições HTTP e devolve respostas.
  • Service: Contém as regras de negócio.
  • Repository: Acessa o banco de dados.
  • Model/Entity: Representa os dados do domínio.

📊 Fluxo entre Camadas

sequenceDiagram
    participant Cliente
    participant Controller
    participant Service
    participant Repository
    participant DB

    Cliente->>Controller: GET /produtos
    Controller->>Service: listarProdutos()
    Service->>Repository: findAll()
    Repository->>DB: SELECT * FROM produtos
    DB-->>Repository: Dados
    Repository-->>Service: Lista de Produtos
    Service-->>Controller: Lista de Produtos
    Controller-->>Cliente: JSON

🧠 Regra de Ouro: Cada Camada, Sua Responsabilidade

Important

O Controller não deve conter lógica de negócio. O Service não deve saber nada sobre HTTP. O Repository não deve conter regras de negócio, só acesso a dados.

💻 Estrutura de Pastas Sugerida

$ tree src/main/java/com/exemplo/backend
.
├── controller   # Classes anotadas com @RestController
├── service      # Classes anotadas com @Service
├── repository   # Interfaces que estendem JpaRepository
├── model        # Classes anotadas com @Entity
└── BackendApplication.java

🧠 As Principais Anotações do Spring

Anotação Camada Função
@RestController Controller Marca a classe como responsável por receber requisições HTTP
@Service Service Marca a classe como um Bean de lógica de negócio
@Repository Repository Marca a interface/classe como responsável por acesso a dados
@Entity Model Marca a classe como uma tabela do banco de dados

📝 Exercícios Progressivos

  1. Básico: Quais as 4 camadas principais de um projeto Spring Boot organizado?
  2. Básico: Qual anotação usamos para marcar uma classe Service?
  3. Intermediário: Por que o Controller não deve acessar o Repository diretamente, pulando o Service?
  4. Intermediário: O que aconteceria se colocássemos uma query SQL dentro do Controller?
  5. Desafio: Desenhe (ou descreva) o fluxo de camadas para uma requisição POST /pedidos que cria um novo pedido.

🚀 Mini-projeto: Crie a estrutura de pacotes controller, service, repository e model no seu projeto Spring Boot, mesmo que ainda estejam vazios.