본문 바로가기
기술/Spring-Boot

JPA에서 쓰는 페이징(Paging) 기법이 뭘까?

by Zabee52 2021. 12. 9.

페이징(Paging)

가끔 궁금한 생각이 들었을 것이다. 커뮤니티의 게시판이나, 구글의 검색 결과는 페이지로 구분이 되는데, 이건 어떤 원리로 동작하는걸까? 라는 궁금증 말이다. 한 걸음 더 나아가서, 이런 기능들을 개발자들이 많이 원하고 있는데, 과연 스프링부트에서 지원하지 않고 있을까? DB에서 지원하지 않고 있을까? 하는 생각을 품어본 적이 있을 것이다. 나도 그랬다. 그래서 찾아보니 실제로 이 기능을 지원해주고 있었다. 이게 바로 페이징(Paging) 이다.

 

우선, 지원하는 페이징이 아니라 실제 페이징은 어떻게 구현되고 있는지를 알아야 이해하는데 도움이 될 것이다.

기본적으로 페이징이라는 것은, 데이터베이스에 한정된 양의 레코드를 요청하는 것을 말한다. 전체를 찾되, 정해진 양 만큼만 찾도록 요청하는 것이다. 하지만 이 동작을 수행하는 것만으로 페이징이라고 할 수 있을까?

일반적으로 정상적으로 동작하는 페이징은 정돈 되어있는 데이터를 대상으로 할 때 유효하다. 연관성이 높든가, 날짜순으로 주든가, 조회수가 높든가.....

마구잡이로 들어가있는 데이터뭉치를 가져올 땐 올바른 방식으로 정리하는 과정이 필요하다는 것이다. 물론 나도 설명은 이렇게 했지만, 정돈된 데이터의 어떤 기준을 줄 수는 없다. 개인의 판단에 따라 지혜롭게 잘 헤쳐나가야 하는 부분이 되겠다.

 

 

이론은 여기까지 설명하기로 하고, 간략하게 예시를 들어보겠다.

// Service
public Page<Product> getProducts(Long userId, int page, int size, String sortBy, boolean isAsc) {
	Sort.Direction direction = isAsc ? Sort.Direction.ASC : Sort.Direction.DESC;
	Sort sort = Sort.by(direction, sortBy);
	Pageable pageable = PageRequest.of(page, size, sort);

	return productRepository.findAllByUserId(userId, pageable);
}

기본적으로 JPA에서 페이징을 사용할 때의 양식은 Page 클래스에 출력하고자 하는 클래스를 제네릭 타입으로 지정해주고, findAll 메소드를 정의해줄 때 Pageable을 파라미터로 넣어주면 된다.

// Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
    Page<Product> findAllByUserId(Long userId, Pageable pageable);
}

Pageable의 생성자 구성은 다음과 같다.

Pageable pageable = PageRequest.of(page, size, sort);
/*
	page : 몇 페이지인지.
	size : 한 페이지당 몇 개의 레코드를 보여줄 것인지.
	sort : 정렬 기준으로 삼을 컬럼.
    
	sort 양식
	Sort.by("기준Column").
    	.descending() // 기본값은 오름차순. .descending() 명시할 시 내림차순.
    	.and(Sort
        	.by("name")) // 정렬 2차 기준도 만들 수 있음.
*/

정렬같은 경우는 종류가 꽤 된다. 나는 간략하게 설명하고자 하는 글이기 때문에 상세한 정보는 공식 문서를 찾아보면 되겠다.

 

나 때는..... 이런 식으로 자동으로 페이징 해주는게 없어서... size / page 를 해서 말이야.. 게시글이 몇 개씩 안 나오고 그랬어.. 그게.... 낭만이지......!

댓글