Spring 페이징

춤인형의 개발일지·2025년 1월 8일

Spring

목록 보기
3/8

25/01/08

페이징

웹 사이트에서 페이지(1p, 2p)를 구성할 때 만드는 방법

1. Pageable

@GetMapping("/todos")
    public Page<Todo> getAll(Pageable pageable){
        return todoRepository.findAll(pageable);
    }

❓여러개의 Request Param을 받고 싶으면?

@GetMapping("/todos")
    public Page<Todo> getAll(
    @RequestParam(required = false) String keyword, 
    Pageable pageable){
        return todoRepository.findAll(pageable);
    }

이런식으로 작성해주면 된다.
🧐 근데! 보통은 1페이지가 첫페이지 아닌가? 하지만 위 코드를 실행해보면 page=0일때만 실행된다.

page=1

 @GetMapping("/todos2")
    public Page<Todo> getAll2(
            @RequestParam(required = false) String keyword,
            //기본 페이지는 1이니까
            @RequestParam(defaultValue = "1") int page){
        Pageable pageable = PageRequest.of(page-1, 10);
        return todoRepository.findAll(pageable);
    }

page라는 변수를 만들고 기본값이 1로 만들어준다.
Pageable은 0부터 시작이니까 page를 -1해줘야 사용자가 1로 입력해줘도 Pageable은 0부터 인식하게 된다.

pageRequest.of(시작점, 마지막점)
여기에 하드코딩으로 10이라고 들어가있다. 하드코딩은 좋지 않기 때문에 변수를 하나 더 받아준다.

 @GetMapping("/todos2")
    public Page<Todo> getAll2(
            @RequestParam(required = false) String keyword,
            //기본 페이지는 1이니까
            @RequestParam(defaultValue = "1") int page,
            @RequestParam(defaultValue = "10") int size){
        Pageable pageable = PageRequest.of(page-1, size);
        return todoRepository.findAll(pageable);
    }

size는 한 페이지 안에 보여주는 객체의 개수이다.

근데! Entity는 사용자가 알면 안되는데?
사용자가 알게 되면, 수정을 할 때도 Entity를 건들이기 때문에 안된다!!

Entity수정

    @GetMapping("/todos2")
    public List<TodoResponse> getAll3(
            @RequestParam(required = false) String keyword,
            @RequestParam(defaultValue = "1") int page,
            @RequestParam(defaultValue = "10") int size){
        Pageable pageable = PageRequest.of(page-1, size);
       return todoRepository.findAll(pageable)
                .getContent()
                .stream()
                .map(todo -> new TodoResponse(todo.getContent(),todo.getId())).toList();
    }

늘 하던것 처럼 만들어준다.
getContent().stream()을 사용하던 방식은 get()으로 축약할 수 있다.

        return todoRepository.findAll(pageable)
                .get()
                .map(todo -> new TodoResponse(todo.getContent(),todo.getId())).toList();

0개의 댓글