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>

전체 11개의 게시글 중 10개 출력. 1페이지부터 시작. 1 페이지에 Previus 비활성화

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