Spring Pagination(페이징)

김민욱·2022년 1월 17일
0

spring

목록 보기
4/6
post-thumbnail

게시글의 수가 10개가 넘었을때, 다음페이지로 넘어가게끔 만들고 싶었다!
이때 '페이징'이라는 방법을 알게됐다.

참고한 사이트 먼저..!
https://freehoon.tistory.com/112

페이징을 만드는 순서는 대략 이렇다.

  1. Pagination 클래스를 따로 만든다.

  2. 게시판 목록 조회 SQL의 수정 및 전체 게시글 수 알아오기

  3. 총 게시글 개수 확인을 위한 ContactMapper, ContactService 수정(메소드 추가)

  4. ContactController 수정

  5. 게시글을 읽어 오기 위한 ContactMapper, ContactService 수정(getContactsBoard 메소드 수정)

  6. 게시판 목록 화면 contactBoard.jsp 수정

첫번째: Pagination 클래스를 따로 만들기

package kr.co.daeik;

import lombok.Data;

@Data
public class Pagination {
    private int listSize = 10; //초기값으로 목록개수를 10으로 셋팅

    private int rangeSize = 10; //초기값으로 페이지범위를 10으로 셋팅

    private int page;

    private int range;

    private int listCnt;

    private int pageCnt;

    private int startPage;

    private int startList;

    private int endPage;

    private boolean prev;

    private boolean next;

    public void pageInfo(int page, int range, int listCnt) {//page는 현재 페이지 정보, range는 현재 페이지 범위정보, ListCnt는 게시물의  개수
        this.page = page;
        this.range = range;
        this.listCnt = listCnt;

        this.pageCnt =(int)Math.ceil((double)listCnt/listSize); //전체 페이지 수

        this.startPage =(range -1)*rangeSize+1; //시작 페이지

        this.endPage = range*rangeSize;

        this.startList = (page-1)*listSize;

        this.prev = range ==1?false:true;

        this.next = endPage>pageCnt?true:false;
        if(this.endPage>this.pageCnt){
            this.endPage = this.pageCnt;
            this.next=false;
        }

    }
}

두번째: Pagination 클래스를 따로 만들기

<select id="getContactsBoard" resultType="kr.co.daeik.VO.ContactVO">
        SELECT * FROM `INQUIRY`
        order by CREATED_AT desc
        LIMIT #{startList},#{listSize};
    </select>

    <select id="getBoardListCnt" resultType="int">
        SELECT
            count(*) as listCnt
        FROM
            `INQUIRY`
    </select>

세번째: 총 게시글 개수 확인을 위한 ContactMapper, ContactService 수정(메소드 추가)

@Mapper
@Repository
public interface ContactMapper {
    public int getBoardListCnt() throws Exception;
}
public class ContactServiceImpl implements ContactService {

    @Autowired
    private ContactMapper contactMapper;

    
    @Override
    public int getBoardListCnt() throws Exception{
        return contactMapper.getBoardListCnt();
    }
}

코드가 너무 길어 삭제한 것이 있긴하지만 대략 이렇다는 말씀!

네번째: ContactController 수정

@GetMapping("/contactBoard") //견적문의게시판
    public String getContactsBoard(Model model
    ,@RequestParam(required = false, defaultValue = "1") int page
    ,@RequestParam(required = false, defaultValue = "1") int range
    )throws Exception{

        int listCnt = contactService.getBoardListCnt();

        Pagination pagination = new Pagination();
        pagination.pageInfo(page,range,listCnt);

        model.addAttribute("pagination", pagination);
        model.addAttribute("contactBoard", contactService.getContactsBoard(pagination));

        return "contactBoard";
    }

다섯번째: 게시글을 읽어 오기 위한 ContactMapper, ContactService 수정(getContactsBoard 메소드 수정)
(세번째 방법과 동일)

여섯번째: 게시판 목록 화면 contactBoard.jsp 수정

<script>
    //이전 버튼 이벤트
    function fn_prev(page, range, rangeSize) {
        var page = ((range - 2) * rangeSize) + 1;
        var range = range - 1;
        var url = "${pageContext.request.contextPath}/contact/contactBoard";
        url = url + "?page=" + page;
        url = url + "&range=" + range;
        location.href = url;
    }
    //페이지 번호 클릭
    function fn_pagination(page, range, rangeSize, searchType, keyword) {
        var url = "${pageContext.request.contextPath}/contact/contactBoard";
        url = url + "?page=" + page
        url = url + "&range=" + range;
        location.href = url;
    }
    //다음 버튼 이벤트
    function fn_next(page, range, rangeSize) {
        var page = parseInt((range * rangeSize)) + 1;
        var range = parseInt(range) + 1;
        var url = "${pageContext.request.contextPath}/contact/contactBoard";
        url = url + "?page=" + page;
        url = url + "&range=" + range;
        location.href = url;
    }
</script>

<!-- pagination{s} -->
<div style="text-align : center;">
<div id="paginationBox">
    <ul class="pagination">
        <c:if test="${pagination.prev}">
            <li class="page-item">
                <a class="page-link" href="#" onClick="fn_prev('${pagination.page}', '${pagination.range}', '${pagination.rangeSize}')">Previous</a>
            </li>
        </c:if>

        <c:forEach begin="${pagination.startPage}" end="${pagination.endPage}" var="idx">
            <li class="page-item <c:out value="${pagination.page == idx ? 'active' : ''}"/> "><a class="page-link" href="#" onClick="fn_pagination('${idx}', '${pagination.range}', '${pagination.rangeSize}')"> ${idx} </a></li>
        </c:forEach>

        <c:if test="${pagination.next}">
            <li class="page-item"><a class="page-link" href="#" onClick="fn_next('${pagination.range}','${pagination.range}', '${pagination.rangeSize}')" >Next</a></li>
        </c:if>
    </ul>
</div>
</div>

contactBoard.jsp 마지막에 위의 코드를 추가해준다! 그럼 아래의 사진처럼 1,2페이지 처럼 나타남!

번외

나는 블로그 이것저것 뒤져가면서 페이징 하는 방법을 찾아서 했는데 조금 간편한 방법이 있었다.
바로 "전자정부프레임워크" 이다.

전자정부프레임워크

위의 사이트에 가서
개발가이드 > 시작하기 > 전자정부 표준 프레임워크 3.10 기반 개발 시작하기(Getting Started) > pagination 검색
을하면 아래의 사이트가 나오는데 페이징을 쉽게 할 수 있는 API가 나온다..! 다음에 할 때 참고!
pagination

profile
열쪙 열쪙 열쪙

0개의 댓글