Paging(페이지 나누기)

HyeonWoo·2020년 12월 12일
0

스프링 & JPA

목록 보기
11/34
post-thumbnail

이번 장에서는 JPA Paging(페이지 나누기)에 대해서 알아보고자 한다.
Pageable 객체를 사용하면 간단하게 구현할 수 있다.


JPA Paging이란?

프론트에서 전체 사용자 정보를 조회하는 요청이 들어왔다고 가정하자.
Repository에서 findAll() 메서드를 통하여 해당 데이터를 프론트단에게 응답을 내려주면 된다. 하지만 사용자 정보 데이터가 약 만개가 존재한다고 하면
이 만개의 데이터를 한 페이지에 보여주기에는 무리가 있다.
이런 경우에 Pageable 객체를 통하여 간단하게 구현할 수 있다.
findall() 메서드 파라미터에 Pagealbe 또는 Pageable의 구현체인 PageRequest를 넣어주면 된다.

Page< T > findAll(Pageable pageable);

위와 같은 처리를 통하여 페이징 처리를 할 수 있다.

ex)


PageRequest란?

몇 페이지, 한 페이지의 사이즈, Sorting 방법(Option)을 가지고, Repository에 Paging을 요청할 때 사용하는 것.

PageRequest의 구조.


UserController.java

Pageable을 아래와 같이 Controller의 RequestMapping 메서드 인자로 넣어줄 수 있다.

@RestController
public class UserController {
	
    @Autowired
    private UserService userService;
    
    @GetMapping("/users")
    public List<User> search(
    	@PagealbeDefault(sort="id",direction = Sort.Direction.ASC,size=15) Pageable pageable) {
        return userService.search(pageable);
     }
}     

UserService.java

Pageable 인터페이스를 확인해보면 getter는 있지만 setter는 없다.
그래서 PageRequest.of 사용하여 새로운 pageable 객체를 생성한다.

PageRequest.of 메서드의 첫번째 인자는 찾을 page, 두번째 인자는 한페이지의 size를 필수 인자로 받는다.

Pageable의 page는 배열의 index 처럼 0부터 시작이기 때문에 삼항 연산자를 통하여 0보다 작은 값이 들어오면 0으로 초기화 시켜주고, 사용자에게 보여지는 페이지는 1부터 시작하기 때문에 사용자가 보려는 페이지에서 -1 처리를 해준다.


@Service
public class UserService {

    private UserRepository userRepository;
    
    public UserService(UserRepository userRepository) {
    	this.userRepository = userRepository;
    }
    
    public Page<User> search(Pageable pageable) {
    	pageable = PageRequest.of(pageable.getPageNumber() <= 0 ? 0 : pageable.getPageNumber() -1
                , pageable.getPageSize());
        return userRepository.findAll(pageable);
    }
}    

참고자료
https://ivvve.github.io/2019/01/13/java/Spring/pagination_3/ ,
https://velog.io/@conatuseus/JPA-Paging-%ED%8E%98%EC%9D%B4%EC%A7%80-%EB%82%98%EB%88%84%EA%B8%B0-o7jze1wqhj

profile
학습 정리, 자기 개발을 위한 블로그

0개의 댓글