페이징 (Pageable) 하는 법

coding S's avatar
Mar 20, 2024
페이징 (Pageable) 하는 법

[ 일단 순서대로 접근하자 ]

notion image

notion image
JPARepository를 사용할 때 페이징 처리를 구현하려면 Pageable 인터페이스를 사용한다. 보면, findAll 메소드에 Pageable과 Page<T> 라고 나와있지요? (Pageable 객체 클릭해서 들어가면 나올 듯) 이 Pageable은 JPA에서 제공하는 인터페이스로, 페이징 및 정렬 정보를 캡슐화하여 전달한다. 즉, Pageable 객체를 메소드에 매개변수로 전달하면, Spring Data JPA는 이 정보를 바탕으로 적절한 페이징 쿼리를 생성해주는 것!
 

[ offset / fetch 조회 확인 ]

notion image
notion image
해당 코드를 실행해서 쿼리문을 살펴보면 offset과 fetch, ? 가 있다. PageRequest.of(page, size) 으로 들어가게 되는데, 여기서 page는 현재 페이지(0부터 시작), size는 페이지 당 데이터 수를 의미한다. (+sort도 함께 지정 가능) * offset은 건너뛸 행의 수를 나타내며, (page * size)로 계산함. * fetch는 가져올 행의 수, 즉 페이지 당 데이터 수(size) -> 이걸 알아서 계산해주기 때문에 이 [ ? ] 사이에 뭐 넣을지만 알면 페이지 끝! (원래는 내가 페이징 계산했는데...)
 

[ 페이징 테스트 코드 ]

@Test public void findAll_paging_test() throws JsonProcessingException { //given Sort sort = Sort.by(Sort.Direction.DESC, "id"); Pageable pageable = PageRequest.of(0, 2, sort); //when Page<User> userPG = userJPARepository.findAll(pageable); //then ObjectMapper om = new ObjectMapper(); String json = om.writeValueAsString(userPG); System.out.println(json); }
💡
objectMapper = 자바 클래스를 json으로 바꾸는 것
💡
어떤 결과 값을 볼 때에는 JSON으로 보는게 제일 좋다 (기억하라) 때문에 json으로 바꿔서 보는 것!
 

[ 콘솔창에 나온 결과 값 ]

{"content":[{"id":3,"username":"love","password":"1234","email":"love@nate.com","createdAt":1710724782972},{"id":2,"username":"cos","password":"1234","email":"cos@nate.com","createdAt":1710724782972}],"pageable":{"pageNumber":0,"pageSize":2,"sort":{"empty":false,"sorted":true,"unsorted":false},"offset":0,"paged":true,"unpaged":false},"last":false,"totalPages":2,"totalElements":3,"size":2,"number":0,"sort":{"empty":false,"sorted":true,"unsorted":false},"first":true,"numberOfElements":2,"empty":false}

[ 해당 값을 제이슨 뷰어로 확인 ]

https://jsonviewer.stack.hu/
notion image
💡
해당 결과값 제이슨 뷰어로 pageable객체 생긴거 확인하기 → 다 계산해주네!
 

[ 값 꺼낼 때는 어떻게? ]

notion image
username을 꺼내고 싶다 그러면 꺼낼 때는 userPG.getContent.username~ 이런 식으로 꺼내면 될 듯 하다.
 

[ 우리가 페이징에서 알아야 할 것 ] → 이것만 알면 됨!

notion image
* first, last 현재 페이지가 첫 페이지(or 마지막 페이지)인지 확인. 첫 페이지(or 마지막 페이지)라면 true, 아니라면 false를 반환 * number 현재 페이지가 몇 페이지인지 알려줌 페이지 번호는 0부터 시작하므로, number 값이 0이라면 이는 첫 번째 페이지임을 의미 * totalPages 전체 페이지 수. 전체 데이터를 현재 설정된 페이지 사이즈로 나누었을 때 몇 페이지가 필요한지 알려줌 * totalElements 전체 데이터의 수. 페이징 처리 없이 해당 쿼리를 실행했을 때 반환되는 전체 데이터 항목의 수 * size 한 페이지에 표시되는 데이터의 수
💡
content에 정보가 있으니 여기에 접근… 당연히 해야함!
 
Share article

codingb