인프런 커뮤니티 질문&답변

love zoe님의 프로필 이미지
love zoe

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

페이징

페이징 API를 이용해서 페이징 구현

해결된 질문

작성

·

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까지를 표시해줘야 합니다)

.
감사합니다.

love zoe님의 프로필 이미지
love zoe
질문자

자세한 피드백 정말 감사드립니다!!

말씀해주신 부분은 수정해서 고쳐봐야겠네요 ㅎㅎ

love zoe님의 프로필 이미지
love zoe

작성한 질문수

질문하기