JPA를 이용한 페이징 처리

zhzkzhffk·2022년 5월 13일
1

community-board

목록 보기
3/3

페이징 처리 전

  • 페이징이 되지 않기 때문에 데이터베이스에 등록된 순서대로 html에 뿌려지는 것을 볼 수 있습니다.

페이징 처리 후

기존 HomeController 클래스

@Controller
@RequiredArgsConstructor
public class HomeController {

    private final BoardService boardService;

    @RequestMapping
    public String home(Model model) {
        model.addAttribute("boards", boardService.findAll());
        return "index";
    }
}

기존 BoardService 클래스

@RequiredArgsConstructor
@Service
@Transactional(readOnly = true)
public class BoardService {

     public List<Board> findAll() {
        return boardRepository.findAll();
    }

}

페이징 처리 진행

  • Pagable은 파라미터 바인딩 형식
    • page: 검색을 원하는 페이지 번호
    • size : 한 페이지의 조회할 게시물 개수
    • sort : 정렬 방식을 나타냅니다. 예) 속성명, DESC or ASC

BoardService 클래스에 페이징 기능 추가

@RequiredArgsConstructor
@Service
@Transactional(readOnly = true)
public class BoardService {

     public Page<Board> findAll(Pageable pageable) {
        return boardRepository.findAll(pageable);
    }

}

HomeController 클래스

@Controller
@RequiredArgsConstructor
public class HomeController {

    private final BoardService boardService;

    @RequestMapping
    public String home(Model model, @PageableDefault(size = 5, sort = "id", direction = Sort.Direction.DESC) Pageable pageable) {
        
        Page<Board> boards = boardService.findAll(pageable);
        int startPage = Math.max(0, boards.getPageable().getPageNumber() - 4);
        int endPage = Math.min(boards.getTotalPages(), boards.getPageable().getPageNumber() + 4);
        model.addAttribute("boards", boards);
        model.addAttribute("startPage", startPage);
        model.addAttribute("endPage", endPage);
        return "index";
    }
}
  • Get 요청이 들어오면 Pagable을 기반으로 BoardService에서 findAll 메서드 진행
  • Page<T> 변수는 total, content, pagagble을 가지고 있다.
    • content: 원하는 데이터가 담김
    • pagable: 정렬 방식, 현재 페이지 정보, size(페이지당 보여지는 정보)

index.html

<nav aria-label="Page navigation example">
    <ul class="pagination">
        <li class="page-item" th:classappend="${1 == boards.pageable.pageNumber + 1} ? 'disabled' : '' ">
            <a class="page-link" th:href="@{/(page=${boards.pageable.pageNumber - 1})}">Previous</a>
        </li>
        <li class="page-item" th:classappend="${i == boards.pageable.pageNumber + 1} ? 'active' : '' " th:each="i : ${#numbers.sequence(startPage, endPage)}">
            <a class="page-link" th:href="@{/(page=${i - 1})}" th:text="${i}">1</a>
        </li>
        <li class="page-item" th:classappend="${boards.totalPages == boards.pageable.pageNumber + 1} ? 'disabled' : '' ">
            <a class="page-link" th:href="@{/(page=${boards.pageable.pageNumber + 1})}">Next</a>
        </li>
    </ul>
</nav>
  • th:classappend="${1 == boards.pageable.pageNumber + 1} ? 'disabled' → 첫 번째 페이지일 때 Previous 링크 'disaled'

  • th:classappend="${boards.totalPages == boards.pageable.pageNumber + 1} ? 'disabled' → 마지막 페이지일 때 Previous 링크 'disaled'

profile
Backend Developer

0개의 댓글