Java/Spring

[Spring] java 메모리에 존재하는 list 데이터 페이징 처리

SeungbeomKim 2025. 2. 12. 18:30

 

프로그램 실행 중에만 존재하는 메모리 데이터에서의 Pagination은 JPA에서 제공하는 Page 객체를 활용하지 못하고, 페이징 처리를 위한 로직을 별도로 구현해줘야 합니다.

 

그래서 DB 조회 없이 메모리 내에서 List 데이터를 페이징처리 하기 위한 Util Class를 만들어봤습니다. 특정 Type에 의존하지 않고, 다양한 타입을 처리할 수 있도록 제네릭을 활용하였습니다. 

 

 

public class PaginatedList<T> {

    private List<T> list;
    private List<List<T>> listOfPages;
    private int pageSize = 10;
    private int currentPage = 0;

    public PaginatedList(List<T> list, int pageSize) {
        this.list = list;
        this.pageSize = pageSize;
        paginateList();
    }
    
    public List<T> getListOfPageNumber(int pageNumber) {
        if (listOfPages == null || pageNumber > listOfPages.size() || pageNumber < 1) {
            return Collections.emptyList();
        }

        currentPage = pageNumber;
        List<T> page = listOfPages.get(--pageNumber);
        return page;
    }
    
    private void paginateList() {
        if (list == null || listOfPages != null) {
            return;
        }

        if (pageSize <= 0 || pageSize > list.size()) {
            pageSize = list.size();
        }

        int numOfPages = (int) Math.ceil((double) list.size() / (double) pageSize);
        listOfPages = new ArrayList<List<T>>(numOfPages);
        for (int pageNum = 0; pageNum < numOfPages;) {
            int from = pageNum * pageSize;
            int to = Math.min(++pageNum * pageSize, list.size());
            listOfPages.add(list.subList(from, to));
        }
    }
}

 

구성 요소

 

  • List<T> lists: 전체 리스트 데이터
  • List<List<T> listOfPages: lists 데이터를 페이지별로 나눈 데이터 
  • pageSize: 페이징할 사이즈 (10)
  • currentPage: 현재 페이지

 

PaginatedList 생성자 

  • 생성자에서 매개변수로 들어오는 list 데이터와 pageSize를 초기화해주고, 페이징 처리를 위한 메서드 (paginateList) 를 호출합니다. 

 

paginateList 메서드

  • list에 null이 들어오고, listOfPages 필드가 초기화 되었으면 skip 합니다. (이미 페이징 처리가 된 경우)
  • list 크기보다 pageSize가 크면, 하나의 페이지에 표현합니다. 
  • 이후, 전체 List 데이터를 subList 메서드를 통해 from - to로 분할해주고, 각 listOfPages에 추가해 줍니다.

 

List<Data> data = new PaginatedList<>(list, pageSize).getListOfPageNumber(page + 1);
// Paging 처리 및 현재 페이지의 데이터 반환

Pageable pageable = new PageRequest(page, pageSize);

return new PageImpl<>(data, pageable, list.size());

 

이후 Service에서 페이징 Util class를 생성해 준 후 현재 페이지의 데이터를 반환해 줍니다. 그리고, PageImpl 구현체를 이용하여 Page 객체를 반환할 수 있습니다. 

 

<참고 자료>

https://stackoverflow.com/questions/19688235/how-to-implement-pagination-on-a-list

 

How to implement pagination on a list?

Is there any library that can be used to implement paging for a list? Let' assume I have a space of 10 lines, and the user can select if he wants to scroll forward or backward by page (thus +- 10 ...

stackoverflow.com