본문 바로가기

Spring Framework

[PaginationInfo] 게시판 및 여러 리스트들 페이징 처리하기(하단 결론有)

입사 초기에 선임들이 짜놓은것들 보고 복붙 하고....

그것 마저 잘 안되서 선임들이 마무리 해주었던 터라...

머릿속에 잘 자리 잡지 않은 PaginationInfo 사용법인데요

PaginationInfo를 사용하기 위해서는 설정을 해주셔야 하는데

제 컴퓨터는 물려받은거 이기도 하구 maven이나 다른 설정들은

제가 안해서 사실 잘 모르지만

사용방법은 야무지게 공부 했기 때문에

사용 방법 위주로 설명 해드리겠습니다.

 

일단 페이징 처리에서 제일 중요한건

아래 네가지 항목인데요.

* currentPageNo : 현재 페이지 번호
* recordCountPerPage : 한 페이지당 게시되는 게시물 건 수
* pageSize : 페이지 리스트에 게시되는 페이지 건수,
* totalRecordCount : 전체 게시물 건 수.

Java에서 PaginationInfo를 선언하면 볼 수있는 항목들입니다.

저는 dao와 vo,controller, jsp, sql.xml에다가 만 코딩을 했습니다.

 

먼저 vo입니다.

여러분들의 프로젝트에 필요한 vo값들
+
int startPage;
int lastPage;

vo에 startPagelastPage를 선언해줍니다.

vo는 여기서 끝이구요.

 

다음은 dao입니다.

(원랜 controller에다가 바로 하는게 좋긴한데 전 controller가 복잡해지는걸 별로 안좋아해서 dao에다가 했습니다)

/**
 * 페이징
 * */
// 페이징
public Map<String,Object> getPage(int currentPageIndex) throws Exception{
    PaginationInfo page = new PaginationInfo();
    int pageNo = 1; //처음 현재페이지
    int listScale = 20; //한 페이지에 나올 글 수 //변수 받아서 지정 할 수도 있음
    Map<String,Object> map = pageCnt(listScale); //아래 함수에서 값 가져오기
    //가져온 값 세팅하기
    //(아래 함수의 결과값이 {pageScale=?,totalCnt=?} 이런식으로 나와서 key로 값 가져오기
    int pageScale = Integer.parseInt(String.valueOf(map.get("pageScale"))); //페이지갯수
    int totalList = Integer.parseInt(String.valueOf(map.get("totalCnt")));; //게시글 총 갯수
    
    //-----------필수입력값 설정하는부분 시작------------
    page.setCurrentPageNo(currentPageIndex > 0 ? currentPageIndex :  pageNo); //현재페이지

    page.setRecordCountPerPage(listScale);
    page.setPageSize(pageScale);
    page.setTotalRecordCount(totalList);
    //-----------필수입력값 설정하는부분 끝------------
    
    //paginationInfo에 getFirstRecordIndex()라는 함수가 있어서 자동으로 계산해줌
    int firstIndex = page.getFirstRecordIndex();
//		int lastIndex = page.getLastRecordIndex();
    map.put("paginationInfo", page);
    map.put("firstIndex",firstIndex); //페이지에 표출될 리스트의 시작번호 지정
    map.put("lastIndex", listScale); //페이지에 표출될 리스트 갯수

    return map;
}
// 총 페이지 수 구하기
//(아래 쿼리의 결과값이 맵에 담으면 {pageScale=?,totalCnt=?} 이런식으로 나옴
public Map<String,Object> pageCnt(int listScale) throws Exception{
    return sqlSession.selectOne("post.pageCnt",listScale);
}

위 코드를 보시면 일단 return은

넘겨줄게 여러개다 보니 map으로 해주었구요.

 

controller입니다. dao와 같이 보면서 코딩하시면 좋아요!

 

@RequestMapping("/board.do")
public String board(HttpServletRequest request ,Model model,@ModelAttribute BoardVO boardVO,
						@ModelAttribute BoardSearchVO searchVO) throws Exception{

    if(boardVO != null) {
		// 페이징 넘버를 누르면 받아오는 값 (맨처음엔 값을 안받아와서 @RequestParam으로 선언 안함)
        String param = request.getParameter("pageIndex");
        //dao에서 return한 map을 받아오는 곳 + 위 값의 여부를 판단해서 dao로 넘겨주는곳
        Map<String,Object> map = boardDAO.getPage(param !=null && param != ""? Integer.parseInt(param) : 0);
		
        //dao에서 retrun한 map에서 paginationInfo 값을 꺼내서 저장하는 부분
        PaginationInfo page = (PaginationInfo) map.get("paginationInfo");
        
        //vo에 startPage와 lastPage를 저장하는 부분
        boardVO.setStartPage(Integer.parseInt(String.valueOf(map.get("firstIndex"))));
        boardVO.setLastPage(Integer.parseInt(String.valueOf(map.get("lastIndex"))));
		
        //vo를 가지고 게시글 리스트를 조회하는 부분
        List<BoardVO> ls = boardDAO.selectPostList(boardVO);
        
        //조회한 값, paginationInfo값, 조회할때 조건으로 입력했던 값(생략가능)
        model.addAttribute("pols",ls);
        model.addAttribute("paginationInfo",page);
        model.addAttribute("searchVO",searchVO); //(생략가능)
    }
	//jsp
    return "/board";
}

 

jsp에 페이징 넘버를 표출 할 부분에 이렇게 코딩 해 주세요.

 

<nav aria-label="Page navigation example">
    <ul class="pagination justify-content-center">
        <ui:pagination paginationInfo="${paginationInfo}" type="image" jsFunction="linkPage" />
    </ul>
</nav>

그러면

아래 사진처럼 나오는데 저 버튼을

누르세요

그럼 아래 사진처럼

pageIndex의 값을 컨트롤러의 board.do로 넘기는 모습

이렇게 pageIndex값이 넘어가서

 

결국

 

-> controller에서 받아가지구 그 받은값을  null체크 해서 dao로 넘겨서

-> dao에서  페이지에 표출될

    리스트수, 페이지 개수((게시글 총 개수/표출될 리스트수)+1), 게시글 총 개수, 현재 페이지 번호 를 선언해서

    paginationInfo에 각각 set을 해줍니다.

    startPage와 lastPage도 각각 챙겨서

    map으로 모두 컨트롤러로 리턴 해줍니다.

-> 그렇게 컨트롤러에 넘어온 map에서 각 값을 꺼내서 vo와 pagination에 각각 선언 및 set해주고

-> sql.xml에서 리스트를 조회할때  리미트 조건을 걸어줍니다.

 ex) select no, id, title, ......... from board where ........ order by no LIMIT #{startPage}, #{lastPage} 

    이렇게 말이죠..

이제 테스트 하는 일만 남았네용

리스트 테이블에 한 100 개 데이터 넣어서 해보세요~!

 

궁금한점, 이해안가는점, 지적할 부분 있으시면 댓글로 작성해주시면

틈틈히 확인해서 답글 달아드리겠습니다.

이상입니다.