페이징 구현방법 2

Jay_u·2023년 8월 2일
0

프로젝트

목록 보기
2/5

저번 시간에 이어서 계속 작성해보자면
저번 시간 페이징 구현방법 1의 경우에는 스프링 프레임워크 + MyBatis를 활용한 방법이었다.

스프링부트에서는 훨씬 편리하게 페이징 기능을 구현할 수 있다. 코드는 다음과 같다.

controller

    @GetMapping("main")
    public ModelAndView board(@RequestParam(required = false, defaultValue = "1", value = "pageNo") int pageNo) {
        Page<Board> boardList = interBoardService.getBoardList(pageNo);
        String pageBar = interBoardService.getPageBar(boardList, pageNo);

        ModelAndView mav = new ModelAndView();
        mav.addObject("boardList", boardList);
        mav.addObject("pageBar", pageBar);
        mav.setViewName("main");
        return mav;
    }

컨트롤러에서 페이징 처리가 필요한 url에 맞게 메소를 짜봤다. pageNo라는 파라미터를 서비스에 넘겨준다.
getPageBar라는 메소드는 페이지 바를 만드는 메소드이다. 페이지 바란 [1 2 3 4 5 6 다음] 이런 것을 의미한다.

service

서비스의 경우 크게 2가지로 먼저 jpa를 통해 페이징 처리가 된 boardList를 가져오는 방법이다.

    @Override
    public Page<Board> getBoardList(int pageNo) {
        PageRequest pageRequest = PageRequest.of(pageNo-1, 5, Sort.by("regdate").descending());
        Page<Board> boardList = boardRepository.findAll(pageRequest);
        return boardList;
    }

이 부분은 추후에 수정할 예정이다. 원래 컨트롤러에서 파라미터로 바로 pageable을 받을려고 했는데 그렇게 하니깐 오류가 생겼다.
java.lang.IllegalStateException: No primary or single unique constructor found for interface java.awt.print.Pageable

Pageable 인터페이스를 구현하는 클래스를 생성하라는 의미이다.
근데 클래스를 구현할 거면 서비스에서 그냥 size도 정의해버리자 생각해서 이렇게 만들었지만 객체지향적이지 않아서 보완할 예정이다.

아무튼 jpa의 findAll 메소드에 pageRequest를 설정해서 파라미터로 보내주면 Board라는 객체를 Page로 받을 수 있다.
findAll(pageRequest).getcont? 이걸로 List형식으로도 받을 수 있지만 pageBar 만들 때와 글번호를 만들기 위해서는 Page로 받는게 더 간편하다.

    
    @Override
    public String getPageBar(Page<Board> boardList, int currentPageNo) {
    
    	// Page로 받아서 getTotalPages 라는 메소드를 활용해 전체 페이지 숫자를 얻을 수 있다. 
        int totalPageNum = boardList.getTotalPages();
        int startRno = (int) Math.ceil(totalPageNum / boardList.getSize());
        startRno = startRno <= totalPageNum ? startRno : totalPageNum;
        int endRno = startRno + boardList.getSize() - 1;
        endRno = endRno < totalPageNum ? endRno : totalPageNum;

		// 1 2 3 4 5 한 줄에는 5개의 페이지가 보여질 것이다.
        int blockSize = 5;
        
        //loop를 활용해 반복하면서 페이지를 만든다.
        int loop = 1;
     
     	// pageNo라는 것은 5개의 페이지 중 첫 페이지를 의미한다. 1~5 면 1 6~10 이면 6
        int pageNo = ((currentPageNo - 1)/blockSize) * blockSize + 1;
        String pageBar = "<ul style='list-style: none;'>";
        String url = "main";

        if(pageNo != 1) {
            pageBar += "<li class='pagebar-last'><a href='"+url+"?pageNo=1'>[맨처음]</a></li>";
            pageBar += "<li class='pagebar-next'><a href='"+url+"?pageNo="+(pageNo-1)+"'>[이전]</a></li>";
        }

        while( !(loop > blockSize || pageNo > totalPageNum) ) {

            if(pageNo == currentPageNo) {
                pageBar += "<li class='pagebar-selected'>"+pageNo+"</li>";
            }
            else {
                pageBar += "<li class='pagebar-nonselected'><a href='"+url+"?pageNo="+pageNo+"'>"+pageNo+"</a></li>";
            }
            loop++;
            pageNo++;
        }// end of while-----------------------

        // === [다음][마지막] 만들기 === //
        if( pageNo <= totalPageNum ) {
            pageBar += "<li class='pagebar-next' ><a href='"+url+"?pageNo="+pageNo+"'>[다음]</a></li>";
            pageBar += "<li class='pagebar-last' ><a href='"+url+"?pageNo="+totalPageNum+"'>[마지막]</a></li>";
        }
        pageBar += "</ul>";

        return pageBar;
    }
    

PageBar를 만드는 과정이다.

// 페이징 방법 참고
https://velog.io/@jyleedev/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA-Pageable-Page

https://hstory0208.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%ED%8E%98%EC%9D%B4%EC%A7%95Paging-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84-%EB%B0%A9%EB%B2%95-Thymeleaf-JPA

// 오류 java.lang.IllegalStateException: No primary or single unique constructor found for interface java.awt.print.Pageable
https://velog.io/@do_ng_iill/2022-08-09-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80

// 글번호
https://wikidocs.net/162090

profile
정확한 정보를 전달할려고 노력합니다.

0개의 댓글