페이징 처리하기

LEE YUJIN·2023년 12월 5일
0

Spring

목록 보기
4/6

Mybatis에서 페이징 처리하기

  • RowBounds 를 사용해서 페이징 처리
  • RowBounds(시작 인덱스, 페이지 당 글의 수)
  • RowBounds는 index 0부터 시작

구현하기

option.properties

  • 페이지 당 글의 개수는 10개로 설정한다.
  # 페이징
  ## 페이지 당 글의 개수
  page.listcnt = 10	

BoardController

  • 요청 url : /board/main?board_info_idx=${board_info_idx}&page=${page}
  • page parameter : 디폴트 값은 1로 설정한다.
  • boardService.getContentList(board_info_idx, page); : page파라미터를 전체 게시글 리스트를 반환하는 서비스 메서드에 넘겨준다.
	@GetMapping("/main")
	public String main(@RequestParam int board_info_idx, Model model,
			@RequestParam(value = "page", defaultValue = "1") int page) {
            
            ...생략...
		
		List<Content> list = boardService.getContentList(board_info_idx, page);
		model.addAttribute("list", list);
		
		return "board/main";
	}

BoardService

  • 게시글 목록을 반환하는 메서드에 RowBounds를 추가한다.
  • RowBounds(시작 인덱스, 페이지 당 글의 수)
  • dao에 rowBounds를 파라미터로 넘겨준다.
@Service
@PropertySource("/WEB-INF/properties/option.properties")
public class BoardService {
	... 생략 ...
	@Value("${page.listcnt}")
	private int page_listcnt;
    
	// 게시글 목록
	public List<Content> getContentList(int content_board_idx, int page) {
		
		/*
		 * controller에서 page의 디폴트를 1로 정해놓았다.
		rowbounds에서 인덱스는 0부터 시작하므로 파라미터로 받은 page에서 -1을 해주어야 진짜 인덱스이다.
		한 페이지당 글 리스트 10개로 설정해놓았으므로 
		각 페이지당 시작 인덱스는 
				0페이지 -> 0(0 ~ 9)
		 		1페이지 -> 10(10 ~ 19)
		 		2페이지 -> 20(20 ~ 29) ... */
		int startIndex = (page - 1) * page_listcnt;
		RowBounds rowBounds = new RowBounds(startIndex, page_listcnt);
		
		return boardDao.getContentList(content_board_idx, rowBounds);
	}
}    

BoardDao

... 생략 ...
	// 게시글 목록
	public List<Content> getContentList(int content_board_idx, RowBounds rowBounds) {
		return boardMapper.getContentList(content_board_idx, rowBounds);
	}

BoardMapper

	...생략...
    // 게시글 목록
	@Select("select c.content_idx, c.content_subject, u.user_name as content_writer_name, "
			+ "to_char(c.content_date, 'YYYY-MM-DD') as content_date "
			+ "from content_table c join user_table u on c.content_writer_idx = u.user_idx "
			+ "where c.content_board_idx = #{content_board_idx} "
			+ "order by c.content_idx desc")
	List<Content> getContentList(int content_board_idx, RowBounds rowBounds);

Pagination

DTO

  • 생성자에서 전체 페이지 수, 페이지네이션의 최소 페이지 번호, 최대 페이지 번호, 이전 버튼 페이지 번호, 다음 버튼 페이지 번호를 구한다.
package com.community.dto;

public class Page {
	
	// 최소 페이지 번호
	private int min;
	
	// 최대 페이지 번호
	private int max;
	
	// 이전 버튼 페이지 번호
	private int prevPage;
	
	// 다음 버튼 페이지 번호
	private int nextPage;
	
	// 전체 페이지 수
	private int pageCnt;
	
	// 현재 페이지 번호
	private int currentPage;
	
	// contentCnt : 전체 글 수, contentPageCnt : 페이지 당 글 수, paginationCnt : 페이지 버튼의 수
	public Page(int contentCnt, int currentPage, int contentPageCnt, int paginationCnt) {
		// 현재 페이지 번호
		this.currentPage = currentPage;
		
		// 전체 페이지 수 = 전체 글의 수 / 페이지 당 글의 수
		pageCnt = contentCnt / contentPageCnt;
		
		// 글 13개 있는 경우 가정 -> 13/10 = 1 이지만 글 3개 남음 -> 1페이지가 아니고 2페이지가 되어야한다.
		if(contentCnt % contentPageCnt > 0) {
			pageCnt++;
		}
		
		min = ((currentPage - 1) / paginationCnt ) * paginationCnt + 1;
		max = min + paginationCnt - 1;
		
		if(max > pageCnt) {
			max = pageCnt;
		}
		
		prevPage = min - 1;
		nextPage = max + 1;
		if(nextPage > pageCnt) {
			nextPage = pageCnt;
		}
		
	}
	

