본문 바로가기
Language/Java

[JAVA/JSP] 페이징처리/페이지/paging/게시판구현 페이징

by 나비와꽃기린 2016. 9. 5.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

l  JSP에서 보내야 하는 것


Paging 처리에 대한 로직이 pageNoocountPerPage라는 파라미터 값을 통해

처리가 되도록 구현되어 있습니다. 따라서 JSP에서는 해당 값으로 Data를 서버단으로 보내주시길 바랍니다.


(1) 현재 클릭한 페이지 번호 : pageNo

(2) 한 페이지당 보여주는 데이터 개수 : countPerPage

 

l  Paging 처리 Server


(1) Service 로직 구현


1번째줄 설명 :: 필자는 DataEntity라는 별도의 클래스를 구현하여 사용하였습니다.

따라서 해당소스를 그대로 복사해서 사용하시면 당연히 1번째 줄의 DataEntity를 찾지

못한다고 에러가 날 것입니다. HttpServletRequestparameter를 처리해주는 별도의 

서비스를 구현해서 사용하시길 바랍니다.

 

5번째줄 설명 :: Paging 처리를 하기 위해서는 Data의 총 개수를 필수로! 구해오셔야

 합니다저는 ORACLE을 사용하니 COUNT(*)로 총 개수를 구해 왔습니다.

 

6번째줄 설명 :: 가지고 올 TABLE에 데이터가 1건이라도 있어야지만 페이징 처리를

하도록 구현했습니다. 데이터 값이 없는데 굳이 로직을 탈 필요는 없겠죠?

 

7번째줄 설명 :: Paging 처리를 위해 가장 중요한 부분입니다. 페이징에 관련된

PagingUtil Class를 생성하고 setPageInfo라는 메소드를 작성합니다.

(소스는 하단에 있습니다. 일단 설명을 읽어보심이 이해가 빠르실 거라고 생각됩니다)


setPageInfo는 화면 단에서 넘어온 pageNo(현재 페이지 값)countPerPage(한 화면

당 몇 개의 데이터를 그릴것인지)에 대한 값을 넘겨, 페이지의 시작값과 끝값을 계산하

return해주는 메소드입니다.


8번째줄 설명 :: setPageInfo를 통해 return받은 시작값 first와 끝값 last라는 파라미터

를 가지고 페이징처리 하여 게시글을 가지고 옵니다. 여기서 쿼리 수정이 필요한데 그

것은 아래에서 설명하도록 하겠습니다.

 

9번째줄 설명 :: 구해온 게시글 목록을 RESULT라는 KEY값으로 MAP에 담습니다.

 

10번째줄 설명 :: RESULT_PAGING이라는 KEY값에 PagingUtil 클래의 getPageObject

라는 메소드를 통해 return받은 결과값을 담습니다. getPageObjectpage에 대한

모든 정보값을 셋팅해주는메소드입니다. 아래에서 소스 있습니다.


public Map getBoardDetailList(DataEntity param) {
   Map resultObject = new HashMap();
   List result = new ArrayList();
   try{
	int        totalCnt = boardDao.getBoardListCount(param);  // DB연동_ 총 갯수 구해오기
			 
	if(totalCnt > 0){
						 
	 PagingUtil.setPageInfo(param , 10);
	 result=boardDao.getBoardDetailList(param); //게시판 목록 (팝업)
						 
	 resultObject.put("RESULT", result );
	 resultObject.put("RESULT_PAGING", PagingUtil.getPageObject(totalCnt, param.getInt(SEARCH_NO),   param.getInt("SEARCH_COUNT_PER_PAGE",4) , param.getInt("SEARCH_UNIT_PAGE",10)) );
						 
	}else{
	 resultObject.put("RESULT", result ); //빈값
	 resultObject.put("RESULT_PAGING", PagingUtil.getPageObject(totalCnt, 0));
       }
			 
   }catch(EpptlException e){
	 resultObject.put(RESULT_CODE, "500");
	 resultObject.put(RESULT_MESSAGE, e.getMessage());
	logger.info(getClass().getName(),e);
   }         

   return resultObject;
          
}

(2) 쿼리 수정


(1) 5번째줄 에서 말씀드린 것처럼 쿼리가 수정되어야 합니다.

setPageInfo 메소드를 타고 나면 firstlast라는 파라미터가 셋팅된다고 말씀드렸습니

따라서 해당 파라미터를 가지고 RNUMBETWEEN을 통해 페이징된 데이터를 추

출해 옵니다.(필자의 DBORACLE 입니다.^^)

select * from
  (
	 select
	 ROW_NUMBER() OVER(ORDER BY CODE ,TYPE ) RNUM,
						  TYPE,CODE,TITLE
			  from PT_ABRD_SET
                     
  ) X WHERE X.RNUM BETWEEN #{first} AND #{last}


(3) setPageInfo 메소드 설명


JSP에서 받아온 pageNocountPerPage값을 가지고,

1페이지라면 1~10 번의 데이터 값을

2페이지라면 2~20 번의 데이터 값을 ……………. (생략)

가져오도록 (first) ~ (last) 값을 셋팅 해주는 소스입니다.


일단 parameter 처리는 필자는 별도로 사용하는 것이 있다고 하였으니, 다른 분들은 

수정하여 사용하셔야 합니다.^^


한 페이지에 보여지는 게시글 목록은 최대 100개로 제한하였고 (4번째 줄 소스)

defaultCountPerPagecountPerPage를 일일히 셋팅하고 싶지 않으신 분이라면

사용하시라고 일단 저렇게 만들었습니다. 현재 이 소스에서는 사용하지 않지요.^^


