{"id":34367,"date":"2025-11-15T20:01:06","date_gmt":"2025-11-15T17:01:06","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/"},"modified":"2025-11-15T20:01:06","modified_gmt":"2025-11-15T17:01:06","slug":"spring-bootta-etkili-sayfalama-pagination-nasil-yapilir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/","title":{"rendered":"Spring Boot&#8217;ta Etkili Sayfalama (Pagination) Nas\u0131l Yap\u0131l\u0131r?"},"content":{"rendered":"<p><body><\/p>\n<p>B\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken performans sorunlar\u0131 m\u0131 ya\u015f\u0131yorsunuz? Spring Boot projelerinizde sayfalama (pagination) uygulayarak verimlili\u011fi nas\u0131l art\u0131raca\u011f\u0131n\u0131z\u0131, kullan\u0131c\u0131 deneyimini nas\u0131l iyile\u015ftirece\u011finizi ve API \u00e7a\u011fr\u0131lar\u0131n\u0131z\u0131 nas\u0131l optimize edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Bu kapsaml\u0131 rehber, temel kavramlardan ileri d\u00fczey tekniklere kadar her \u015feyi i\u00e7eriyor.<\/p>\n<p>Modern web uygulamalar\u0131 ve API&#8217;lar, s\u00fcrekli b\u00fcy\u00fcyen veri miktarlar\u0131yla ba\u015fa \u00e7\u0131kmak zorundad\u0131r. Bir e-ticaret sitesinde binlerce \u00fcr\u00fcn, bir sosyal medya uygulamas\u0131nda milyonlarca g\u00f6nderi veya bir kurumsal sistemde on binlerce kullan\u0131c\u0131 bilgisi olabilir. T\u00fcm bu veriyi tek bir seferde y\u00fcklemeye \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131zda, uygulaman\u0131z\u0131n performans\u0131 ciddi \u015fekilde d\u00fc\u015febilir. Sunucu taraf\u0131nda a\u015f\u0131r\u0131 bellek ve CPU t\u00fcketimi ya\u015fan\u0131rken, istemci taraf\u0131nda da sayfan\u0131n y\u00fcklenmesi uzun s\u00fcrebilir, hatta taray\u0131c\u0131 kilitlenebilir. \u0130\u015fte tam bu noktada, sayfalama (pagination) devreye girer ve bu yayg\u0131n soruna zarif bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<p>Sayfalama, k\u0131saca, b\u00fcy\u00fck bir veri k\u00fcmesini daha k\u00fc\u00e7\u00fck, y\u00f6netilebilir par\u00e7alara (sayfalara) b\u00f6lme i\u015flemidir. Kullan\u0131c\u0131, her seferinde sadece belirli bir sayfa kadar veri g\u00f6r\u00fcr ve ihtiya\u00e7 duydu\u011funda di\u011fer sayfalara ge\u00e7ebilir. Bu yakla\u015f\u0131m\u0131n hem sunucu hem de istemci taraf\u0131nda bir\u00e7ok faydas\u0131 bulunmaktad\u0131r. \u00d6ncelikle, sunucunun t\u00fcm veriyi \u00e7ekip i\u015flemek yerine yaln\u0131zca istenen sayfan\u0131n verisini getirmesi gerekti\u011fi i\u00e7in kaynak kullan\u0131m\u0131 optimize edilir. Veritaban\u0131 sorgular\u0131 daha h\u0131zl\u0131 sonu\u00e7 verir, a\u011f trafi\u011fi azal\u0131r ve API yan\u0131t s\u00fcreleri k\u0131sal\u0131r. \u0130kinci olarak, kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan bak\u0131ld\u0131\u011f\u0131nda, sayfalama, kullan\u0131c\u0131lar\u0131n g\u00f6z\u00fcn\u00fc korkutmadan ve onlar\u0131 bekletmeden arad\u0131klar\u0131 bilgiye ula\u015fmalar\u0131n\u0131 sa\u011flar. Uzun bir listede kayd\u0131rmak yerine, belirli bir sayfaya gitmek veya sonraki\/\u00f6nceki sayfalar aras\u0131nda ge\u00e7i\u015f yapmak genellikle daha sezgisel ve kullan\u0131\u015fl\u0131d\u0131r. Ayr\u0131ca, filtreleme ve s\u0131ralama gibi \u00f6zelliklerle birle\u015fti\u011finde, kullan\u0131c\u0131lar\u0131n devasa veri y\u0131\u011f\u0131nlar\u0131 aras\u0131nda gezinmesini \u00e7ok daha kolay hale getirir.<\/p>\n<p>Peki, Spring Boot gibi g\u00fc\u00e7l\u00fc bir framework&#8217;te sayfalama nas\u0131l uygulan\u0131r? Spring Data JPA, bu konuda bize m\u00fckemmel ara\u00e7lar sunar. Geli\u015ftiricilerin, veritaban\u0131 i\u015flemlerini basitle\u015ftirerek pagination \u00f6zelliklerini kolayca entegre etmelerini sa\u011flar. Bu makalede, Spring Boot projenizde sayfalama yeteneklerini s\u0131f\u0131rdan nas\u0131l ad\u0131m ad\u0131m entegre edece\u011finizi, temel kavramlardan ba\u015flayarak ileri d\u00fczey kullan\u0131m senaryolar\u0131na kadar detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Uygulama geli\u015ftirme s\u00fcre\u00e7lerinizde performans ve kullan\u0131labilirlik a\u00e7\u0131s\u0131ndan \u00f6nemli bir fark yaratacak bu konuyu derinlemesine ke\u015ffetmeye haz\u0131r m\u0131s\u0131n\u0131z? O halde, gelin temel kavramlarla ba\u015flayal\u0131m.<\/p>\n<h2>Spring Boot ve Sayfalama: Temel Kavramlar Nelerdir?<\/h2>\n<p>Spring Boot ekosisteminde sayfalama implementasyonu, Spring Data JPA sayesinde olduk\u00e7a kolay ve sezgisel bir hale gelmi\u015ftir. Bu b\u00f6l\u00fcmde, sayfalama yaparken kar\u015f\u0131la\u015faca\u011f\u0131m\u0131z anahtar bile\u015fenleri ve kavramlar\u0131 detayl\u0131ca inceleyece\u011fiz. Bu bile\u015fenleri anlamak, uygulaman\u0131zda etkili ve do\u011fru bir sayfalama mekanizmas\u0131 kurman\u0131z i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p>\u00d6ncelikle, sayfalama i\u015flemlerinin kalbinde yer alan iki temel kavramdan bahsedelim: <code class=\"language-java\">Pageable<\/code> ve <code class=\"language-java\">Page<\/code> aray\u00fczleri. <code class=\"language-java\">Pageable<\/code>, bir sorgunun hangi sayfay\u0131, ka\u00e7 elemanla ve hangi s\u0131ralama d\u00fczenine g\u00f6re getirece\u011fini tan\u0131mlayan bir nesnedir. Genellikle HTTP iste\u011fi ile gelen <code class=\"language-java\">page<\/code> (sayfa numaras\u0131), <code class=\"language-java\">size<\/code> (sayfa boyutu) ve <code class=\"language-java\">sort<\/code> (s\u0131ralama kriteri) parametrelerini kapsar. Spring Boot, bu parametreleri otomatik olarak bir <code class=\"language-java\">Pageable<\/code> nesnesine d\u00f6n\u00fc\u015ft\u00fcrebilen g\u00fc\u00e7l\u00fc bir mekanizmaya sahiptir. Bu sayede, geli\u015ftiricilerin request parametrelerini manuel olarak ayr\u0131\u015ft\u0131rmas\u0131na gerek kalmaz, bu da kod karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/p>\n<p><code class=\"language-java\">Page<\/code> ise, <code class=\"language-java\">Pageable<\/code> taraf\u0131ndan tan\u0131mlanan kriterlere g\u00f6re veritaban\u0131ndan getirilen sayfalama sonu\u00e7lar\u0131n\u0131 temsil eden bir nesnedir. Bir <code class=\"language-java\">Page<\/code> nesnesi sadece o sayfadaki eleman listesini i\u00e7ermekle kalmaz, ayn\u0131 zamanda toplam eleman say\u0131s\u0131, toplam sayfa say\u0131s\u0131, mevcut sayfa numaras\u0131, sayfa boyutu, ilk sayfa m\u0131, son sayfa m\u0131 oldu\u011fu gibi sayfalama ile ilgili metadatalar\u0131 da bar\u0131nd\u0131r\u0131r. Bu metadatalar, \u00f6zellikle frontend taraf\u0131nda sayfalama kontrolleri (\u00f6rne\u011fin, &#8220;Sonraki Sayfa&#8221;, &#8220;\u00d6nceki Sayfa&#8221;, sayfa numaralar\u0131) olu\u015fturmak i\u00e7in hayati \u00f6nem ta\u015f\u0131r. Yani, <code class=\"language-java\">Page<\/code> nesnesi, sadece veriyi de\u011fil, ayn\u0131 zamanda veriye nas\u0131l ula\u015f\u0131ld\u0131\u011f\u0131na dair zengin bir ba\u011flam da sunar.<\/p>\n<p>Spring Data JPA, <code class=\"language-java\">JpaRepository<\/code> aray\u00fcz\u00fc arac\u0131l\u0131\u011f\u0131yla bu sayfalama mekanizmas\u0131n\u0131 veritaban\u0131 katman\u0131na entegre eder. <code class=\"language-java\">JpaRepository<\/code>, bir\u00e7ok standart CRUD metodunun yan\u0131 s\u0131ra, sayfalama ve s\u0131ralama yeteneklerini destekleyen <code class=\"language-java\">findAll(Pageable pageable)<\/code> gibi metodlar\u0131 da sa\u011flar. Bu sayede, herhangi bir \u00f6zel sorgu yazmadan varl\u0131klar\u0131n\u0131z\u0131 sayfalayarak \u00e7ekebilirsiniz. \u00d6rne\u011fin, <code class=\"language-java\">Page<MyEntity> findAll(Pageable pageable)<\/code> metodunu \u00e7a\u011f\u0131rd\u0131\u011f\u0131n\u0131zda, Spring Data JPA otomatik olarak veritaban\u0131 sorgusuna <code class=\"language-sql\">LIMIT<\/code> ve <code class=\"language-sql\">OFFSET<\/code> clause&#8217;lar\u0131n\u0131 ekleyerek sadece istenen sayfan\u0131n verisini getirir ve toplam kay\u0131t say\u0131s\u0131n\u0131 almak i\u00e7in ayr\u0131 bir <code class=\"language-sql\">COUNT<\/code> sorgusu \u00e7al\u0131\u015ft\u0131r\u0131r. Bu i\u015flemlerin tamam\u0131 arka planda \u015feffaf bir \u015fekilde y\u00f6netilir, bu da geli\u015ftirme s\u00fcrecini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r.<\/p>\n<p>Sayfalama parametrelerine gelince, bunlar genellikle \u00fc\u00e7 ana bile\u015fenden olu\u015fur:<\/p>\n<ol>\n<li><strong><code class=\"language-java\">page<\/code>:<\/strong> \u0130stenen sayfa numaras\u0131d\u0131r. \u00c7o\u011fu sistemde 0&#8217;dan ba\u015flar (yani ilk sayfa 0&#8217;d\u0131r).<\/li>\n<li><strong><code class=\"language-java\">size<\/code>:<\/strong> Bir sayfada ka\u00e7 eleman olaca\u011f\u0131n\u0131 belirtir.<\/li>\n<li><strong><code class=\"language-java\">sort<\/code>:<\/strong> Verinin hangi alan(lar)a g\u00f6re ve hangi y\u00f6nde (ASC\/DESC) s\u0131ralanaca\u011f\u0131n\u0131 tan\u0131mlar. \u00d6rne\u011fin, <code class=\"language-java\">name,asc<\/code> veya <code class=\"language-java\">price,desc<\/code> \u015feklinde kullan\u0131labilir.<\/li>\n<\/ol>\n<p>Bu parametreler, REST API&#8217;larda genellikle sorgu parametreleri (<code class=\"language-http\">?page=0&size=10&sort=name,asc<\/code>) olarak kullan\u0131l\u0131r. Spring MVC, bu HTTP parametrelerini otomatik olarak bir <code class=\"language-java\">Pageable<\/code> nesnesine ba\u011flama yetene\u011fine sahiptir, bu da controller metotlar\u0131n\u0131z\u0131n daha temiz ve okunabilir olmas\u0131n\u0131 sa\u011flar. T\u00fcm bu temel kavramlar, Spring Boot ile sayfalama yap\u0131s\u0131n\u0131 kurmak i\u00e7in sa\u011flam bir zemin olu\u015fturur. \u015eimdi, bu teorik bilgileri pratik bir uygulamaya d\u00f6n\u00fc\u015ft\u00fcrelim.<\/p>\n<h2>Ad\u0131m Ad\u0131m Spring Boot Sayfalama Uygulamas\u0131: Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>\u015eimdiye kadar sayfalama kavram\u0131n\u0131n ne anlama geldi\u011fini ve Spring Boot&#8217;taki temel bile\u015fenlerini \u00f6\u011frendik. Bu b\u00f6l\u00fcmde ise, s\u0131f\u0131rdan bir Spring Boot projesi olu\u015fturarak, sayfalama \u00f6zelli\u011fini ad\u0131m ad\u0131m nas\u0131l entegre edece\u011fimizi pratik kod \u00f6rnekleri \u00fczerinden g\u00f6rece\u011fiz. Bu uygulama, kullan\u0131c\u0131lar\u0131n \u00fcr\u00fcn listelerini sayfalayarak ve s\u0131ralayarak g\u00f6r\u00fcnt\u00fcleyebilece\u011fi basit bir REST API sunacak.<\/p>\n<h3>Proje Kurulumu ve Ba\u011f\u0131ml\u0131l\u0131klar<\/h3>\n<p>\u00d6ncelikle, <a href=\"https:\/\/start.spring.io\/\">Spring Initializr<\/a> adresine giderek yeni bir Spring Boot projesi olu\u015ftural\u0131m. A\u015fa\u011f\u0131daki ba\u011f\u0131ml\u0131l\u0131klar\u0131 ekledi\u011finizden emin olun:<\/p>\n<ul>\n<li>Spring Web: RESTful API&#8217;ler olu\u015fturmak i\u00e7in.<\/li>\n<li>Spring Data JPA: Veritaban\u0131 etkile\u015fimleri ve sayfalama i\u00e7in.<\/li>\n<li>H2 Database: Geli\u015ftirme ortam\u0131nda kolay kullan\u0131m i\u00e7in in-memory bir veritaban\u0131. Ger\u00e7ek bir projede PostgreSQL, MySQL gibi bir veritaban\u0131 kullanabilirsiniz.<\/li>\n<li>Lombok (iste\u011fe ba\u011fl\u0131 ama tavsiye edilir): Boilerplate kodu azaltmak i\u00e7in (getter, setter, constructor vb.).<\/li>\n<\/ul>\n<pre><code class=\"language-xml\">\n<dependencies>\n    <dependency>\n        <groupId>org.springframework.boot<\/groupId>\n        <artifactId>spring-boot-starter-web<\/artifactId>\n    <\/dependency>\n    <dependency>\n        <groupId>org.springframework.boot<\/groupId>\n        <artifactId>spring-boot-starter-data-jpa<\/artifactId>\n    <\/dependency>\n    <dependency>\n        <groupId>com.h2database<\/groupId>\n        <artifactId>h2<\/artifactId>\n        <scope>runtime<\/scope>\n    <\/dependency>\n    <dependency>\n        <groupId>org.projectlombok<\/groupId>\n        <artifactId>lombok<\/artifactId>\n        <optional>true<\/optional>\n    <\/dependency>\n    <dependency>\n        <groupId>org.springframework.boot<\/groupId>\n        <artifactId>spring-boot-starter-test<\/artifactId>\n        <scope>test<\/scope<\n    <\/dependency>\n<\/dependencies>\n<\/pre>\n<p><\/code><\/p>\n<p>Projenizi IDE'nizde a\u00e7t\u0131ktan sonra, <code class=\"language-properties\">application.properties<\/code> dosyan\u0131za H2 veritaban\u0131 ayarlar\u0131n\u0131 ekleyebilirsiniz:<\/p>\n<pre><code class=\"language-properties\">\nspring.h2.console.enabled=true\nspring.h2.console.path=\/h2-console\nspring.datasource.url=jdbc:h2:mem:testdb\nspring.datasource.driverClassName=org.h2.Driver\nspring.datasource.username=sa\nspring.datasource.password=password\nspring.jpa.database-platform=org.hibernate.dialect.H2Dialect\nspring.jpa.hibernate.ddl-auto=update\n<\/pre>\n<p><\/code><\/p>\n<h3>Varl\u0131k (Entity) Tan\u0131mlama<\/h3>\n<p>\u015eimdi, basit bir <code class=\"language-java\">Product<\/code> (\u00dcr\u00fcn) varl\u0131\u011f\u0131 olu\u015ftural\u0131m. Bu varl\u0131k, veritaban\u0131nda saklayaca\u011f\u0131m\u0131z verinin yap\u0131s\u0131n\u0131 temsil edecek.<\/p>\n<pre><code class=\"language-java\">\npackage com.example.pagination.entity;\n\nimport jakarta.persistence.Entity;\nimport jakarta.persistence.GeneratedValue;\nimport jakarta.persistence.GenerationType;\nimport jakarta.persistence.Id;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport lombok.AllArgsConstructor;\n\n@Entity\n@Data\n@NoArgsConstructor\n@AllArgsConstructor\npublic class Product {\n\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    private Long id;\n    private String name;\n    private String description;\n    private double price;\n    private int stock;\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Veri Deposu (Repository) Olu\u015fturma<\/h3>\n<p>Veritaban\u0131 i\u015flemleri i\u00e7in bir repository aray\u00fcz\u00fc olu\u015ftural\u0131m. Spring Data JPA sayesinde, <code class=\"language-java\">JpaRepository<\/code>'yi geni\u015fleterek sayfalama ve s\u0131ralama \u00f6zelliklerini otomatik olarak alaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-java\">\npackage com.example.pagination.repository;\n\nimport com.example.pagination.entity.Product;\nimport org.springframework.data.jpa.repository.JpaRepository;\nimport org.springframework.stereotype.Repository;\n\n@Repository\npublic interface ProductRepository extends JpaRepository<Product, Long> {\n    \/\/ Spring Data JPA, JpaRepository'den miras ald\u0131\u011f\u0131m\u0131z i\u00e7in\n    \/\/ findAll(Pageable pageable) metodunu otomatik olarak sa\u011flar.\n    \/\/ \u0130htiya\u00e7 duyulursa burada \u00f6zel sorgular da tan\u0131mlanabilir.\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Servis Katman\u0131 (Service Layer) Uygulamas\u0131<\/h3>\n<p>Uygulamam\u0131z\u0131n i\u015f mant\u0131\u011f\u0131n\u0131 i\u00e7eren bir servis katman\u0131 olu\u015ftural\u0131m. Bu katman, repository ile ileti\u015fim kurarak veri alma, kaydetme gibi i\u015flemleri y\u00f6netecek. Burada <code class=\"language-java\">Pageable<\/code> nesnesini repository'ye do\u011frudan iletece\u011fiz.<\/p>\n<pre><code class=\"language-java\">\npackage com.example.pagination.service;\n\nimport com.example.pagination.entity.Product;\nimport com.example.pagination.repository.ProductRepository;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n@Service\npublic class ProductService {\n\n    private final ProductRepository productRepository;\n\n    public ProductService(ProductRepository productRepository) {\n        this.productRepository = productRepository;\n    }\n\n    public Page<Product> getAllProducts(Pageable pageable) {\n        return productRepository.findAll(pageable);\n    }\n\n    public Product saveProduct(Product product) {\n        return productRepository.save(product);\n    }\n\n    public List<Product> saveAllProducts(List<Product> products) {\n        return productRepository.saveAll(products);\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Kontrolc\u00fc (Controller) Olu\u015fturma ve API Tasar\u0131m\u0131<\/h3>\n<p>\u015eimdi, frontend veya di\u011fer istemcilerin \u00fcr\u00fcn verilerine eri\u015fece\u011fi REST kontrolc\u00fcm\u00fcz\u00fc tan\u0131mlayal\u0131m. Bu kontrolc\u00fcde, Spring MVC'nin <code class=\"language-java\">Pageable<\/code> \u00e7\u00f6z\u00fcmleyicisini kullanarak HTTP iste\u011findeki <code class=\"language-java\">page<\/code>, <code class=\"language-java\">size<\/code> ve <code class=\"language-java\">sort<\/code> parametrelerini otomatik olarak bir <code class=\"language-java\">Pageable<\/code> nesnesine d\u00f6n\u00fc\u015ft\u00fcrece\u011fiz.<\/p>\n<pre><code class=\"language-java\">\npackage com.example.pagination.controller;\n\nimport com.example.pagination.entity.Product;\nimport com.example.pagination.service.ProductService;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\n\n@RestController\n@RequestMapping(\"\/api\/products\")\npublic class ProductController {\n\n    private final ProductService productService;\n\n    public ProductController(ProductService productService) {\n        this.productService = productService;\n    }\n\n    @GetMapping\n    public ResponseEntity<Page<Product>> getAllProducts(Pageable pageable) {\n        Page<Product> products = productService.getAllProducts(pageable);\n        return ResponseEntity.ok(products);\n    }\n\n    @PostMapping\n    public ResponseEntity<Product> createProduct(@RequestBody Product product) {\n        Product savedProduct = productService.saveProduct(product);\n        return ResponseEntity.status(201).body(savedProduct);\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Controller metodunuzda do\u011frudan <code class=\"language-java\">Pageable<\/code> parametresi kullanmak, Spring Data Web taraf\u0131ndan sa\u011flanan bir \u00f6zelliktir. Bu sayede request parametrelerini manuel olarak parse etmeye gerek kalmaz, kodunuz daha temiz olur. Varsay\u0131lan olarak <code class=\"language-java\">page=0<\/code> ve <code class=\"language-java\">size=20<\/code> kullan\u0131l\u0131r.\n<\/div>\n<h3>\u00d6rnek Veri ve Test<\/h3>\n<p>Uygulamay\u0131 test etmek i\u00e7in ba\u015flang\u0131\u00e7ta baz\u0131 \u00f6rnek veriler ekleyelim. Bunu <code class=\"language-java\">CommandLineRunner<\/code> kullanarak yapabiliriz. Ana uygulama s\u0131n\u0131f\u0131n\u0131zda a\u015fa\u011f\u0131daki kodu ekleyerek uygulama ba\u015flang\u0131c\u0131nda veritaban\u0131n\u0131 doldurabilirsiniz:<\/p>\n<pre><code class=\"language-java\">\npackage com.example.pagination;\n\nimport com.example.pagination.entity.Product;\nimport com.example.pagination.service.ProductService;\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.annotation.Bean;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.stream.IntStream;\n\n@SpringBootApplication\npublic class PaginationApplication {\n\n    public static void main(String[] args) {\n        SpringApplication.run(PaginationApplication.class, args);\n    }\n\n    @Bean\n    public CommandLineRunner initData(ProductService productService) {\n        return args -> {\n            if (productService.getAllProducts(Pageable.unpaged()).isEmpty()) {\n                List<Product> products = new ArrayList<>();\n                IntStream.range(1, 101).forEach(i ->\n                    products.add(new Product(null, \"Product \" + i, \"Description for Product \" + i, 10.0 * i, 100 - i))\n                );\n                productService.saveAllProducts(products);\n                System.out.println(\"100 \u00fcr\u00fcn veritaban\u0131na eklendi.\");\n            }\n        };\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra, Postman, Insomnia veya do\u011frudan taray\u0131c\u0131n\u0131zdan a\u015fa\u011f\u0131daki URL'leri kullanarak test edebilirsiniz:<\/p>\n<ul>\n<li><code class=\"language-http\">http:\/\/localhost:8080\/api\/products<\/code>: Varsay\u0131lan sayfa (0. sayfa, 20 eleman)<\/li>\n<li><code class=\"language-http\">http:\/\/localhost:8080\/api\/products?page=0&size=5<\/code>: \u0130lk sayfa, 5 eleman<\/li>\n<li><code class=\"language-http\">http:\/\/localhost:8080\/api\/products?page=2&size=10&sort=name,desc<\/code>: \u00dc\u00e7\u00fcnc\u00fc sayfa, 10 eleman, isme g\u00f6re tersten s\u0131ral\u0131<\/li>\n<li><code class=\"language-http\">http:\/\/localhost:8080\/api\/products?page=1&size=15&sort=price,asc<\/code>: \u0130kinci sayfa, 15 eleman, fiyata g\u00f6re s\u0131ral\u0131<\/li>\n<\/ul>\n<p>API yan\u0131t\u0131, <code class=\"language-java\">Page<\/code> nesnesinin t\u00fcm metadatalar\u0131n\u0131 i\u00e7erecektir:<\/p>\n<pre><code class=\"language-json\">\n{\n  \"content\": [\n    \/\/ 5 adet Product nesnesi\n  ],\n  \"pageable\": {\n    \"pageNumber\": 0,\n    \"pageSize\": 5,\n    \"sort\": {\n      \"empty\": false,\n      \"sorted\": true,\n      \"unsorted\": false\n    },\n    \"offset\": 0,\n    \"paged\": true,\n    \"unpaged\": false\n  },\n  \"last\": false,\n  \"totalPages\": 20,\n  \"totalElements\": 100,\n  \"size\": 5,\n  \"number\": 0,\n  \"sort\": {\n    \"empty\": false,\n    \"sorted\": true,\n    \"unsorted\": false\n  },\n  \"first\": true,\n  \"numberOfElements\": 5,\n  \"empty\": false\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u015fekilde, Spring Boot uygulaman\u0131zda sayfalama \u00f6zelli\u011fini ba\u015far\u0131yla entegre etmi\u015f olursunuz. G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, Spring Data JPA ve Spring MVC'nin sa\u011flad\u0131\u011f\u0131 otomatik d\u00f6n\u00fc\u015ft\u00fcrme yetenekleri sayesinde olduk\u00e7a az kodla bu karma\u015f\u0131k g\u00f6r\u00fcnen \u00f6zelli\u011fi hayata ge\u00e7irebiliriz.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131: Sayfalama Uygulamalar\u0131nda Dikkat Edilmesi Gerekenler Nelerdir?<\/h2>\n<p>Temel sayfalama uygulamas\u0131n\u0131 ba\u015far\u0131yla kurduktan sonra, ger\u00e7ek d\u00fcnya projelerinde kar\u015f\u0131la\u015fabilece\u011finiz daha karma\u015f\u0131k senaryolara ve dikkat etmeniz gereken \u00f6nemli noktalara de\u011finelim. Sadece veriyi sayfalamak yeterli olmayabilir; bu veriyi filtrelemek, aramak ve performans\u0131 optimize etmek gibi ihtiya\u00e7lar da ortaya \u00e7\u0131kacakt\u0131r.<\/p>\n<h3>Filtreleme ve Arama ile Sayfalama<\/h3>\n<p>\u00c7o\u011fu uygulamada, kullan\u0131c\u0131lar sadece t\u00fcm veriyi de\u011fil, belirli kriterlere uyan veriyi sayfalayarak g\u00f6rmek isterler. \u00d6rne\u011fin, ad\u0131 \"Laptop\" i\u00e7eren \u00fcr\u00fcnleri veya fiyat\u0131 belirli bir aral\u0131kta olan \u00fcr\u00fcnleri listelemek. Spring Data JPA, bu t\u00fcr senaryolar i\u00e7in \u00e7e\u015fitli esnek \u00e7\u00f6z\u00fcmler sunar:<\/p>\n<ol>\n<li><strong>Metod Ad\u0131 Sorgular\u0131:<\/strong> En basit haliyle, repository aray\u00fcz\u00fcne <code class=\"language-java\">findByProductNameContaining(String name, Pageable pageable)<\/code> gibi metodlar ekleyebilirsiniz. Spring Data JPA, metod ad\u0131ndan sorguyu otomatik olarak t\u00fcretir.<\/li>\n<li><strong><code class=\"language-java\">JpaSpecificationExecutor<\/code>:<\/strong> Daha karma\u015f\u0131k ve dinamik sorgular i\u00e7in <code class=\"language-java\">JpaSpecificationExecutor<\/code> aray\u00fcz\u00fcn\u00fc repository'nize ekleyebilirsiniz. Bu, criteria API kullanarak dinamik filtreleme ko\u015fullar\u0131 olu\u015fturman\u0131za olanak tan\u0131r ve bu ko\u015fullar\u0131 <code class=\"language-java\">findAll(Specification<T> spec, Pageable pageable)<\/code> metoduna ge\u00e7irebilirsiniz. Bu y\u00f6ntem, bir\u00e7ok filtre kombinasyonunun oldu\u011fu senaryolar i\u00e7in olduk\u00e7a g\u00fc\u00e7l\u00fcd\u00fcr.<\/li>\n<li><strong><code class=\"language-java\">QueryDsl<\/code> veya <code class=\"language-java\">Criteria API<\/code> Do\u011frudan Kullan\u0131m\u0131:<\/strong> Baz\u0131 durumlarda, Spring Data JPA'n\u0131n sa\u011flad\u0131\u011f\u0131 soyutlamalar yeterli gelmeyebilir. Bu durumda, QueryDSL gibi sorgu olu\u015fturucular veya JPA'n\u0131n kendi Criteria API'sini do\u011frudan kullanarak tamamen \u00f6zel ve optimize edilmi\u015f sorgular yazabilir, ard\u0131ndan bu sorgular\u0131n sonu\u00e7lar\u0131n\u0131 manuel olarak sayfalayabilirsiniz.<\/li>\n<\/ol>\n<p>Controller taraf\u0131nda, filtreleme ve arama parametrelerini <code class=\"language-java\">@RequestParam<\/code> ile al\u0131p servis katman\u0131na ileterek bu filtreleri uygulayabilirsiniz:<\/p>\n<pre><code class=\"language-java\">\n@GetMapping(\"\/search\")\npublic ResponseEntity<Page<Product>> searchProducts(\n        @RequestParam(required = false) String name,\n        @RequestParam(required = false) Double minPrice,\n        Pageable pageable) {\n    \/\/ Servis katman\u0131nda bu parametreleri kullanarak filtreleme ve sayfalama yap\u0131s\u0131 kurulur.\n    \/\/ \u00d6rn: Specification kullanarak dinamik sorgu olu\u015fturma.\n    Page<Product> products = productService.findProductsByCriteria(name, minPrice, pageable);\n    return ResponseEntity.ok(products);\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Performans Optimizasyonlar\u0131<\/h3>\n<p>Sayfalama, do\u011fas\u0131 gere\u011fi performans\u0131 art\u0131rmay\u0131 hedefler ancak yanl\u0131\u015f implementasyonlar ciddi performans sorunlar\u0131na yol a\u00e7abilir. Dikkat edilmesi gerekenler:<\/p>\n<ul>\n<li><strong>N+1 Sorgu Problemi:<\/strong> Sayfalama yaparken s\u0131kl\u0131kla kar\u015f\u0131la\u015f\u0131lan bir problem, bir ana varl\u0131k listesini \u00e7ektikten sonra, her bir varl\u0131k i\u00e7in ili\u015fkili alt varl\u0131klar\u0131 ayr\u0131 ayr\u0131 \u00e7ekmeye \u00e7al\u0131\u015fmakt\u0131r. Bu, N adet (sayfa boyutu kadar) ekstra sorguya neden olur. Bu sorunu \u00e7\u00f6zmek i\u00e7in <code class=\"language-java\">@EntityGraph<\/code> annotasyonu veya <code class=\"language-java\">JOIN FETCH<\/code> sorgu ipu\u00e7lar\u0131 kullan\u0131lmal\u0131d\u0131r.<\/li>\n<li><strong>Veritaban\u0131 \u0130ndeksleri:<\/strong> S\u0131ralama (sort) veya filtreleme (where clause) yapt\u0131\u011f\u0131n\u0131z alanlarda uygun veritaban\u0131 indekslerinin bulundu\u011fundan emin olun. \u0130ndeksler olmadan, b\u00fcy\u00fck veri setlerinde sorgular \u00e7ok yava\u015f \u00e7al\u0131\u015fabilir.<\/li>\n<li><strong>B\u00fcy\u00fck Offset De\u011ferleri:<\/strong> Geleneksel <code class=\"language-sql\">LIMIT X OFFSET Y<\/code> tabanl\u0131 sayfalama, <code class=\"language-sql\">OFFSET<\/code> de\u011feri \u00e7ok b\u00fcy\u00fcd\u00fc\u011f\u00fcnde performans sorunlar\u0131 ya\u015fayabilir. \u00c7\u00fcnk\u00fc veritaban\u0131, <code class=\"language-sql\">OFFSET<\/code>'ten \u00f6nceki t\u00fcm kay\u0131tlar\u0131 yine de i\u015flemek zorunda kal\u0131r. \u00c7ok b\u00fcy\u00fck veri setlerinde ve ileri sayfalarda performans d\u00fc\u015f\u00fc\u015f\u00fc g\u00f6zlemlenebilir.<\/li>\n<\/ul>\n<h3>\u00d6zel Sayfalama (Custom Pagination) \u0130htiya\u00e7lar\u0131<\/h3>\n<p>Baz\u0131 ileri d\u00fczey senaryolarda, geleneksel sayfalama modeli yeterli olmayabilir:<\/p>\n<ul>\n<li><strong>Cursor-Based Pagination (Anahtar K\u00fcmesi Sayfalama):<\/strong> \u00c7ok b\u00fcy\u00fck veri setlerinde ve \u00f6zellikle ak\u0131\u015f (feed) tarz\u0131 uygulamalarda <code class=\"language-sql\">OFFSET<\/code>'in performans sorunlar\u0131n\u0131 a\u015fmak i\u00e7in kullan\u0131l\u0131r. Bu y\u00f6ntemde, bir sonraki sayfan\u0131n nerede ba\u015flayaca\u011f\u0131n\u0131 g\u00f6steren bir \"cursor\" (genellikle bir ID veya zaman damgas\u0131) kullan\u0131l\u0131r. \u00d6rne\u011fin, \"ID'si 12345'ten b\u00fcy\u00fck olan sonraki 10 \u00f6\u011feyi getir\" \u015feklinde sorgular yap\u0131l\u0131r. Bu, veritaban\u0131n\u0131n daha az kay\u0131t taramas\u0131n\u0131 sa\u011flar ve daha tutarl\u0131 performans sunar. Spring Data JPA do\u011frudan desteklemese de, \u00f6zel repository metodlar\u0131 veya QueryDSL ile implemente edilebilir.<\/li>\n<li><strong>Infinite Scrolling (Sonsuz Kayd\u0131rma):<\/strong> Kullan\u0131c\u0131 kayd\u0131rd\u0131k\u00e7a yeni verilerin y\u00fcklenmesi prensibine dayan\u0131r. Asl\u0131nda bu da sayfalama kullan\u0131r, ancak aray\u00fczde sayfa numaralar\u0131 yerine \"Daha Fazla Y\u00fckle\" butonu veya otomatik y\u00fckleme mekanizmas\u0131 bulunur. Backend taraf\u0131nda ayn\u0131 sayfalama API'lar\u0131 kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<h3>Frontend ile Entegrasyon ve API Yan\u0131t\u0131<\/h3>\n<p>Spring Boot API'n\u0131zdan d\u00f6nen <code class=\"language-java\">Page<\/code> nesnesi, frontend uygulamalar\u0131 (React, Angular, Vue.js veya mobil uygulamalar) i\u00e7in olduk\u00e7a zengin bilgi i\u00e7erir. Frontend geli\u015ftiricisi, <code class=\"language-json\">content<\/code> dizisini do\u011frudan listeleyebilir, <code class=\"language-json\">totalPages<\/code> ve <code class=\"language-json\">totalElements<\/code> ile sayfalama kontrolleri olu\u015fturabilir, <code class=\"language-json\">number<\/code>, <code class=\"language-json\">first<\/code>, <code class=\"language-json\">last<\/code> gibi alanlar\u0131 kullanarak \"\u00d6nceki\/Sonraki Sayfa\" butonlar\u0131n\u0131n durumunu y\u00f6netebilir.<\/p>\n<p>API yan\u0131t\u0131n\u0131n mobil uyumlu olmas\u0131 do\u011frudan backend'in i\u015fi de\u011fildir; ancak backend'in sundu\u011fu veri yap\u0131s\u0131, frontend'in mobil uyumlu bir aray\u00fcz olu\u015fturmas\u0131n\u0131 kolayla\u015ft\u0131rmal\u0131d\u0131r. Frontend geli\u015ftiricileri, ald\u0131klar\u0131 sayfalama verilerini k\u00fc\u00e7\u00fck ekranlara uygun \u015fekilde (\u00f6rne\u011fin, daha az sayfa numaras\u0131 g\u00f6sterme, kayd\u0131rmal\u0131 pagination kontrolleri) d\u00fczenlemek i\u00e7in CSS medya sorgular\u0131 (<code class=\"language-css\">@media<\/code>) kullan\u0131r. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-css\">\n\/* Genel sayfalama stili *\/\n.pagination {\n  display: flex;\n  justify-content: center;\n  padding: 20px;\n}\n\n\/* K\u00fc\u00e7\u00fck ekranlar i\u00e7in \u00f6zel stil *\/\n@media (max-width: 768px) {\n  .pagination {\n    flex-wrap: wrap; \/* Sayfa numaralar\u0131n\u0131 alt alta s\u0131\u011fd\u0131r *\/\n  }\n  .pagination-item {\n    margin: 5px; \/* Butonlar aras\u0131nda daha fazla bo\u015fluk *\/\n  }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u015fekilde, backend'in sa\u011flam bir sayfalama API'si sunmas\u0131, frontend'in farkl\u0131 cihazlarda kullan\u0131c\u0131 dostu bir deneyim sa\u011flamas\u0131n\u0131n \u00f6n\u00fcn\u00fc a\u00e7ar. Ger\u00e7ek d\u00fcnya senaryolar\u0131nda bu detaylara dikkat etmek, uygulaman\u0131z\u0131n \u00f6l\u00e7eklenebilirli\u011fini ve kullan\u0131labilirli\u011fini art\u0131racakt\u0131r.<\/p>\n<h2>\u0130leri D\u00fczey \u0130pu\u00e7lar\u0131 ve P\u00fcf Noktalar\u0131: Sayfalama Deneyiminizi Nas\u0131l Geli\u015ftirebilirsiniz?<\/h2>\n<p>Temel ve ger\u00e7ek d\u00fcnya senaryolar\u0131n\u0131 ele ald\u0131ktan sonra, Spring Boot'taki sayfalama implementasyonunuzu daha da ileriye ta\u015f\u0131yacak baz\u0131 ipu\u00e7lar\u0131 ve p\u00fcf noktalar\u0131na g\u00f6z atal\u0131m. Bu teknikler, uygulaman\u0131z\u0131n daha sa\u011flam, esnek ve performansl\u0131 olmas\u0131na yard\u0131mc\u0131 olabilir.<\/p>\n<h3>Varsay\u0131lan Sayfalama De\u011ferleri ve Global Ayarlar<\/h3>\n<p>Her controller metodunda <code class=\"language-java\">Pageable<\/code> parametresini kullanmak harika olsa da, varsay\u0131lan sayfa boyutu veya s\u0131ralama kriterleri gibi de\u011ferleri global olarak ayarlamak isteyebilirsiniz. Spring Data Web, bu t\u00fcr ayarlar\u0131 kolayca yapman\u0131z\u0131 sa\u011flar. <code class=\"language-properties\">application.properties<\/code> dosyas\u0131nda a\u015fa\u011f\u0131daki gibi ayarlamalar yapabilirsiniz:<\/p>\n<pre><code class=\"language-properties\">\n# Varsay\u0131lan sayfa boyutu\nspring.data.web.pageable.default-page-size=10\n# Maksimum izin verilen sayfa boyutu\nspring.data.web.pageable.max-page-size=100\n# Sayfa numaralar\u0131n\u0131n 0'dan m\u0131 yoksa 1'den mi ba\u015flayaca\u011f\u0131n\u0131 ayarlar (varsay\u0131lan 0)\nspring.data.web.pageable.one-indexed-parameters=false\n<\/pre>\n<p><\/code><\/p>\n<p>Ayr\u0131ca, belirli bir <code class=\"language-java\">Pageable<\/code> parametresi i\u00e7in \u00f6zel varsay\u0131lanlar tan\u0131mlamak isterseniz, controller metodunuzda <code class=\"language-java\">@PageableDefault<\/code> annotasyonunu kullanabilirsiniz:<\/p>\n<pre><code class=\"language-java\">\nimport org.springframework.data.web.PageableDefault;\n\/\/ ...\n@GetMapping\npublic ResponseEntity<Page<Product>> getAllProducts(\n        @PageableDefault(size = 15, sort = \"name\", direction = Sort.Direction.ASC) Pageable pageable) {\n    Page<Product> products = productService.getAllProducts(pageable);\n    return ResponseEntity.ok(products);\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu, API t\u00fcketicisinin her zaman <code class=\"language-java\">size<\/code> ve <code class=\"language-java\">sort<\/code> parametrelerini belirtme zorunlulu\u011funu ortadan kald\u0131r\u0131rken, ayn\u0131 zamanda esnekli\u011fi korur.<\/p>\n<h3>N+1 Sorgu Problemine Kar\u015f\u0131 Etkili \u00c7\u00f6z\u00fcmler<\/h3>\n<p>Daha \u00f6nce bahsetti\u011fimiz N+1 sorgu problemi, ili\u015fkisel veritabanlar\u0131 ile \u00e7al\u0131\u015f\u0131rken s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan bir performans darbo\u011faz\u0131d\u0131r. Spring Data JPA ve Hibernate ile bu sorunu \u00e7\u00f6zmek i\u00e7in birka\u00e7 g\u00fc\u00e7l\u00fc mekanizma bulunur:<\/p>\n<ul>\n<li><strong><code class=\"language-java\">@EntityGraph<\/code>:<\/strong> Bu annotasyon, Spring Data JPA repository metodlar\u0131n\u0131zda belirli ili\u015fkileri <code class=\"language-java\">FETCH JOIN<\/code> ile hemen y\u00fcklemenizi sa\u011flar. Bu, ana sorgu ile birlikte ili\u015fkili varl\u0131klar\u0131 da tek bir sorguda getirerek N+1 problemini ortadan kald\u0131r\u0131r.<\/li>\n<\/ul>\n<pre><code class=\"language-java\">\npublic interface OrderRepository extends JpaRepository<Order, Long> {\n    @EntityGraph(attributePaths = {\"orderItems\"}) \/\/ Order ile birlikte OrderItem'lar\u0131 da getir\n    Page<Order> findAll(Pageable pageable);\n}\n<\/pre>\n<p><\/code><\/p>\n<ul>\n<li><strong><code class=\"language-java\">JOIN FETCH<\/code> ile JPQL Sorgular\u0131:<\/strong> \u00d6zel bir JPQL (Java Persistence Query Language) sorgusu yazarken <code class=\"language-java\">JOIN FETCH<\/code> anahtar kelimesini kullanarak da ili\u015fkili varl\u0131klar\u0131 eagerly load edebilirsiniz.<\/li>\n<\/ul>\n<pre><code class=\"language-java\">\npublic interface OrderRepository extends JpaRepository<Order, Long> {\n    @Query(\"SELECT o FROM Order o JOIN FETCH o.orderItems\")\n    Page<Order> findAllWithItems(Pageable pageable);\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu y\u00f6ntemleri do\u011fru \u015fekilde kullanarak, sayfalama yaparken performans kay\u0131plar\u0131n\u0131 minimize edebilirsiniz.<\/p>\n<h3>G\u00fcvenlik ve Yetkilendirme ile Sayfalama<\/h3>\n<p>Sayfalama API'lar\u0131n\u0131z\u0131 tasarlarken g\u00fcvenlik ve yetkilendirmeyi g\u00f6z ard\u0131 etmemek \u00f6nemlidir. T\u00fcm kullan\u0131c\u0131lar\u0131n t\u00fcm verilere eri\u015fmesi gerekmeyebilir. \u00d6rne\u011fin, bir y\u00f6netici t\u00fcm \u00fcr\u00fcnleri g\u00f6rebilirken, normal bir kullan\u0131c\u0131 sadece kendi ekledi\u011fi \u00fcr\u00fcnleri g\u00f6rebilir. Bu t\u00fcr senaryolar\u0131 Spring Security ile kolayca entegre edebilirsiniz:<\/p>\n<ul>\n<li><strong>Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC):<\/strong> <code class=\"language-java\">@PreAuthorize(\"hasRole('ADMIN')\")<\/code> gibi annotasyonlarla controller metodlar\u0131n\u0131za eri\u015fim k\u0131s\u0131tlamalar\u0131 getirebilirsiniz.<\/li>\n<li><strong>Kullan\u0131c\u0131 Bazl\u0131 Filtreleme:<\/strong> Servis katman\u0131nda, mevcut kullan\u0131c\u0131n\u0131n kimli\u011fini alarak (\u00f6rne\u011fin <code class=\"language-java\">SecurityContextHolder.getContext().getAuthentication().getName()<\/code>) sayfalama sorgular\u0131na ek filtreler ekleyebilirsiniz. Bu, kullan\u0131c\u0131n\u0131n yaln\u0131zca yetkili oldu\u011fu veriyi g\u00f6rmesini sa\u011flar.<\/li>\n<\/ul>\n<p>Bu ileri d\u00fczey ipu\u00e7lar\u0131 ve g\u00fcvenlik yakla\u015f\u0131mlar\u0131, Spring Boot uygulaman\u0131zdaki sayfalama \u00f6zelli\u011fini sadece i\u015flevsel k\u0131lmakla kalmay\u0131p, ayn\u0131 zamanda daha g\u00fcvenli, esnek ve y\u00f6netilebilir hale getirecektir. Unutmay\u0131n, iyi tasarlanm\u0131\u015f bir sayfalama stratejisi, uygulaman\u0131z\u0131n genel kalitesini do\u011frudan etkiler.<\/p>\n<h2>Sonu\u00e7: Spring Boot Sayfalama ile Geli\u015fmi\u015f Uygulamalar<\/h2>\n<p>Bu makale boyunca, Spring Boot projelerinde sayfalama (pagination) uygulaman\u0131n temel prensiplerinden ba\u015flayarak, ad\u0131m ad\u0131m kurulumunu ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda kar\u015f\u0131la\u015f\u0131labilecek ileri d\u00fczey yakla\u015f\u0131mlar\u0131 detayl\u0131 bir \u015fekilde inceledik. G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, Spring Data JPA'n\u0131n sa\u011flad\u0131\u011f\u0131 <code class=\"language-java\">Pageable<\/code> ve <code class=\"language-java\">Page<\/code> aray\u00fczleri sayesinde, b\u00fcy\u00fck veri k\u00fcmelerini y\u00f6netmek, API yan\u0131t s\u00fcrelerini optimize etmek ve kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirmek olduk\u00e7a kolayd\u0131r. N+1 sorgu problemi gibi yayg\u0131n performans sorunlar\u0131na kar\u015f\u0131 \u00e7\u00f6z\u00fcmler, filtreleme ve s\u0131ralama gibi dinamik gereksinimlere y\u00f6nelik yakla\u015f\u0131mlar ve g\u00fcvenlik entegrasyonu, uygulaman\u0131z\u0131n \u00f6l\u00e7eklenebilirli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131rman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p>Sayfalama, sadece bir teknik detay olmaktan \u00f6te, modern uygulamalar\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. Do\u011fru implemente edildi\u011finde, hem geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r hem de son kullan\u0131c\u0131ya ak\u0131c\u0131 ve verimli bir deneyim sunar. Umuyoruz ki bu rehber, Spring Boot projelerinizde sayfalama \u00f6zelliklerini g\u00fcvenle ve etkin bir \u015fekilde uygulaman\u0131z i\u00e7in size sa\u011flam bir temel sa\u011flam\u0131\u015ft\u0131r. Bu bilgileri uygulamalar\u0131n\u0131zda kullanarak, daha performansl\u0131 ve kullan\u0131c\u0131 dostu sistemler geli\u015ftirebilirsiniz. Ba\u015far\u0131l\u0131 geli\u015ftirme ser\u00fcveninizde bu bilgilerin size yol g\u00f6stermesini dileriz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. Spring Boot'ta sayfalama kullanmak neden \u00f6nemlidir?<\/strong><\/p>\n<p>B\u00fcy\u00fck veri k\u00fcmelerini tek seferde y\u00fcklemek, hem sunucu kaynaklar\u0131n\u0131 a\u015f\u0131r\u0131 t\u00fcketir hem de istemci taraf\u0131nda yava\u015flamaya ve k\u00f6t\u00fc bir kullan\u0131c\u0131 deneyimine neden olur. Sayfalama, veriyi k\u00fc\u00e7\u00fck par\u00e7alara b\u00f6lerek bu sorunlar\u0131 \u00e7\u00f6zer, performans\u0131 art\u0131r\u0131r ve kullan\u0131c\u0131lar\u0131n veriler aras\u0131nda daha kolay gezinmesini sa\u011flar.<\/p>\n<p><strong>2. <code class=\"language-java\">Pageable<\/code> ve <code class=\"language-java\">Page<\/code> aras\u0131ndaki fark nedir?<\/strong><\/p>\n<p><code class=\"language-java\">Pageable<\/code>, hangi sayfan\u0131n, ka\u00e7 elemanla ve hangi s\u0131ralama d\u00fczenine g\u00f6re getirilece\u011fini tan\u0131mlayan bir input nesnesidir. <code class=\"language-java\">Page<\/code> ise, <code class=\"language-java\">Pageable<\/code> kriterlerine g\u00f6re veritaban\u0131ndan getirilen sayfalama sonu\u00e7lar\u0131n\u0131 (eleman listesi, toplam eleman say\u0131s\u0131, toplam sayfa say\u0131s\u0131 gibi metadatalar) i\u00e7eren bir output nesnesidir.<\/p>\n<p><strong>3. Varsay\u0131lan sayfa boyutu ve sayfa numaras\u0131 nas\u0131l ayarlan\u0131r?<\/strong><\/p>\n<p>Varsay\u0131lan sayfa boyutu (<code class=\"language-java\">default-page-size<\/code>) ve maksimum sayfa boyutu (<code class=\"language-java\">max-page-size<\/code>) gibi ayarlar <code class=\"language-properties\">application.properties<\/code> dosyas\u0131nda <code class=\"language-properties\">spring.data.web.pageable<\/code> \u00f6n ekiyle yap\u0131land\u0131r\u0131labilir. Ayr\u0131ca, controller metodunda <code class=\"language-java\">@PageableDefault<\/code> annotasyonu ile de varsay\u0131lan de\u011ferler belirlenebilir.<\/p>\n<p><strong>4. N+1 sorgu problemi nedir ve Spring Boot'ta nas\u0131l \u00e7\u00f6z\u00fcl\u00fcr?<\/strong><\/p>\n<p>N+1 sorgu problemi, bir ana varl\u0131k listesi \u00e7ekildikten sonra, her bir varl\u0131k i\u00e7in ili\u015fkili alt varl\u0131klar\u0131n ayr\u0131 ayr\u0131 sorgularla getirilmesi durumudur. Bu, N adet ekstra sorguya neden olur. Spring Boot'ta <code class=\"language-java\">@EntityGraph<\/code> annotasyonu veya JPQL sorgular\u0131nda <code class=\"language-java\">JOIN FETCH<\/code> kullanarak ili\u015fkili verileri tek bir sorguda eagerly load ederek bu sorun \u00e7\u00f6z\u00fclebilir.<\/p>\n<p><strong>5. Cursor-based pagination nedir ve ne zaman kullan\u0131lmal\u0131d\u0131r?<\/strong><\/p>\n<p>Cursor-based pagination, geleneksel <code class=\"language-sql\">LIMIT\/OFFSET<\/code> tabanl\u0131 sayfalama yerine, bir sonraki sayfan\u0131n nerede ba\u015flayaca\u011f\u0131n\u0131 belirten bir \"cursor\" (genellikle bir ID veya zaman damgas\u0131) kullanarak veriyi \u00e7eker. <code class=\"language-sql\">OFFSET<\/code> de\u011feri \u00e7ok b\u00fcy\u00fcd\u00fc\u011f\u00fcnde olu\u015fan performans sorunlar\u0131n\u0131 a\u015fmak i\u00e7in, \u00f6zellikle \u00e7ok b\u00fcy\u00fck veri setleriyle \u00e7al\u0131\u015fan ak\u0131\u015f (feed) tarz\u0131 uygulamalarda tercih edilir.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"B\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken performans sorunlar\u0131 m\u0131 ya\u015f\u0131yorsunuz? Spring Boot projelerinizde sayfalama (pagination) uygulayarak verimlili\u011fi nas\u0131l art\u0131raca\u011f\u0131n\u0131z\u0131, kullan\u0131c\u0131&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-34367","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Spring Boot&#039;ta Etkili Sayfalama (Pagination) Nas\u0131l Yap\u0131l\u0131r?<\/title>\n<meta name=\"description\" content=\"B\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken performans sorunlar\u0131 m\u0131 ya\u015f\u0131yorsunuz? Spring Boot projelerinizde sayfalama (pagination) uygulayarak verimlili\u011fi nas\u0131l art\u0131raca\u011f\u0131n\u0131z\u0131, kullan\u0131c\u0131 deneyimini nas\u0131l iyile\u015ftirece\u011finizi ve API \u00e7a\u011fr\u0131lar\u0131n\u0131z\u0131 nas\u0131l optimize edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Bu kapsaml\u0131 rehber, temel kavramlardan ileri d\u00fczey tekniklere kadar her \u015feyi i\u00e7eriyor.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring Boot&#039;ta Etkili Sayfalama (Pagination) Nas\u0131l Yap\u0131l\u0131r?\" \/>\n<meta property=\"og:description\" content=\"B\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken performans sorunlar\u0131 m\u0131 ya\u015f\u0131yorsunuz? Spring Boot projelerinizde sayfalama (pagination) uygulayarak verimlili\u011fi nas\u0131l art\u0131raca\u011f\u0131n\u0131z\u0131, kullan\u0131c\u0131 deneyimini nas\u0131l iyile\u015ftirece\u011finizi ve API \u00e7a\u011fr\u0131lar\u0131n\u0131z\u0131 nas\u0131l optimize edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Bu kapsaml\u0131 rehber, temel kavramlardan ileri d\u00fczey tekniklere kadar her \u015feyi i\u00e7eriyor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-15T17:01:06+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Spring Boot&#8217;ta Etkili Sayfalama (Pagination) Nas\u0131l Yap\u0131l\u0131r?\",\"datePublished\":\"2025-11-15T17:01:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/\"},\"wordCount\":3276,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/\",\"name\":\"Spring Boot'ta Etkili Sayfalama (Pagination) Nas\u0131l Yap\u0131l\u0131r?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-15T17:01:06+00:00\",\"description\":\"B\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken performans sorunlar\u0131 m\u0131 ya\u015f\u0131yorsunuz? Spring Boot projelerinizde sayfalama (pagination) uygulayarak verimlili\u011fi nas\u0131l art\u0131raca\u011f\u0131n\u0131z\u0131, kullan\u0131c\u0131 deneyimini nas\u0131l iyile\u015ftirece\u011finizi ve API \u00e7a\u011fr\u0131lar\u0131n\u0131z\u0131 nas\u0131l optimize edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Bu kapsaml\u0131 rehber, temel kavramlardan ileri d\u00fczey tekniklere kadar her \u015feyi i\u00e7eriyor.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Spring Boot&#8217;ta Etkili Sayfalama (Pagination) Nas\u0131l Yap\u0131l\u0131r?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Spring Boot'ta Etkili Sayfalama (Pagination) Nas\u0131l Yap\u0131l\u0131r?","description":"B\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken performans sorunlar\u0131 m\u0131 ya\u015f\u0131yorsunuz? Spring Boot projelerinizde sayfalama (pagination) uygulayarak verimlili\u011fi nas\u0131l art\u0131raca\u011f\u0131n\u0131z\u0131, kullan\u0131c\u0131 deneyimini nas\u0131l iyile\u015ftirece\u011finizi ve API \u00e7a\u011fr\u0131lar\u0131n\u0131z\u0131 nas\u0131l optimize edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Bu kapsaml\u0131 rehber, temel kavramlardan ileri d\u00fczey tekniklere kadar her \u015feyi i\u00e7eriyor.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/","og_locale":"tr_TR","og_type":"article","og_title":"Spring Boot'ta Etkili Sayfalama (Pagination) Nas\u0131l Yap\u0131l\u0131r?","og_description":"B\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken performans sorunlar\u0131 m\u0131 ya\u015f\u0131yorsunuz? Spring Boot projelerinizde sayfalama (pagination) uygulayarak verimlili\u011fi nas\u0131l art\u0131raca\u011f\u0131n\u0131z\u0131, kullan\u0131c\u0131 deneyimini nas\u0131l iyile\u015ftirece\u011finizi ve API \u00e7a\u011fr\u0131lar\u0131n\u0131z\u0131 nas\u0131l optimize edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Bu kapsaml\u0131 rehber, temel kavramlardan ileri d\u00fczey tekniklere kadar her \u015feyi i\u00e7eriyor.","og_url":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-15T17:01:06+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"6 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Spring Boot&#8217;ta Etkili Sayfalama (Pagination) Nas\u0131l Yap\u0131l\u0131r?","datePublished":"2025-11-15T17:01:06+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/"},"wordCount":3276,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/","url":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/","name":"Spring Boot'ta Etkili Sayfalama (Pagination) Nas\u0131l Yap\u0131l\u0131r?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-15T17:01:06+00:00","description":"B\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken performans sorunlar\u0131 m\u0131 ya\u015f\u0131yorsunuz? Spring Boot projelerinizde sayfalama (pagination) uygulayarak verimlili\u011fi nas\u0131l art\u0131raca\u011f\u0131n\u0131z\u0131, kullan\u0131c\u0131 deneyimini nas\u0131l iyile\u015ftirece\u011finizi ve API \u00e7a\u011fr\u0131lar\u0131n\u0131z\u0131 nas\u0131l optimize edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Bu kapsaml\u0131 rehber, temel kavramlardan ileri d\u00fczey tekniklere kadar her \u015feyi i\u00e7eriyor.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/spring-bootta-etkili-sayfalama-pagination-nasil-yapilir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Spring Boot&#8217;ta Etkili Sayfalama (Pagination) Nas\u0131l Yap\u0131l\u0131r?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=34367"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34367\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}