english
Last Modified 2022.10.11

페이징 처리

NumbersForPagination.java
package net.java_school.commons;

public class NumbersForPagination {
  private int prevBlock;
  private int firstPage;
  private int lastPage;
  private int nextBlock;
  private int totalPage;
  private int listItemNo;
  private int startRecord;
  private int endRecord;

  public int getPrevBlock() {
    return prevBlock;
  }
  public void setPrevBlock(int prevBlock) {
    this.prevBlock = prevBlock;
  }
  public int getFirstPage() {
    return firstPage;
  }
  public void setFirstPage(int firstPage) {
    this.firstPage = firstPage;
  }
  public int getLastPage() {
    return lastPage;
  }
  public void setLastPage(int lastPage) {
    this.lastPage = lastPage;
  }
  public int getNextBlock() {
    return nextBlock;
  }
  public void setNextBlock(int nextBlock) {
    this.nextBlock = nextBlock;
  }
  public int getTotalPage() {
    return totalPage;
  }
  public void setTotalPage(int totalPage) {
    this.totalPage = totalPage;
  }
  public int getListItemNo() {
    return listItemNo;
  }
  public void setListItemNo(int listItemNo) {
    this.listItemNo = listItemNo;
  }
  public int getStartRecord() {
    return startRecord;
  }
  public void setStartRecord(int startRecord) {
    this.startRecord = startRecord;
  }
  public int getEndRecord() {
    return endRecord;
  }
  public void setEndRecord(int endRecord) {
    this.endRecord = endRecord;
  }
}
Paginator.java
/*
 * ----------------Design--------------------------------------------
 * [First] [Prev] 11 12 13 14 15 16 17 18 19 20 [Next] [Last]
 *
 * ----------------Numbers for pagination--------------------------------------
 * [First] -- 1
 * [Prev]  -- prevBlock
 * 11      -- firstPage (within current block)
 * 20      -- lastPage (within current block)
 * [Next]  -- nextBlock
 * [Last]  -- totalPage (totalPage is equal to the final page number)
 *
 * -----------------Number for design-------------------------------------
 * listItemNo  -- The number to append to the first item in the list (Not persistent data)
 *
 * ------------------Numbers for fetch query-------------------
 * startRecord -- First record number on the current page
 * endRecord   -- Last record number on the current page
 */
package net.java_school.commons;

import java.util.List;

public interface Paginator {

  public int getTotalRecordCount(String searchWord);

  public List<?> getItems(String searchWord, int startRecord, int endRecord);

  public default NumbersForPagination getNumbersForPagination(int totalRecordCount, int page, int recordsPerPage, int pagesPerBlock) {

    NumbersForPagination numbers = new NumbersForPagination();

    int totalPage = totalRecordCount / recordsPerPage;
    if (totalRecordCount % recordsPerPage != 0) totalPage++;

    int totalBlock = totalPage / pagesPerBlock;
    if (totalPage % pagesPerBlock != 0) totalBlock++;

    int block = page / pagesPerBlock;
    if (page % pagesPerBlock != 0) block++;

    int firstPage = (block - 1) * pagesPerBlock + 1;
    int lastPage = block * pagesPerBlock;

    int prevBlock = 0;
    if (block > 1) prevBlock = firstPage - 1;

    int nextBlock = 0;
    if (block < totalBlock) nextBlock = lastPage + 1;
    if (block >= totalBlock) lastPage = totalPage;

    int listItemNo = totalRecordCount - (page - 1) * recordsPerPage;
    int startRecord = (page - 1) * recordsPerPage + 1;
    int endRecord = page * recordsPerPage;

    numbers.setPrevBlock(prevBlock);
    numbers.setFirstPage(firstPage);
    numbers.setLastPage(lastPage);
    numbers.setNextBlock(nextBlock);
    numbers.setTotalPage(totalPage);

    numbers.setListItemNo(listItemNo);

    numbers.setStartRecord(startRecord);
    numbers.setEndRecord(endRecord);

    return numbers;
  }
}

사용 방법

@Controller
public class HomeController implements Paginator {

  @Autowired
  private SomeService service;

  @Override
  public int getTotalRecordCount(String searchWord) {
    return service.getTotalRecordCount(searchWord);
  }

  @Override
  public List<Item> getItems(String searchWord, int startRecord, int endRecord) {
    return service.getItems(searchWord, startRecord, endRecord);
  }

  @GetMapping("/")
  public String index(Integer page, String searchWord, Model model) {
    if (page == null) return "redirect:/?page=1";

    //1. Get total record count (A total of the number of records)
    int totalRecordCount = getTotalRecordCount(searchWord);

    //2. Get numbers for pagination
    int recordsPerPage = 4;
    int pagesPerBlock = 10;
    NumbersForPagination numbers = 
      getNumbersForPagination(totalRecordCount, page, recordsPerPage, pagesPerBlock);

    //3. Get items to list on the page
    List<Item> items = 
      getItems(searchWord, numbers.getStartRecord(), numbers.getEndRecord());

    model.addAttribute("items", items);
    model.addAttribute("prevBlock", numbers.getPrevBlock());
    model.addAttribute("nextBlock", numbers.getNextBlock());
    model.addAttribute("firstPage", numbers.getFirstPage());
    model.addAttribute("lastPage", numbers.getLastPage());
    model.addAttribute("totalPage", numbers.getTotalPage());

    return "index";
  }
}
관련 글