티스토리 뷰
반응형
오늘은 스프링에서 페이징 처리를 해볼 것이다. 페이징 처리는 MVC1 패턴에서도 쓰이던 기법인데 MVC2 패턴에 와서는 더 쉽고 편리하게 구성되어서 좋을 것이다. 기본적인 로직이나 구성은 똑같되 편리한 메소드만 가져다 쓰면되므로 페이징의 기초를 모른다면 아래의 링크로 먼저 학습을 하고 볼 것을 권장한다.
https://smujihoon.tistory.com/88
그리고 이번 포스팅에서는 페이징처리를 템플릿화해서 사용할 것이다. 왜냐하면 어느곳에서 쓰이던 공식에 의해 똑같은 로직을 여러 번 구성하는것 보단 템플릿으로 만들어서 필요한 부분에 가져다 사용하는게 방법이 더 효율적이기 때문이다.
1.템플릿을 만들어보자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | package com.kh.spring.common; public class PageFactory { public static String getPageBar(int totalCon, int cPage, int numPerPage, String url) { String pageBar=""; int pageBarSize=5; int pageNo = ((cPage-1)/pageBarSize)*pageBarSize; int pageEnd = pageNo+pageBarSize-1; int totalPage = (int)Math.ceil((double)totalCon/numPerPage); //이전 버튼 pageBar = "<ul class='pagination justify-content-center pagination-sm'>"; if(pageNo==1) { pageBar += "<li class='page-item' disabled>"; pageBar += "<a class='page-link' href='#' tabindex='-1'>이전</a>"; pageBar += "</li>"; }else { pageBar += "<li class='page-item'>"; pageBar += "<a class='page-link' href='javascript:fn_paging("+(pageNo-1)+")'>이전</a>"; pageBar += "</li>"; } //1~5 숫자 while(!(pageNo>pageEnd || pageNo>totalPage)) { if(pageNo==cPage) { pageBar += "<li class='page-item' active>"; pageBar += "<a class='page-link'>"+pageNo+"</a>"; pageBar += "</li>"; }else { pageBar += "<li class='page-item'>"; pageBar += "<a class='page-link' href='javascript:fn_paging("+(pageNo)+")'>"+pageNo+"</a>"; pageBar += "</li>"; } pageNo++; } //다음 버튼 if(pageNo>totalPage) { pageBar += "<li class='page-item' disabled>"; pageBar += "<a class='page-link' href='#'>다음</a>"; pageBar += "</li>"; }else { pageBar += "<li class='page-item'>"; pageBar += "<a class='page-link' href='javascript:fn_paging("+(pageNo)+")'>다음</a>"; pageBar += "</li>"; } pageBar +="</ul>"; //paging 처리 script 작성 pageBar +="<script>"; pageBar +="function fn_paging(cPage){"; pageBar +="location.href='"+url+"?cPage='+cPage"; pageBar +="}"; pageBar +="</script>"; return pageBar; } } | cs |
1-2
ex) 페이징 시 조건 처리할 때 예시
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | public static String getPageBar(int totalCon, int cPage, int numPerPage,String url,String searchType,String keyword) { String pageBar=""; int pageBarSize=5; int pageNo=((cPage-1)/pageBarSize)*pageBarSize+1; int pageEnd = pageNo+pageBarSize-1; int totalPage = (int)Math.ceil((double)totalCon/numPerPage); pageBar="<ul class='pagination justify-content-center pagination-sm'>"; if(pageNo==1) { pageBar+="<li class='page-item' disabled>"; pageBar+="<a class='page-link' href='#' tabindex='-1'>이전</a>"; pageBar+="</li>"; } else { pageBar+="<li class='page-itme'>"; pageBar+="<a class='page-link' href='javascript:fn_paging("+(pageNo-1)+")'>이전</a>"; pageBar+="</li>"; } while(!(pageNo>pageEnd||pageNo>totalPage)) { if(pageNo==cPage) { pageBar+="<li class='page-item active'>"; pageBar+="<a class='page-link'>"+pageNo+"</a>"; pageBar+="</li>"; } else { pageBar+="<li class='page-item'>"; pageBar+="<a class='page-link' href='javascript:fn_paging("+pageNo+")'>"+pageNo+"</a>"; pageBar+="</li>"; } pageNo++; } if(pageNo>totalPage) { pageBar+="<li class='page-item' disabled>"; pageBar+="<a class='page-link' href='#'>다음</a>"; pageBar+="</li>"; } else { pageBar+="<li class='page-item'>"; pageBar+="<a class='page-link' href='javascript:fn_paging("+(pageNo)+")'>다음</a>"; pageBar+="</li>"; } pageBar+="</ul>"; //paging 처리 script작성 pageBar+="<script>"; pageBar+="function fn_paging(cPage){"; pageBar+="location.href='"+url+"?cPage='+cPage+'&searchType="+searchType+"&keyword="+keyword+"'"; pageBar+="}"; pageBar+="</script>"; return pageBar; } | cs |
57번째 줄이 처음 코드와 조금 다르다
2.매개변수의 값 넣어주기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @Controller public class BoardController { private Logger log = LoggerFactory.getLogger(BoardController.class); @Autowired BoardService service; @RequestMapping("/board/boardList.do") public ModelAndView boardList(@RequestParam(value="cPage",required=false, defaultValue="1")int cPage) { ModelAndView mv = new ModelAndView(); int numPerPage=5; int contentCount = service.selectBoardCount(); List<Map<String,String>> list = service.boardList(cPage,numPerPage); mv.addObject("pageBar", PageFactory.getPageBar(contentCount, cPage, numPerPage, "/spring/board/boardList")); mv.addObject("list",list); mv.setViewName("board/boardList"); return mv; } | cs |
컨트롤러에서 먼저 cPage(현재 페이지)가 처음에 데이터가 없을 수 있기 때문에 예외처리를 해서 값이
없을 경우 1이라는 값을 넣어주도록 셋팅한다.
페이지당 보여줄 데이터 개수(numPerPage)는 5개로 한정한다.
11번째 줄의 로직으로 board의 총 갯수를 알아온다.
해당하는 페이지에서(cPage) 페이지당 보여줄 데이터들을(numPerPage) List의 Map으로 가져온다.
뒤에 넘기는 과정은 생략한다.
3.RowBounds 사용하기
1 2 3 4 5 6 7 8 9 10 11 12 13 | @Repository public class BoardDaoImpl implements BoardDao { private Logger log = LoggerFactory.getLogger(BoardDaoImpl.class); @Autowired SqlSessionTemplate session; @Override public List<Map<String, String>> boardList(int cPage, int numPerPage) { // TODO Auto-generated method stub RowBounds rb = new RowBounds((cPage-1)*numPerPage,numPerPage); return session.selectList("board.boardList",null,rb); } | cs |
dao에서 RowBounds라는 객체에 공식을 집어넣고 12번째 줄과 같이 DB에 접근하면 스프링이 모든걸 알아서 처리해준다.
이러면 현재 페이지에서 5개만큼의 자료들만 가져온다.
2번째 사진에 14번째 줄
mv.addObject("pageBar", PageFactory.getPageBar(contentCount, cPage, numPerPage, "/spring/board/boardList"));
여기서는 우리가 만들었던 템플릿으로 아래의 페이지바를 구성하고 맨 뒤에 url로 숫자를 클릭하고나서 어디로 갈지 경로를 지정해준 것
반응형
'Back-end > Spring' 카테고리의 다른 글
Spring WEB Socket (2) | 2019.02.24 |
---|---|
Spring 파일업로드 하기 (0) | 2019.02.23 |
Spring AOP (0) | 2019.02.20 |
Spring Interceptor (중간에 가로채기) (0) | 2019.02.19 |
Spring log4j 이용하여 기록남기기 (4) | 2019.02.19 |
댓글