해결된 질문
작성
·
1.5K
0
안녕하세요, 영한님!
jpa 페이징 api를 이용해서 간단한 페이징 화면을 구현해 봤는데 잘못된 부분이 있는지
궁금해서 질문드립니다!
<memberList.html>
<div class="pagination">
<span th:each="pageNum : ${pageList}" th:inline="text">
<a th:href="@{'/members?page=' + ${pageNum}}">[[${pageNum}]] </a>
</span>
</div>
컨트롤러에서 받아온 pageList를 뿌려주고 특정 페이지를 누르면 해당 페이지로 이동하게 만들었습니다.
<MemberRepository.java>
// 전체 회원 조회
public List<Member> findAll(int page) {
return em.createQuery("select m from Member m order by m.id desc", Member.class)
.setFirstResult((page-1) * 10)
.setMaxResults(10)
.getResultList();
}
// 전체 게시물의 개수 (100개)
public int boardCount() {
return em.createQuery("select m from Member m", Member.class).getResultList().size();
}
페이지 별로 10개씩 끊어서 가져오는 메서드와 페이지 수를 구하기 위해 전체 게시물의 개수를 구하는 메서드 2개를 추가했습니다.
<MemberService.java>
// 페이지 별 회원 조회
public List<Member> findMembers(int page) {
return memberRepository.findAll(page);
}
// 페이지의 개수
public int[] pageList() {
int totalPage = memberRepository.boardCount() / 10;
totalPage = ((memberRepository.boardCount() % 10) == 0) ? totalPage : totalPage + 1;
int[] pages = new int[totalPage];
for(int i = 0; i < totalPage; i++) {
pages[i] = i + 1;
}
return pages;
}
findMembers(page) : 페이지에 해당하는 멤버 리스트를 조회
pageList() : 전체 페이지의 개수 리턴
<MemberController.java>
@GetMapping("/members")
// 처음 리스트를 들어가면 Page 번호는 1번이 디폴트!
public String list(Model model, @RequestParam(value = "page", defaultValue = "1") int pageNum) {
List<Member> members = memberService.findMembers(pageNum); // 페이지 번호 별 게시물
int[] pages = memberService.pageList(); // 페이지 개수
model.addAttribute("members", members);
model.addAttribute("pageList", pages);
return "members/memberList";
}
@RequestParam을 이용해서 처음 /members를 실행한 경우 1번 페이지를 출력하게 만들었고,
페이지 별 멤버리스트와 전체 페이지의 개수를 model에 담아서 화면쪽으로 넘겨서 구현했습니다.
잘못 구현하거나 고칠 부분이 있는 지 궁금합니다..!
아래는 결과화면 입니다!
답변 1
0
안녕하세요, 에러나면짖는개 님. 공식 서포터즈 codesweaver 입니다.
.
웹 입문할때 가장 난해한 것중 하나인 페이징을 직접 작성해보셨군요. 대단합니다.
의도한 대로 페이지가 작동한다면 그건 잘 구현한 코드이지요.
첨언을 드리자면, 페이징 처리시 가장 무거운 부분이 바로 전체 Row수를 구하는 쿼리 입니다. memberRepository.boardCount() 메서드가 되겠네요. 현재 코드의 MemberService 에서 페이지를 계산할때 이 메서드를 두번 호출하고 있는데, 가급적 한번만 호출하여 그 값을 변수에 담아놓고 재활용하시는것이 좋습니다.
그리고 추가적인 기능이 더 필요한데, 한번에 보여질 페이지가 1번 부터 10번까지 10개라고 하고, 총 페이지가 25개 정도라고 하면, 10번 이상의 페이지를 넘어갔을때의 처리가 필요합니다. MemberService의 pageList() 에 있는 반복문의 시작점을 0이 아닌 적당한 수로 바꾸어 주면 좋겠지요. (가령 고객이 15번째 페이지를 보고 있다면 페이지의 시작은 11부터 20까지를 표시해줘야 합니다)
.
감사합니다.
자세한 피드백 정말 감사드립니다!!
말씀해주신 부분은 수정해서 고쳐봐야겠네요 ㅎㅎ