Back-end/Spring

Spring MVC2 패턴으로 페이징 구성하기

이안_ian 2019. 2. 23. 21:29
반응형

오늘은 스프링에서 페이징 처리를 해볼 것이다. 페이징 처리는 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로 숫자를 클릭하고나서 어디로 갈지 경로를 지정해준 것








반응형