반응형

이번 프로젝트에서 페이지 단위로 데이터를 불러오는 API를 구현해야 했다.

 

QueryDSL로 구현했으면 아마 .offset으로 만들었겠지만, 이번 프로젝트의 목표는 QueryDSL 사용하지 않기! 이기 때문에 최대한 JPA로 만들어보자

 

검색을 해보니 그냥 Pageable를 사용하면 된다고 한다.

Pageable pageable = PageRequest.of(page - 1, size);

일단 Pageable class에 PageRequest.of(페이지 번호, 한페이지 당 사이즈);로 인터페이스를 생성해준다.

그리고 그냥 findAll()의 Parameter로 넘겨주면 끝이다.

참고로 페이징은 0부터 시작하기 때문에 페이지 번호 -1을 해준 것이다.

 

techPostRepository.findAll(pageable);

생각했던 것보다 훨씬 간단했다.

 

하지만 문제가 있었다.

이렇게 해서 Swagger에서 확인을 해보니 원하는 순서로 출력이 되지 않았다.

 

내 생각대로라면 가장 나중에 작성된 글부터 가져와야 하는데, 가장 먼저 작성된 글부터 불러와졌다.

보면 id가 1인 글부터 불러와지는 것을 볼 수 있다.

 

어차피 이 글들은 나중에 저장된 글의 id가 점점 커지기 때문에 id로 desc 정렬을 해야했다.

찾아보니 이 부분도 Pageable로 해결할 수 있었다.

 

Sort sort = Sort.by(Sort.Direction.DESC, "id");

어떤 Column을 어떻게 정렬할 것인지를 Sort 인스턴스로 생성한다.

 

그리고 이걸 

Pageable pageable = PageRequest.of(page - 1, size, sort);

Pageable의 마지막 parameter에 넣어주고 이걸 다시 findAll에 넣어주기만 하면 된다.

 

JPA의 paging도 생각보다 쉬워서 앞으로도 자주 사용할 것 같다.

 

그렇게 작성해서 사용한 코드이다.

public Page<TechPostEntity> getTechPostEntitiesWithPaging(int page, int size){
        return techPostRepository.findAll(PageRequest.of(
                page - 1, size, Sort.by(Sort.Direction.DESC, "id")
                ));
    }

'블로그 개발 프로젝트' 카테고리의 다른 글

Swagger Response  (0) 2023.07.28
CORS Error  (0) 2023.07.28
JPA TopBy  (0) 2023.07.24
@ManyToOne, @OneToMany  (0) 2023.07.24
Swagger 작성  (0) 2023.07.24

+ Recent posts