JPA

JPA에서 pageable을 통해 Paging 간단하게 구현하는 법

쿠카이든 2022. 3. 22. 17:08
728x90
  • Paging 구현하기

  • 가장 먼저 Controller API 에서 Pageable 인터페이스 타입으로 파라미터를 받으면 되는데요. Pageable는 어떤 인터페이스인지 내부 메소드를 간단하게 보고 가겠습니다.

 

  • 인터페이스가 가진 메소드를 보면 여러가지가 있지만 getPageNumber(), getPageSize(), getOffset() 처럼 페이징을 구현할 때 필요한 값들을 편하게 구할 수 있는 메소드들을 추상화 시켜놓은 것을 볼 수 있습니다. 그래서 이제 시도해보려는 방법은 Spring Data JPA에서 메소드 이름으로 쿼리를 만들 때 페이징을 추가하는 법 입니다. 바로 고고싱!



  • Repository 구현하기
public interface PostRepository extends JpaRepository<Post, Long> {

    Page<Post> findByUserOrderByIdDesc(User user, Pageable pageable);

}
  • 게시글을 조회하기 위해서 위와 같이 User가 작성한 Post(게시글)을 내림차순으로 조회하도록 메소드를 작성하였습니다. 그리고 주목해서 볼 점은 두 번째 파라미터가 Pageable 인터페이스 라는 것을 볼 수 있습니다. 즉, JpaRepository<> 를 사용할 때, findAll() 메서드에 Pageable 인터페이스로 파라미터를 넘기면 페이징을 사용할 수 있습니다. 그리고 반환 타입이 Page 인터페이스라는 것을 알 수 있습니다.

 

  • Page 인터페이스도 내부 메소드를 보면 페이징을 구현할 때 필요한 값들을 getTotalPages(), getTotalElements()와 같은 메소드로 추상화 시켜놓은 인터페이스임을 알 수 있습니다. 그러면 이제 Repository에서 정의한 메소드의 결과 값을 return 받아서 DTO로 변환하는 로직을 담당하는 Service 계층의 코드를 한번 보겠습니다.

 

  • 정리하면 단순하게 map을 사용해서 Post Entity -> PostResponseDTO로 변환해서 Controller로 return 하는 로직입니다.

 

  • 그리고 Controller 로직에서 getContent() 메소드를 사용해서 List<PostResponseDTO>를 반환하도록 수정한 후에 페이징 요청을 해보겠습니다.

 

http://localhost:8080/post?page=0&size=5
  • 위와 같이 API에 Query String 형태로 API를 보내면 위에서 작성한 코드를 기반으로 JPA가 페이징 쿼리를 만들어줍니다.

  • 그래서 실행되는 쿼리를 보면 limit을 통해서 페이징 쿼리를 만들고, 내부적으로 count() 쿼리도 실행하는 것을 볼 수 있습니다.

 

 

출처 : https://devlog-wjdrbs96.tistory.com/414

728x90