![[Spring/기초] Pageable 자주 사용하지만 관심은 없었던 그 녀석](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FGaxsE%2FbtsOx6ESr3S%2FAAAAAAAAAAAAAAAAAAAAAFAhtZqQeA_-9DzXKeBWum7SYp3qzcgJ62E5LBAnPzGg%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3DCgF2Sz9gwWJKe7zumZq3XcD0wBM%253D)
[Spring/기초] Pageable 자주 사용하지만 관심은 없었던 그 녀석JAVA/JAVA 기초2025. 6. 12. 19:47
Table of Contents
728x90
Paging된 데이터를 만드는 컨트롤러 사용하다보면 Pageable객체를 자주 사용하게 된다.
@GetMapping("/users")
public Page<User> getUsers(Pageable pageable)
그냥 이렇게만 써도, 프론트에서 ?page=0&size=10&sort=name,desc 이런 식으로 요청 보내면
정상적으로 10개씩 name 기준 내림차순으로 잘린 리스트가 반환된다.
근데 Pageable은 인터페이스이다. 우리는 new도 안했고 객체 생성도 안했는데 이건 어디서 구현체를 받아오는걸까?
Pageable & PageRequest
Pageable은 인터페이스 진짜 일하는 녀석은 PageRequest이다.
Pageable pageable = PageRequest.of(0, 10, Sort.by("name").descending());
이는 Spring이 알아서 PageRequest를 넣어준다.
Spring MVC에서 자동으로 처리해준다.
PageableHandlerMehodArgumentResolver 라는 클래스가 요청 파라미터를 읽어서 PageRequest를 만들고 Pageable자리에 넣어준다.
@Override
public Pageable resolveArgument(...) {
String page = webRequest.getParameter("page"); // 0
String size = webRequest.getParameter("size"); // 10
Sort sort = sortResolver.resolveArgument(...); // name,desc
return PageRequest.of(Integer.parseInt(page), Integer.parseInt(size), sort);
}
이걸 보고 컨트롤러 메서드가 호출될 때, 자동으로 Pageable 객체가 만들어져서 들어오는 구조이다.
JPA 맛만 보고가
Jpa를 사용할때 Page 를 사용할수 있다.
Spring Data가 추상화하는 객체라 JPA가 이거를 사용해서 paging을 할수 있는 것이다.
public interface UserRepository extends JpaRepository<User, Long> {
Page<User> findByNameContaining(String name, Pageable pageable);
}
이로인해서 자동으로 JPQL을 아래처럼 JPA가 만든다.
select u from User u where u.name order by u.name desc limit 10 offset 0
이를 Page<T> 객체에 들어가서 총 개수, 총 페이지 수, 현재 페이지 번호, 다음 페이지 여부 같은 메타 데이터를 편하게 반환할수 있는거다.
그냥 편하게 사용하던 객체도 한번쯤 누가 뭘해서 어떻게 되는건지 알아가는것도 재미있다.
728x90
'JAVA > JAVA 기초' 카테고리의 다른 글
[JAVA/기초] LineNumberReader + 1 문제 (2) | 2025.06.26 |
---|---|
[Java/기초] 인텔리제이 javadoc 자동화? (0) | 2025.04.05 |
[Java/기초] Exceptions 총정리 (0) | 2024.07.07 |
[Java/기초] 접근 제한자 (public, protected, default, private) (0) | 2024.04.12 |
[Java/기초] abstract (0) | 2024.03.04 |
@코딩하는 자연대생 :: 자연대생도 코딩을 하고 싶어