[Spring] 페이지네이션 1페이지부터 시작하기

류재성's avatar
Mar 04, 2024
[Spring] 페이지네이션 1페이지부터 시작하기
 

1. 페이지네이션 1페이지부터 시작하기

 
BoardController
@GetMapping("/board/listings") public String listings(HttpServletRequest request,@RequestParam(defaultValue = "1")int page) { List<BoardResponse.boardAndUserDTO> responseDTO = boardRepository.findByBoardtbAndUsertb(page); // 회원 테이블에서 개인 기업 구분 List<BoardResponse.boardAndUserDTO> employerList = new ArrayList<>(); for (BoardResponse.boardAndUserDTO dto : responseDTO) { if (dto.isEmployer()) { employerList.add(dto); } } request.setAttribute("employerList", employerList); int currentPage = page; int nextPage = currentPage + 1; int prevPage = currentPage - 1; request.setAttribute("nextPage", nextPage); request.setAttribute("prevPage", prevPage); boolean first = (currentPage == 1 ? true : false); request.setAttribute("first", first); int totalPage = boardRepository.countIsEmployerTrue(); int totalCount = (totalPage % 10 == 0) ? (totalPage / 10) : (totalPage / 10 + 1); boolean last = (currentPage == totalCount); List<Integer> numberList = new ArrayList<>(); int allPage = totalCount ; for (int i = 1; i <= allPage; i++) { numberList.add(i); request.setAttribute("numberList", numberList); } request.setAttribute("last", last); return "/board/listings"; }
 
💡
defaultValue = 1 로 설정.
 
BoardRepository
public List<BoardResponse.boardAndUserDTO> findByBoardtbAndUsertb(int page){ final int COUNT = 10; int value = (page - 1) * COUNT; String q = """ SELECT b.id, b.user_id, b.title, b.content, b.field, b.position, b.salary, b.opening_date, b.closing_date, b.created_at, u.username, u.address, u.is_employer, u.business_name FROM board_tb b INNER JOIN user_tb u ON b.user_id = u.id WHERE u.is_employer = true ORDER BY b.id DESC LIMIT ?,?; """; // 개인 기업 유무 확인을 위해 쿼리에 true false 포함되어있음 Query query = entityManager.createNativeQuery(q); query.setParameter(1,value); query.setParameter(2,COUNT); List<Object[]> results = query.getResultList(); List<BoardResponse.boardAndUserDTO> responseDTO = new ArrayList<>(); for(Object[] result :results){ BoardResponse.boardAndUserDTO dto = new BoardResponse.boardAndUserDTO(); dto.setId((Integer) result[0]); dto.setUserId((Integer) result[1]); dto.setTitle((String) result[2]); dto.setContent((String) result[3]); dto.setField((String) result[4]); dto.setPosition((String) result[5]); dto.setSalary((String) result[6]); dto.setOpeningDate((Timestamp) result[7]); dto.setClosingDate((Timestamp) result[8]); dto.setCreatedAt((Timestamp) result[9]); dto.setUsername((String) result[10]); dto.setAddress((String) result[11]); dto.setEmployer((boolean) result[12]); dto.setBusinessName((String) result[13]); responseDTO.add(dto); } return responseDTO; }
 
💡
int value = (page - 1) * COUNT; 쿼리에서 데이터를 조회할 때 -1 을 해서 0으로 만듬.
 
 
public int countIsEmployerTrue() { String q = """ SELECT COUNT(*) FROM board_tb b INNER JOIN user_tb u ON b.user_id = u.id WHERE u.is_employer = true; """; Query query = entityManager.createNativeQuery(q); Long count = (Long) query.getSingleResult(); return count.intValue(); }
 
💡
DB에서 출력할 데이터 수 조회
 
 
<div class="d-flex justify-content-center"> <ul class="pagination"> <li class="page-item {{#first}}disabled{{/first}}"><a class="page-link" href="?page={{prevPage}}">Previous</a></li> {{#numberList}} <li class="page-item"><a class="page-link" href="?page={{.}}">{{.}}</a></li> {{/numberList}} <li class="page-item {{#last}}disabled{{/last}}"><a class="page-link" href="?page={{nextPage}}">Next</a></li> </ul> </div>
 
notion image
 
💡
전체 11개의 게시글 중 10개 출력. 1페이지부터 시작. 1 페이지에 Previus 비활성화
 
notion image
 
💡
2 페이지에 게시글 1개 표시. 2페이지에 Next 비활성화
 

2. 페이지네이션 모듈화

 
BoardController
@GetMapping("/board/listings") public String listings(HttpServletRequest request,@RequestParam(defaultValue = "1")int page) { List<BoardResponse.boardAndUserDTO> responseDTO = boardRepository.findByBoardtbAndUsertb(page); List<BoardResponse.boardAndUserDTO> employerList = new ArrayList<>(); for (BoardResponse.boardAndUserDTO dto : responseDTO) { if (dto.isEmployer()) { employerList.add(dto); } } request.setAttribute("employerList", employerList); // 페이지네이션 모듈 int totalPage = boardRepository.countIsEmployerTrue(); //DB에서 게시글 수 조회 PagingUtil paginationHelper = new PagingUtil(totalPage, page); request.setAttribute("nextPage", paginationHelper.getNextPage()); request.setAttribute("prevPage", paginationHelper.getPrevPage()); request.setAttribute("first", paginationHelper.isFirst()); request.setAttribute("last", paginationHelper.isLast()); request.setAttribute("numberList", paginationHelper.getNumberList()); return "/board/listings"; }
 
💡
DB에서 조회한 데이터를 PagingUtil 로 전달한다. 리퀘스트 객체에 PagingUtil 의 Getter 를 통해 데이터를 전달한다.
 
 
_core/PagingUtil
package shop.mtcoding.projectjobplan._core; import lombok.RequiredArgsConstructor; import java.util.ArrayList; import java.util.List; @RequiredArgsConstructor public class PagingUtil { private int totalCount; private int currentPage; public PagingUtil(int totalCount, int currentPage) { this.totalCount = totalCount; this.currentPage = currentPage; } public int getNextPage() { return this.currentPage + 1; } public int getPrevPage() { return this.currentPage - 1; } public boolean isFirst() { return this.currentPage == 1; } public int getTotalPageCount() { return (this.totalCount % 10 == 0) ? (this.totalCount / 10) : (this.totalCount / 10 + 1); } public boolean isLast() { return this.currentPage == getTotalPageCount(); } public List<Integer> getNumberList() { List<Integer> numberList = new ArrayList<>(); for (int i = 1; i <= getTotalPageCount(); i++) { numberList.add(i); } return numberList; } }
 
💡
컨트롤러에서 전달받은 데이터를 생성자를 통해 값을 받아서 처리한다.
 
Share article

{CODE-RYU};