import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
public interface QuestionRepository extends JpaRepository<Question, Integer> {
//-- 페이징을 위한 로직 --//
Page<Question> findAll(Pageable pageable);
createDate
를 입력해 생성 날짜 기준으로 정령하도록 했다.@Service
@RequiredArgsConstructor
public class QuestionService {
private final QuestionRepository questionRepository;
//-- paging X --//
public List<Question> getList() {
return this.questionRepository.findAll();
}
//-- paging --//
public Page<Question> getList(int page) {
List<Sort.Order> sorts = new ArrayList<>();
sorts.add(Sort.Order.desc("createDate"));
Pageable pageable = PageRequest.of(page, 10, Sort.by(sorts));
return this.questionRepository.findAll(pageable);
}
@Controller
@RequestMapping("/question")
@RequiredArgsConstructor
public class QuestionController {
private final QuestionService questionService;
//-- Get 방식으로 페이징 적용 --//
@GetMapping("/list")
public String list(
@RequestParam(defaultValue = "0") int page,
Model model
) {
Page<Question> paging = this.questionService.getList(page);
model.addAttribute("paging", paging);
return "question_list";
}
항목 | 설명 |
---|---|
paging.isEmpty | 페이지 존재 여부 (게시물이 있으면 false, 없으면 true) |
paging.totalElements | 전체 게시물 개수 |
paging.totalPages | 전체 페이지 개수 |
paging.size | 페이지당 보여줄 게시물 개수 |
paging.number | 현재 페이지 번호 |
paging.hasPrevious | 이전 페이지 존재 여부 |
paging.hasNext | 다음 페이지 존재 여부 |
지금까지 만들고 서버를 실행시켜보면 정상적으로 페이징 된것을 확인할 수 있다.
그리고 url 에 직접 page 파라미터를 입력하면 다른 페이지로 이동되는 것도 확인할 수 있다.
이제 web 계층에서 url 이 아닌 ui 를 통해서 더욱 편하게 페이지를 이동하는 기능을 구현해야 한다.
li
에서 작동된다.li
는 이전 버튼에 대한 로직li
는 페이지 번호에 대한 로직li
는 다음 버튼에 대한 로직th:classappend="조건식 ? 클래스값”
<!-- 페이징 처리 시작 -->
<div th:if="${!paging.isEmpty()}">
<ul class="pagination justify-content-center">
<li class="page-item" th:classappend="${!paging.hasPrevious()} ? 'disabled'">
<a class="page-link"
th:href="@{|?page=${paging.number-1}|}">
<span>이전</span>
</a>
</li>
<li th:each="page: ${#numbers.sequence(0, paging.totalPages-1)}"
th:if="${page >= paging.number-5 and page <= paging.number+5}"
th:classappend="${page == paging.number} ? 'active'"
class="page-item">
<a th:text="${page}" class="page-link" th:href="@{|?page=${page}|}"></a>
</li>
<li class="page-item" th:classappend="${!paging.hasNext} ? 'disabled'">
<a class="page-link" th:href="@{|?page=${paging.number+1}|}">
<span>다음</span>
</a>
</li>
</ul>
</div>
<!-- 페이징 처리 종료-->
페이징 기능 | 코드 |
---|---|
이전 페이지가 없으면 비활성화 | th:classappend="${!paging.hasPrevious} ? 'disabled'" |
다음 페이지가 없으면 비활성화 | th:classappend="${!paging.hasNext} ? 'disabled'" |
이전 페이지 링크 | th:href="@{ |
다음 페이지 링크 | th:href="@{ |
페이지 리스트 루프 | th:each="page: ${#numbers.sequence(0, paging.totalPages-1)}" |
현재 페이지와 같으면 active 적용 | th:classappend="${page == paging.number} ? 'active'" |
#numbers.sequence(시작, 끝)