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() 쿼리도 실행하는 것을 볼 수 있습니다.
728x90
'JPA' 카테고리의 다른 글
상속관계 매핑 전략(@DiscriminatorColumn 란?) (0) | 2022.06.05 |
---|---|
(JPA) Error attempting to apply AttributeConverter 에러 관련 글(feat. @Converter 사용시) (0) | 2022.03.26 |
(스프링 시큐리티)UserDetailsService, UserDetail (0) | 2022.02.17 |
(스프링 데이터 JPA) 페이징과 정렬 (0) | 2022.02.15 |
(Spring data JPA) 쿼리 메소드란? (0) | 2022.02.15 |