웹공부/SPRING

페이지네이션

Rabet 2024. 12. 17. 10:48

 

- 참조 링크

https://docs.spring.io/spring-data/jpa/reference/jpa/query-methods.html

 

JPA Query Methods :: Spring Data JPA

By default, Spring Data JPA uses position-based parameter binding, as described in all the preceding examples. This makes query methods a little error-prone when refactoring regarding the parameter position. To solve this issue, you can use @Param annotati

docs.spring.io

 

- repository/NewsRepository.java

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
@Repository
public interface NewsRepository extends JpaRepository<News, Long>{
    Page<News> findAll(Pageable pageable);
}

 

- controller/NewsController.java

  • @RequestParam(0부터)로 page를 int page에 넣겠다.
  • Pageable pageable = PageRequest.of(page:현재페이지, 몇개 페이지)
  • 리스폰스로 pageable찾기
  • hasNext, hasPrev는 이전과 다음의 존재여부
    // 페이지네이션
    @GetMapping("/list")
    public String getNewsList(Model model,
                              @RequestParam(name = "page", defaultValue = "0") int page) {
        Pageable pageable = PageRequest.of(page, 5);
        Page<News> newsPage = newsRepository.findAll(pageable);
        model.addAttribute("newsPage", newsPage);

        model.addAttribute("prev", pageable.previousOrFirst().getPageNumber());
        model.addAttribute("next", pageable.next().getPageNumber());
        model.addAttribute("hasNext", newsPage.hasNext());
        model.addAttribute("hasPrev", newsPage.hasPrevious());
        return "news/list";
    }

 

- resources/templates/news/list.mustache

{{>layouts/header}}
<div class="container mt-4">
    <ul class="list-group">
        {{#newsPage.content}}
            <li class="list-group-item">
                <h4 class="mb-2"><a href="/news/{{newsId}}">제목 : {{title}}</a></h4>
                <small class="text-muted">News ID: {{newsId}}</small>
            </li>
        {{/newsPage.content}}
        <br>
        <a href="/news/new">Create News</a>
        <ul class="pagination justify-content-center">
            {{#hasPrev}}
                <a class="page-link" href="?page={{prev}}">Previous</a>
            {{/hasPrev}}
            {{#hasNext}}
                <a class="page-link" href="?page={{next}}">Next</a>
            {{/hasNext}}
        </ul>
    </ul>
</div>
{{>layouts/footer}}