PageRequest
Published: 2024-06-22 17:19:56

`PageRequest`, Spring Data JPA'nın veri kümesini sayfalara bölmek ve sıralamak için kullandığı bir sınıftır. Sayfalama, büyük veri kümeleriyle çalışırken performansı artırmak ve kullanıcılara daha iyi bir deneyim sunmak için önemli bir tekniktir. Sayfalama, tüm veri kümesini tek seferde yüklemek yerine, verileri belirli büyüklükteki parçalara (sayfalara) bölerek yükler.

### PageRequest ve Sayfalamanın Faydaları

1. **Performans İyileştirmesi**:
   - Büyük veri kümeleriyle çalışırken, tüm verileri tek seferde yüklemek veritabanı ve uygulama performansını olumsuz etkileyebilir. Sayfalama, sadece ihtiyaç duyulan verileri yükleyerek bu sorunu azaltır.

2. **Bellek Kullanımı**:
   - Tüm veri kümesini bellek üzerinde tutmak yerine, sadece istenen sayfayı bellek üzerinde tutarak bellek kullanımını optimize eder.

3. **Kullanıcı Deneyimi**:
   - Kullanıcılara daha hızlı yanıt süreleri sunar. Kullanıcılar genellikle tüm veri kümesini görmek istemezler; bunun yerine verileri sayfalar halinde görmek daha kullanışlıdır.

4. **Sıralama**:
   - Verileri belirli bir alana göre sıralama imkanı sunar. Örneğin, ürünleri fiyatlarına göre artan veya azalan sırada gösterebilirsiniz.

### `PageRequest` Kullanımı

Kod örneğimizde `PageRequest`'in nasıl kullanıldığını inceleyelim:

```java
public Set<ProductResponse> getAll(ProductSearchRequest request) {

    Specification<Product> productSpecification = ProductSpecification.initProductSpecification(request);

    // Sayfalama ve sıralama için PageRequest oluşturulması
    PageRequest pageRequest = PageRequest.of(request.getPage(), request.getSize(), Sort.by(Sort.Direction.ASC, "amount"));

    // Sayfalama ve spesifikasyon ile ürünlerin getirilmesi
    Page<Product> products = productRepository.findAll(productSpecification, pageRequest);

    log.info("db'den getirildi. product size:{}", products.getSize());

    return ProductConverter.toResponse(products.stream().toList());
}
```

### Açıklama

1. **PageRequest Oluşturulması**:
   ```java
   PageRequest pageRequest = PageRequest.of(request.getPage(), request.getSize(), Sort.by(Sort.Direction.ASC, "amount"));
   ```
   - `PageRequest.of(int page, int size, Sort sort)` metodu, belirli bir sayfa numarası (`page`), sayfa başına kayıt sayısı (`size`) ve sıralama kriteri (`sort`) ile bir `PageRequest` nesnesi oluşturur.
   - `request.getPage()`: Hangi sayfanın yükleneceğini belirtir (0 tabanlı indeks).
   - `request.getSize()`: Sayfa başına kaç kaydın yükleneceğini belirtir.
   - `Sort.by(Sort.Direction.ASC, "amount")`: Kayıtların `amount` alanına göre artan sırada sıralanacağını belirtir. Bu, ürünleri fiyatlarına göre artan sırada sıralar.

2. **Veritabanı Sorgusu**:
   ```java
   Page<Product> products = productRepository.findAll(productSpecification, pageRequest);
   ```
   - `productRepository.findAll(Specification spec, Pageable pageable)` metodu, belirli bir spesifikasyona ve sayfalama kriterlerine göre veritabanından kayıtları getirir.
   - Bu örnekte, `productSpecification` ve `pageRequest` kullanılarak, belirli bir sayfaya ait ürünler `amount` alanına göre sıralanmış olarak getirilir.

3. **Sonuçların Dönüşümü**:
   ```java
   return ProductConverter.toResponse(products.stream().toList());
   ```
   - Veritabanından getirilen `Product` nesneleri `ProductResponse` nesnelerine dönüştürülür ve set olarak döner.

### Özet

`PageRequest`, Spring Data JPA'nın veri kümesini sayfalara bölmek ve sıralamak için kullandığı bir sınıftır. Bu, büyük veri kümeleriyle çalışırken performansı artırmak, bellek kullanımını optimize etmek ve kullanıcılara daha iyi bir deneyim sunmak için önemli bir tekniktir. `PageRequest` kullanarak, sadece belirli bir sayfadaki kayıtları yükleyebilir ve verileri belirli bir alana göre sıralayabilirsiniz.