본문 바로가기

Under Construction

Pagination(Pageable)?

반응형

호돌맨의 요절복통 개발쑈~ 를 보면서, JPA를 사용하면서 Pagination을 구현하기 위해, 처음으로 JPA에서 제공하는 Pageable 객체를 알게되었다.

사실 JPA를 제대로? 써본적이 없었기 때문에, Pageable 객체 자체를 처음봤었고, 좀 당황했다. 이전까지는 MyBatis를 사용해서 사용할 일이 없었고, 직접 하나하나 파라미터를 넣고 받아주거나, 혹은 그냥 글로벌적으로 정책을 정해놔서 offSet정도만 파라미터로 받았다. 그래서 Pageable이 인터페이스고... 갑자기 PageRequst등.. 구현체가 나오고, 컨트롤러에 인자로 받으면 자동으로 받아지고... 이런 부분에 대해서 전혀 몰라서, 감이 좀 안잡힌다. 


이 포스팅을 통해서 나는 아래와 같은 점을 알아가고자 한다.

  • Pageable 객체의 용도 및 사용법
  • Pageable을 별도의 어노테이션 없이 인자로 받을 수 있는 이유?
  • @PageableDefault란??

Pageable 객체의 용도와 사용법

  • Pageable은 SpringDataJPA에서 제공되는 기능이다.
  • Pageable 자체는 Interface이며, 이를 구현한 구현체들을 사용한다. 
    • PageRequest
    • QPageRequest(PageRequest와 달리, QSort를 사용한다. querydsl을 사용하기 편하게 만들어둔 구현체로 보인다.' Basic Java Bean implementation of Pageable with support for QueryDSL') 
  • Pageable을 구현한 클래스들은 생성자가 Deprecated되어있고, of()함수로 객체를 생성한다.
  • 인자에는 page,size,sort를 받아 생성, 사용할 수 있다. 

JpaRepository에 Pageable 인자를 넘기면, 굳이 내가 쿼리로 짜지 않아도 된다!

사용법 자체는 크게 어려운것이 없어, 그때그때 찾아보면 될 것같다. 

 

Pageable을 인자로 받기만 해도 되는 이유

대강 다른글들을 보아하니, Springboot 내부에서 자체적으로 처리를 해주는데, argumentResolver를 이용하는것 같다.

argumentResolver.... 예전에 네이버 부스트코스로 처음 스프링MVC를 배울때 들었던 놈인데, 다시한번 리마인드 해보자.

이번 시간엔 컨트롤러의 메소드의 인자값으로 사용자가 임의의 값을 전달할 수 있도록 도와주는 아규먼트 리졸버(Argument Resolver)에 대해 알아보도록 하겠습니다.

그렇다. argumentResolver 자체가 원래 컨트롤러에게 인자값을 전달할수있는 놈이었다... 이런 멍청한.. 그럼 비슷한 원리로 BindingResult를 통한 에러처리도 비슷하게 되지 않을까 싶다 ㅋㅋ

 

그럼 Pageable을 인자로 던지는 ArguemntResolver가 어떤지 확인해보자.

package org.springframework.data.web;


/**
 * Extracts paging information from web requests and thus allows injecting {@link Pageable} instances into controller
 * methods. Request properties to be parsed can be configured. Default configuration uses request parameters beginning
 * with {@link #DEFAULT_PAGE_PARAMETER}{@link #DEFAULT_QUALIFIER_DELIMITER}.
 *
 * @since 1.6
 * @author Oliver Gierke
 * @author Nick Williams
 * @author Mark Paluch
 * @author Christoph Strobl
 */
public class PageableHandlerMethodArgumentResolver extends PageableHandlerMethodArgumentResolverSupport
		implements PageableArgumentResolver {

	private static final SortHandlerMethodArgumentResolver DEFAULT_SORT_RESOLVER = new SortHandlerMethodArgumentResolver();
	private SortArgumentResolver sortResolver;

    .
    .
    .(중간 생략...)
    .
    .

	/*
	 * (non-Javadoc)
	 * @see org.springframework.web.method.support.HandlerMethodArgumentResolver#supportsParameter(org.springframework.core.MethodParameter)
	 */
	@Override
	public boolean supportsParameter(MethodParameter parameter) {
		return Pageable.class.equals(parameter.getParameterType());
	}

	/*
	 * (non-Javadoc)
	 * @see org.springframework.web.method.support.HandlerMethodArgumentResolver#resolveArgument(org.springframework.core.MethodParameter, org.springframework.web.method.support.ModelAndViewContainer, org.springframework.web.context.request.NativeWebRequest, org.springframework.web.bind.support.WebDataBinderFactory)
	 */
	@Override
	public Pageable resolveArgument(MethodParameter methodParameter, @Nullable ModelAndViewContainer mavContainer,
			NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) {

		String page = webRequest.getParameter(getParameterNameToUse(getPageParameterName(), methodParameter));
		String pageSize = webRequest.getParameter(getParameterNameToUse(getSizeParameterName(), methodParameter));

		Sort sort = sortResolver.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory);
		Pageable pageable = getPageable(methodParameter, page, pageSize);

		if (sort.isSorted()) {
			return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort);
		}

		return pageable;
	}
}

supportParameter() 함수로 요청에 Pageable 타입을 확인하고, resolveArgument()로 해당 인자를 컨트롤러로 반환한다! 

(기본적인 ArgumentResolver와 같다.)

 

그런데 내부구현을 디버그를 해봐도 쫓아가기가 힘들다... 일단 여기까지 마무리 짓고, 꾸준히 수정해서 업로드해보잠
refs

https://tecoble.techcourse.co.kr/post/2021-08-15-pageable/

 

Pageable을 이용한 Pagination을 처리하는 다양한 방법

Spring Data JPA에서 Pageable 를 활용한 Pagination 의 개념과 방법을 알아본다.

tecoble.techcourse.co.kr

https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/Pageable.html

 

Pageable (Spring Data Core 2.7.2 API)

 

docs.spring.io

https://ibks-platform.tistory.com/278

 

[Spring Boot] Pageable 커스터마이징하기

안녕하세요. 남산돈가스입니다. 지난 포스팅 [Spring Boot] JPA + Pageable 을 이용한 페이징 처리 에서 마지막 Pageable 커스터마이징에 대한 언급을 했었는데, 이번 포스팅에서 그 내용을 다루어 보려고

ibks-platform.tistory.com

https://www.boostcourse.org/web316/lecture/16806?isDesc=false 

 

웹 프로그래밍(풀스택)

부스트코스 무료 강의

www.boostcourse.org

 

반응형