페이징(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 를 해서 말이야.. 게시글이 몇 개씩 안 나오고 그랬어.. 그게.... 낭만이지......!
'기술 > Spring-Boot' 카테고리의 다른 글
JPA에서의 페이징 기법, 빠를까? (0) | 2021.12.23 |
---|---|
[QueryDSL/SpringBoot] Gradle에서의 QueryDSL 설정 (0) | 2021.12.10 |
@Autowired는 왜 별로일까? (0) | 2021.11.28 |
의존성 주입(DI)이 뭘까? (0) | 2021.11.28 |
@Controller는 뭘까? (0) | 2021.11.26 |
댓글