public static DataEntity setPageInfo(DataEntity reqParam, int defaultCountPerPage) {
           int pageNo = reqParam.getParameter(“pageNo”);
int countPerPage = reqParam.getParameter(“countPerPage”);
countPerPage = countPerPage < 100 ? countPerPage : 100; //최대 100개로 제한 int first = ((pageNo-1)*countPerPage)+1 ,last = first+countPerPage-1; reqParam.put(“countPerPage”, countPerPage); reqParam.put(“first”, first); reqParam.put(“last”, last); return reqParam; }


(4) getPageObject 메소드 설명


현재 페이지 값, 총 페이지 개수, 페이지당 출력할 데이터 개수, next Page가 있는지에 

대한 여부등을 계산하는 소스입니다.


private static final int countPerPage = 10;
   private static final int unitPage = 10;
  
     return getPageObject(totalCount, currentPageNo, 10);
   }
  
   public static Map getPageObject(int totalCount, int currentPageNo, int countPerPage) {
     return getPageObject(totalCount, currentPageNo, countPerPage, 10);
   }
  
 
   //총 갯수 totalCount
   //현재 클릭한 페이지 번호 currentPageNo
   //페이지당 보여줄 데이타 갯수 countPerPage
   //페이지 그룹 갯수 unitPage
 
   public static Map getPageObject(int totalCount, int currentPageNo, int countPerPage, int unitPage) {
     int currPage = currentPageNo;
     int unitCount = 100;
    
     boolean isFirst = false;
    
     if (totalCount == 0) {
      countPerPage = unitCount;
     }
            else if (totalCount < countPerPage) {
                      countPerPage = totalCount / unitCount * unitCount;
                      if (totalCount % unitCount > 0) {
                                  countPerPage += unitCount;
                      }
     }
    
     int totalPage = getMaxNum(totalCount, countPerPage);
    
    if (totalPage < currPage)
                      currPage = totalPage;
                      int currStartCount;
                      int currEndCount;
                     
                      int currStartCount; if (currPage != 1) {
                                  int currEndCount = currPage * countPerPage;
                                  currStartCount = currEndCount - countPerPage;
                      } else {
                                  currEndCount = countPerPage;
                                  currStartCount = 0;
                      }
    
           if (currEndCount > totalCount)
                       currEndCount = totalCount;
                      int currStartPage;
                      int currEndPage;
                      int currStartPage;
                     
                      if (totalPage <= unitPage) {
                                  int currEndPage = totalPage;
                                  currStartPage = 1;
                      }else {
                                   currEndPage = (currPage - 1) / unitPage * unitPage + unitPage;
                                  currStartPage = currEndPage - unitPage + 1;
                      }
    
      if (currEndPage > totalPage)
        currEndPage = totalPage;
    
                      int prePage;
                      boolean prePage_is;
                      int prePage; if (currStartPage != 1) {
        boolean prePage_is = true;
        prePage = currStartPage - 1;
     
             } else {
       prePage_is = false;
       prePage = 0; }
              int nextPage;
       boolean nextPage_is;
    
      if (currEndPage != totalPage) {
                       boolean nextPage_is = true;
                       nextPage = currEndPage + 1;
      }else {
                      nextPage_is = false;
                       nextPage = 0;
      }
    
     Map tempJSON = new java.util.HashMap();
     try {
       tempJSON.put("currPage", Integer.valueOf(currPage));
              tempJSON.put("unitPage", Integer.valueOf(unitPage));
              tempJSON.put("prePage", Integer.valueOf(prePage));
       tempJSON.put("prePage_is", Boolean.valueOf(prePage_is));
              tempJSON.put("nextPage", Integer.valueOf(nextPage));
       tempJSON.put("nextPage_is", Boolean.valueOf(nextPage_is));
       tempJSON.put("currStartPage", Integer.valueOf(currStartPage));
       tempJSON.put("currEndPage", Integer.valueOf(currEndPage));
      
       tempJSON.put("totalCount", Integer.valueOf(totalCount));
       tempJSON.put("totalPage", Integer.valueOf(totalPage));
     }
     catch (Exception localException) {}
    
        return tempJSON;
     }
  
   private static int getMaxNum(int allPage, int list_num) {
      if (allPage % list_num == 0) {
        return allPage / list_num;
     }
        return allPage / list_num + 1;
   }


 

l  결과

resultObject.put("RESULT", result );  >> DB에서 가져온 결과값은 mapRESULT값으로 들어가 있을거고


resultObject.put("RESULT_PAGING", PagingUtil.getPageObject(totalCnt, param.getInt(SEARCH_NO),   param.getInt("SEARCH_COUNT_PER_PAGE",4) , param.getInt("SEARCH_UNIT_PAGE",10)) );

>> RESULT_PAGING 이라는 KEY값에는 PagingUtil.getPageObject 함수를 통해 가져온 결과값이 들어가게 된다고 말씀드렸습니다.


따라서 JSP에서 RESULT_PAGING을 찍어보면 아래와 같게 될 것입니다.

(1페이지의 10개의 데이터를 가져오는 것으로 가져온 데이터)

 



Object {prePage0currStartPage1nextPage0currPage1totalCount28…}

1.  currEndPage:3

2.  currPage:1

3.  currStartPage:1

4.  nextPage:0

5.  nextPage_is:false

6.  prePage:0

7.  prePage_is:false

8.  totalCount:28

9.  totalPage:3

10. unitPage:10




 

View는 저 값에 따라 그려주시면 됩니다.

Paging을 그리는 js 도 보통 공통으로 빼서 사용하게 됩니다.

Paging 처리를 위한 서버 로직이 PagingUtil 로 별도로 관리되는 것처럼 말이죠.

페이징 UI를 그리는 것은 다음 포스팅을 참조하시면 될 것 같습니다 ^^

http://mkil.tistory.com/228