jongviet

July 1, 2021 - paging 기본 본문

Spring legacy

July 1, 2021 - paging 기본

jongviet 2021. 7. 1. 23:20

*7월1일

-가장 기본적인 paging 로직에 대해 알아보자!

 

페이지 당 10개의 게시물, 10개 pageIndex, 총 게시물에 따라 next & prev button이 있는 형태!

 

1)PageVO

public class PageVO {
    private String range;
    private String keyword;
    private int pageIndex; //몇번째 페이지 번호인지?
    private int countPerPage; //한페이지에 몇개의 글?

    public PageVO() {
        this(1, 10); //페이징 최초 디폴트 값!
    }
    
    public PageVO(int pageIndex, int countPerPage) {
        this.pageIndex = pageIndex;
        this.countPerPage = countPerPage;
    }

    //서치했을 때 페이징, pageIndex와 countPerPage값이 들어옴;
    public PageVO(String range, String keyword, int pageIndex, int countPerPage) {
        this.range = range;
        this.keyword = keyword;
        this.pageIndex = pageIndex;
        this.countPerPage = countPerPage;
    }

 

2)PagingHandler

public class PagingHandler {
    private static Logger logger =  LoggerFactory.getLogger(PagingHandler.class);
    
    private int totalCount; //DB내 글의 총 개수
    private int firstPageIndex; //현재 페이지네이션의 가장 앞번호
    private int lastPageIndex; //현재 페이지네이션의 가장 뒷번호
    private boolean prev, next; //앞 뒤로 이동하는 버튼의 생성 여부
    private PageVO pgvo;
    
    public PagingHandler() {}
    public PagingHandler(int totalCount, PageVO pgvo) {
        this.totalCount = totalCount;
        this.pgvo = pgvo;
        
        //17번(pageIndex)을 클릭했다고 가정;
        //17/10.0 -> ceil(1.7)-올림 -> 2.0 * 10 -> 20(lastPageIndex)
        this.lastPageIndex =  (int)(Math.ceil(pgvo.getPageIndex()/10.0)) * 10;
        this.firstPageIndex = this.lastPageIndex  - 9; //항상 끝자리기 때문에;
        
        //DB에서 가져온 실제 글의 개수를 기준으로 만들어야 하는 마지막 페이지의 번호
        //실제 총 글의 개수는 134개라고 가정,  마지막 페이지 네이션의 번호는? 14개
        int realLastPageIndex =  (int)Math.ceil((totalCount*1.0)/pgvo.getCountPerPage());
        
        //연산에 의해서 만들어진 마지막 페이지 인덱스번호가 DB상 총 글의 수로 만든 페이지 번호보다 큰 경우 조정 필요
        if(this.lastPageIndex >=  realLastPageIndex) {
            this.lastPageIndex =  realLastPageIndex;
        }
        
        this.prev = firstPageIndex > 1; //첫번째  페이지가 아닌 경우에는 이전 버튼이 존재해야함; 경우의 수는 1, 11, 21, 31 등등.. 그중 1일 경우에만 false이므로~
        this.next = this.lastPageIndex <  realLastPageIndex; //DB상 뒤로 갈 값이 더 있으니, 다음 버튼이 존재해야함
    }

 

 

3)수정 또는 삭제한 후 기존 pageIndex로 다시 돌아가는 처리

 

-페이징 관련 pgvo 데이터는 계속해서 들고 다녀야한다. 그래야지 특정 게시물 수정/삭제 후 다시 페이지로 돌렸을 때 기존 페이지인덱스가 나오기 때문이다. 그렇다면, 어떻게 쉽게 들고만 다닐 수 있을까?

 

->list.jsp에서 detail 버튼을 눌렀을 때 모든 pgvo 값을 get방식으로 넘긴다.

<td><a  href="/product/detail?pno=${pvo.pno}&pageIndex=${pghdl.pgvo.pageIndex}&countPerPage=${pghdl.pgvo.countPerPage}&range=${pghdl.pgvo.range}$keyword=${pghdl.pgvo.keyword}">${pvo.title }</a></td>

 

->detail 컨트롤러로 넘어온 pgvo 데이터는 별도 DB를 거치는게 아니라 그대로 실려서 다시 detail.jsp로 나가기에....@modelAttribute로 처리할 수 있음~~~~

@ModelAttribute("pgvo") PageVO pgvo) { 

 

->'redirect:/' 를 활용하여 컨트롤러에서 컨트롤러로 데이터넘길 시 RedirectAttributes reAttr 사용!

reAttr.addFlashAttribute("pgvo", pgvo); //페이징용 값  넘기기;

         return  "redirect:/product/detail?pno="+pvo.getPno();

 

Comments