Guia sobre o Padrão de Camadas no Java Spring
📚 Introdução
No Spring Boot, normalmente dividimos o código em camadas para manter a organização e facilitar a manutenção. Essas camadas são:
- Entidade (Entity)
- Repositório (Repository)
- Serviço (Service)
- Controlador (Controller)
1. 🔍 Entidade (Entity) – Representa a tabela do banco de dados
A entidade é uma classe que representa uma tabela no banco de dados. Normalmente, usamos anotações do JPA (Java Persistence API) para mapear essa classe.
📂 Exemplo:
import jakarta.persistence.*;
@Entity
public class Produto {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
private double preco;
// Construtor vazio
public Produto() {}
// Construtor com argumentos
public Produto(String nome, double preco) {
this.nome = nome;
this.preco = preco;
}
// Getters e Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public double getPreco() {
return preco;
}
public void setPreco(double preco) {
this.preco = preco;
}
}
🔍 Essa classe Produto
representa uma tabela no banco chamada produto. 🔎 Getters e Setters são métodos usados para acessar (get) e modificar (set) os atributos privados da classe. Eles seguem o encapsulamento, uma boa prática da POO.
2. 🏢 Repositório (Repository) – Interface que acessa o banco de dados
O repositório é responsável por fazer operações no banco de dados, como buscar, salvar, deletar.
Ele é uma interface que estende JpaRepository
, e o Spring já cuida da implementação para você.
📂 Exemplo:
import org.springframework.data.jpa.repository.JpaRepository;
public interface ProdutoRepository extends JpaRepository<Produto, Long> {
}
🔍 Aqui não tem implementação! O Spring Data JPA cuida disso para você.
3. 🌟 Serviço (Service) – Onde fica a lógica de negócio
A camada de serviço contém a lógica de negócios, como validações e regras antes de acessar o banco.
📂 Exemplo:
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ProdutoService {
private final ProdutoRepository repository;
public ProdutoService(ProdutoRepository repository) {
this.repository = repository;
}
public List<Produto> listarTodos() {
return repository.findAll();
}
public Produto salvar(Produto produto) {
return repository.save(produto);
}
}
🔍 OProdutoService
recebe oProdutoRepository
e faz operações nele.
4. 🌟 Controlador (Controller) – A interface para API REST
O controller recebe requisições HTTP e chama o Service para processar os dados.
📂 Exemplo:
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/produtos")
public class ProdutoController {
private final ProdutoService service;
public ProdutoController(ProdutoService service) {
this.service = service;
}
@GetMapping
public List<Produto> listarTodos() {
return service.listarTodos();
}
@PostMapping
public Produto criar(@RequestBody Produto produto) {
return service.salvar(produto);
}
}
🔍 Agora temos um endpoint REST:
GET /produtos
→ Retorna todos os produtos.POST /produtos
→ Cria um novo produto.
🔥 Por que esse padrão é usado?
- Separa responsabilidades → Cada camada tem um papel claro.
- Facilita testes → Você pode testar cada camada separadamente.
- Reutilização → A lógica do
Service
pode ser reutilizada em diferentes lugares. - Manutenção mais fácil → Se precisar mudar o banco de dados, só altera o
Repository
.
🚀 Resumo
Entity -Representa a tabela do banco de dados
Repository -Interface que interage com o banco
Service -Contém a lógica de negócios
Controller -Recebe as requisições da API