본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Spring framework

페이징 처리, 페이징 클래스

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2019. 4. 29.

 

 

관계형 데이터베이스와 관련된 프로젝트에서는, 대부분의 고객들이 페이징 처리를 무척이나 좋아하고 원한다.

페이징 알고리즘은 한번 만들어두면 나중에는 복붙형식으로 쓰이는데..

한번 만들 때 워낙 햇갈리고 짜증나는일임에 틀림없다.

아래소스코드는 총 갯수, 크기, 보여질 갯수 및 현재 페이지수를 받아서 HashMap으로 페이징과 관련된 데이터를 리턴하는 클래스이다.

import java.util.HashMap;

public class PageUtilBean {

	/* total : 총 페이지
	 * pgSize : 한개 페이지에서 보여질 갯수, 리스트의 숫자
	 * ROWSIZE : 하단에 보여질 페이징 갯수, 클릭해서 이동할 페이지숫자
	 * curPage : 현재 페이지
	*/
	public HashMap<Object,Object> makePageData(float total, float pgSize, int ROWSIZE, int curPage){
		HashMap<Object,Object> param = new HashMap<Object, Object>();
		float totCnt = (float)total;  	
		float pageSize = (float)pgSize;    
		int pgCnt = (int) Math.ceil(totCnt / pageSize);    
		if(ROWSIZE > pgCnt){  //총 갯수 오버 방지
			ROWSIZE = pgCnt;
		}
		int devide = (int) Math.ceil(((float)(curPage+1)/(float)ROWSIZE));  //기준체크		
		int start = ((devide)*ROWSIZE) - (ROWSIZE-1); // 해당페이지에서 시작번호(step2) 
		int end = ((devide)*ROWSIZE); // 해당페이지에서 끝번호(step2)		
		if(end > pgCnt){  //최종 넘어가는 갯수 오버 방지
			end = pgCnt;
		}
		
		param.put("firstPage", (int)(curPage * pageSize)); //첫번째 페이지수(0으로 리턴되면 1을더해서 쓰면 된다)
		param.put("pgCnt", pgCnt);  //기준값으로 나눈 페이지 갯수
		param.put("curPage", curPage); //현재 페이지
		param.put("start",start);  //시작가능 페이지
		param.put("end", end); // 끝 페이지
		param.put("pageSize", (int)pageSize);  //페이지 사이즈
		//start값과 end값이 하단에 보여질 페이지수이다. 해당 데이터를 for문으로 돌리면 된다. 
		return param;
	}
}

 

위 클래스를 적용시킨 jsp 페이지는 아래처럼 하면 된다.

<div style='text-align:center'>
	<c:if test="${pgCnt != null}">
	<div style='display:inline-block'>
        <ul class="" style='margin:0px;'>


            <!--맨 첫페이지로 이동기능-->
        	<li>
        		<a href="#" onclick='moveLeft(1)'>
        			<span><<</span>  
        		</a>
        	</li>  
 
            <!--이전페이지 기능-->
        	<li>
        		<a href="#" onclick='moveLeft(${curPage})'>
        			<span aria-hidden="true"><</span>
        		</a>
        	</li>

           <!--페이지 선택-->
        	<c:forEach var="i" begin="${start}" end="${end}" step="1">
        		<li> 
                  <a onclick="movePage(${i})">${i}</a>
                </li>
        	</c:forEach>

            <!--다음페이지 기능-->
        	<li>
        		<a href="#" onclick='moveRight(${curPage+2})'>
        			<span>></span>
        		</a>
        	</li>

            <!--맨 마지막 페이지로 이동기능-->
        	<li>
        		<a href="#" onclick='moveRight(${pgCnt})'>
        			<span>>></span>
        		</a>
        	</li>    
    	
        </ul>
	</div>
	</c:if>
</div>    

전자정부 프레임워크에 무슨 페이징 하는 클래스가 있던데..

해당 클래스를 사용해도 상관없지만 커스터마이징하기에는 불편한 듯 하다.

혹시나..페이징 쿼리와 컨트롤러 사용 예제를 찾는다면 아래 내용을 참고하면 된다.

		SELECT * FROM (
			SELECT ROWNUM AS RNUM, MOTHER.* FROM (
		 		 SELECT * FROM TEST_DB
		 	) MOTHER
			WHERE ROWNUM <= #{lastPg} 
		) BODY
		WHERE RNUM >= #{firstPg}
@Controller
public class PagingExampleController {
	
	@Resource(name = "TestService")
	private TestService service;
	
	@Autowired
	private PageUtilBean pageBean;
	
	// 리스트보기
	@RequestMapping(value = "/paging.do")
	public ModelAndView paging(@RequestParam HashMap<Object, Object> param, ModelAndView mv) {
		
		// 페이징 관련 예문
		float totCnt = (float) service.totalCnt(param); // 총 페이지, 데이터베이스에서 조회하는 서비스를 만들자.
		float pageSize = 10 //리스트 갯수를 정하는 값, 즉 리스트에 몇개를 뿌릴지 결정
		int curPage = (int)param.get("curPage"); // 현재 페이지, 최초 접속하면 1을 주도록 하자.
		int ROWSIZE = 10; // 보여질 페이징 하단 갯수

		// 페이징 처리  
		HashMap<Object, Object> res = pageBean.makePageData(totCnt, pageSize, ROWSIZE, curPage);

		param.put("firstPg", (Integer) res.get("firstPage"));  //첫번째 변수
		param.put("lastPg", (int)(pageSize) + (Integer)res.get("firstPage"));  //마지막 변수  

		mv.addObject("list", service.getList(param)); //쿼리가 들어간 리스트
		mv.addObject("pgCnt", (Integer) res.get("pgCnt"));    //하단 페이징에 맨 마지막으로 가기 기능
		mv.addObject("curPage", (Integer) res.get("curPage"));//현재 페이지
		mv.addObject("start", (Integer) res.get("start"));  //하단 페이징에 사용될 시작번호
		mv.addObject("end", (Integer) res.get("end"));  //하단 페이징에 사용될 종료번호
		mv.setViewName("paging");
		return mv;
	}
}
반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글