	public int getMin() {
		return min;
	}

	public int getMax() {
		return max;
	}

	public int getPrevPage() {
		return prevPage;
	}

	public int getNextPage() {
		return nextPage;
	}

	public int getPageCnt() {
		return pageCnt;
	}

	public int getCurrentPage() {
		return currentPage;
	}	
}

BoardMapper

  • 각 게시판 별 전체 글의 개수가 필요하다.
...생략...
	// 전체 글의 수
	@Select("select count(*) from content_table where content_board_idx = #{content_board_idx}")
	int getContentCnt(int content_board_idx);

BoardDao

...생략...
	// 전체 글의 수
	public int getContentCnt(int content_board_idx) {
		return boardMapper.getContentCnt(content_board_idx);
	}

BoardService

  • boardDao.getContentCnt(content_board_idx);로 전체 글의 개수를 리턴받는다.
  • page의 생성자로 전체 페이지 수, 페이지네이션의 최소 페이지 번호, 최대 페이지 번호, 이전 버튼 페이지 번호, 다음 버튼 페이지 번호를 구한다.
@Service
@PropertySource("/WEB-INF/properties/option.properties")
public class BoardService {
...생략...
	@Value("${page.listcnt}")
	private int page_listcnt;
	
	@Value("${page.paginationcnt}")
	private int page_paginationcnt;
	// 페이징
	public Page getContentCnt(int content_board_idx, int currentPage) {
		
		// 전체 글의 개수
		int content_cnt = boardDao.getContentCnt(content_board_idx);
		
		// 전체 글의 개수, 현재 페이지번호, 페이지 당 글의 개수, 페이지 버튼의 개수
		Page page = new Page(content_cnt, currentPage, page_listcnt, page_paginationcnt);
		
		return page;
	}    
}

BoardController

...생략...
	@GetMapping("/main")
	public String main(@RequestParam int board_info_idx, Model model,
			@RequestParam(value = "page", defaultValue = "1") int page) {
            ...생략...
		
		model.addAttribute("board_info_idx", board_info_idx);
		
		List<Content> list = boardService.getContentList(board_info_idx, page);
		model.addAttribute("list", list);
		
		Page paging = boardService.getContentCnt(board_info_idx, page);
		model.addAttribute("page", paging);
		
		return "board/main";
	}

JSP

...생략...
			<div class="d-none d-md-block">
				<ul class="pagination justify-content-center">
					<c:choose>
					<c:when test="${page.prevPage <= 0 }">
						<li class="page-item disabled">
							<a href="${root }board/main?board_info_idx=${board_info_idx}&page=${page.prevPage}" class="page-link">이전</a>
						</li>
					</c:when>
					<c:otherwise>
						<li class="page-item">
							<a href="${root }board/main?board_info_idx=${board_info_idx}&page=${page.prevPage}" class="page-link">이전</a>
						</li>					
					</c:otherwise>
					</c:choose>

					<c:forEach var="idx" begin="${page.min }" end="${page.max }">
						<c:choose>
						<c:when test="${idx == page.currentPage }">
							<li class="page-item active">
								<a href="${root}board/main?board_info_idx=${board_info_idx}&page=${idx}" class="page-link">${idx }</a>
							</li>
						</c:when>
						<c:otherwise>
							<li class="page-item">
								<a href="${root}board/main?board_info_idx=${board_info_idx}&page=${idx}" class="page-link">${idx }</a>
							</li>
						</c:otherwise>
						</c:choose>
					</c:forEach>
					<c:choose>
					<c:when test="${page.max >= page.pageCnt }">
						<li class="page-item disabled">
							<a href="${root }board/main?board_info_idx=${board_info_idx}&page=${page.nextPage}" class="page-link">다음</a>
						</li>
					</c:when>
					<c:otherwise>
						<li class="page-item">
							<a href="${root }board/main?board_info_idx=${board_info_idx}&page=${page.nextPage}" class="page-link">다음</a>
						</li>					
					</c:otherwise>
					</c:choose>

				</ul>
			</div>
 ...생략...        
profile
개발 공부노트

0개의 댓글