🚀 5.5 Performance em Escala: Paginação Premium
Quando seu sistema de entrega cresce e atinge milhares de clientes, carregar todos os registros de uma vez no navegador torna-se um erro fatal de performance. Na Engenharia de Elite, utilizamos a Paginação nativa do Spring Data JPA.
🧠 Controller com Paginação
Em vez de retornar uma List<T>, retornamos um objeto Page<T>. O Spring Boot injeta automaticamente um objeto Pageable com base nos parâmetros da URL (ex: ?page=0&size=10).
@GetMapping
public ModelAndView list(@PageableDefault(size = 10, sort = "nome") Pageable pageable) {
Page<Cliente> page = clienteRepository.findAll(pageable);
return new ModelAndView("clientes/list", "clientes", page);
}🎨 Interface com Bootstrap
No Thymeleaf, utilizamos o objeto Page para renderizar os controles de navegação.
<nav aria-label="Navegação de Clientes" class="mt-4">
<ul class="pagination justify-content-center">
<!-- Botão Anterior -->
<li class="page-item" th:classappend="${clientes.first} ? 'disabled'">
<a class="page-link" th:href="@{/clientes(page=${clientes.number - 1})}">Anterior</a>
</li>
<!-- Números de Página -->
<li class="page-item" th:each="i : ${#numbers.sequence(0, clientes.totalPages - 1)}"
th:classappend="${i == clientes.number} ? 'active'">
<a class="page-link" th:href="@{/clientes(page=${i})}" th:text="${i + 1}">1</a>
</li>
<!-- Botão Próximo -->
<li class="page-item" th:classappend="${clientes.last} ? 'disabled'">
<a class="page-link" th:href="@{/clientes(page=${clientes.number + 1})}">Próximo</a>
</li>
</ul>
</nav>IMPORTANT
Performance Tip: O método
findAll(Pageable)executa duas consultas otimizadas: uma para contar o total de registros e outra para buscar apenas o “pedaço” (slice) solicitado. Isso garante que sua aplicação Green Dog continue rápida independente do tamanho do banco de dados.
Com a performance garantida, o próximo passo é preparar o sistema para o mercado global!