본문 바로가기
Spring

[Spring/JPA] Spring Boot + JPA 페이징

by noddu 2025. 12. 11.
728x90
반응형
문제 발생
@GetMapping("/users")
    public ResponseEntity<List<UserDto>> getUsers() {
        Page<List> users = userRepository.findAll();
        Page<UserDto> list = users.stream().map(user -> new UserDto(user.getUserId(),
                        user.getPassword(), user.getEmail(), user.getNickname(), user.getRoles(),
                        user.getOauth_provider(), user.getCreatedAt(), user.getUpdatedAt()));
        return ResponseEntity.ok(list);
    }

데이터가 많을 시 그 모든 리스트를 리턴할 수 없으니 페이징이 필요

 

 

Spring Data JPA는 페이징을 기본 지원
Page<T> findAll(Pageable pageable);

찾아보니 JpaRepository 를 상속하고 있다면 findAll에 매개변수를 추가해 별도의 구현 없이 바로 사용 가능하다.

 

 

반응형

 

 

Controller에서 Pageable 받아 사용하기

스프링 MVC는 Pageable 타입을 컨트롤러 파라미터로 선언하면 쿼리 스트링을 자동으로 분석하여 페이징 정보를 만들어 준다.

 

 

예제 코드
@GetMapping("/users")
public ResponseEntity<Page<UserDto>> getUsers(Pageable pageable) {
    Page<User> page = userRepository.findAll(pageable);
    Page<UserDto> userList = page.map(user -> new UserDto(user.getUserId(),
                    user.getPassword(), user.getEmail(), user.getNickname(), user.getRoles(),
                    user.getOauth_provider(), user.getCreatedAt(), user.getUpdatedAt()));
    return ResponseEntity.ok(userList);
}

Pageable 타입 매개변수를 포함한 findAll(pageable)로 Page타입의 User을 받고 map() 메서드를 사용해 UserDto로 다시 변경

이전 코드에서 변한것이 거의 없음!

 

 

자동으로 지원되는 QueryString

/users?page=0&size=10&sort=createdAt,desc 이런식으로 쿼리스트링으로 원하는 요청만하면 페이징과 정렬을 제어할 수 있다.

  • page: 페이지 번호 (0부터 시작)
  • size: 페이지 당 데이터 개수
  • sort: 정렬 기준 (필드명, asc/desc)

 

api.get('/api/admin/users');

아무 쿼리스트링 설정하지 않았을 때 전체 데이터가 2개라 2개 뿐

기본 페이지 사이즈는 설정하지 않으면 자동으로 20으로 설정됨

 

api.get('/api/admin/users?page=0&size=1&sort=createdAt,desc')

총 2개중 1개만 가져오게 쿼리를 설정하니 totalPages: 2개로 되는것을 볼 수 있다

 

 

728x90

 

정리

Spring Data JPA는 별도의 복잡한 코드 없이 Pageable + Page 조합만으로 페이징 기능을 매우 간단하게 제공

✔ Page: 페이징 정보 + 데이터

✔ Repository: Page<T> findAll(Pageable pageable)
✔ Controller: Pageable 파라미터로 자동 주입
✔ QueryString: page, size, sort 자동 처리

반응형