[Spring Jpa] @PageableDefault를 이용하여 페이지네이션

김재진·2026년 1월 14일

내일배움캠프

목록 보기
37/70

@PageableDefault에 대해서

  • @PageableDefault는 페이지네이션을 쉽게 할 수 있게 만드는 어노테이션으로 Pageable 객체를 메서드 파라미터로 받을 때 사용됩니다.
  • @PageableDefault 어노테이션의 속성을 지정하여 페이지네이션 기본 속성값을 세팅할 수 있습니다.
    • size : 한 페이지에 표시할 아이템 수
    • page : 현재 페이지 번호(0부터 시작)
    • sort : 정렬 기준이 될 필드와 방향(ASC 또는 DESC)
    • direction : 기본 정렬 방향 (지정된 필드가 없으면 이 속성은 무시)

Controller 코드

@GetMapping("/admin/users")
    public ResponseEntity<Page<GetUserResponse>> getUsers(
            @RequestParam String keyword,
            @PageableDefault Pageable pageable, // 기본값 page = 0, size = 10
            @RequestParam(defaultValue = "1") int page,
            @RequestParam UserStatus status
    ) {
        Pageable converted = PageRequest.of( 
                page - 1,
                pageable.getPageSize(),
                pageable.getSort()
        );

        return ResponseEntity.ok(userService.findAllUsers(keyword, converted, status));
    }

Service 코드

 @Transactional(readOnly = true)
   public Page<GetUserResponse> findAllUsers(String keyword, Pageable pageable, UserStatus status) {

       Page<User> users;

       if (keyword.contains("@")) {
           users = userRepository.findByEmailKeyword(keyword,pageable,status); // pageable 사용
       } else {
           users = userRepository.findByNameKeyword(keyword,pageable,status);
       }

       return users.map(user -> new GetUserResponse(
               user.getId(),
               user.getName(),
               user.getEmail(),
               user.getPhoneNumber(),
               user.getStatus().getStatus(),
               user.getCreatedAt(),
               user.getModifiedAt()
       ));
   }

Repository 코드

public interface UserRepository extends JpaRepository<User,Long> {

   @Query(value = "SELECT u FROM User u " +
           "WHERE (:keyword IS NULL OR u.email = :keyword) " +
           "AND (:status IS NULL OR u.status = :status)")
   Page<User> findByEmailKeyword(String keyword, Pageable pageable, UserStatus status);

   @Query(value = "SELECT u FROM User u " +
           "WHERE (:keyword IS NULL OR u.name = :keyword) " +
           "AND (:status IS NULL OR u.status = :status)")
   Page<User> findByNameKeyword(String keyword, Pageable pageable, UserStatus status);

}

Controller에서 정렬 기준을 Pageable객체에 담아서 Service 및 Repository에서는 Pageable 객체만 담아주면 사용이 가능하다

profile
개발공부 처음해보는 사람

0개의 댓글