티스토리 뷰





반응형

오늘은 스프링에서 페이징 처리를 해볼 것이다. 페이징 처리는 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
pageFactory라는 클래스에 위와 같이 만들었다. 이제 원하는 지점에서 매개변수들의 값을 받아와서 넣어주고 만들 것이다.


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<StringString>> 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
댓글
반응형
최근에 달린 댓글
글 보관함
Total
Today
Yesterday
최근에 올라온 글
«   2024/05   »
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