[Spring] 페이징

Posted by 신희준 on October 24, 2017


2017 - 10 - 24 (화)

  • 페이징

  • 코드로 배우는 스프링 웹프로젝트[구멍가게 코딩단 지음] 참조


    1 .. 페이징


    페이징을 하는 이유는 한번에 최소한의 게시물 즉, 데이터를 전송받기 위함이다.


    페이징 처리 절차

    1 . 페이징처리를 하기 위한 DAO인터페이스 구현

      public List<BoardVO> listPage(int page) throws Exception;
    



    2 . Mapper에 SQL 추가 ( 이전에 typeAlias 설정을 통해 returnType 을 축약할 수 있다. )

    <select id="listPage" resultType="BoardVO">
    <![CDATA[
    select
      bno, title, content, writer, regdate, viewcnt
    from
      tbl_board
    where bno > 0
    order by bno desc, regdate desc
    limit #{page}, 10
    ]]>  
    </select>
    


    화면에 10개씩 데이터를 보여주고자 할 때 1페이지는 limit 1, 10 // 2페이지는 limit 10, 10 처럼
    limit 시작할 게시글번호 , 한 페이지에 게시할 게시글 갯수



    3 . 앞서 작성한 DAO인터페이스 메소드를 구현한다.

    @Override
    public List<BoardVO> listPage(int page) throws Exception {
    
      if (page <= 0) {
        page = 1;
      }
      page = (page - 1) * 10;
      return session.selectList(namespace + ".listPage", page);
    }
    



    4 . Criteria 클래스 작성 ( 아래같이 게시물 하단에 수많은 글들을 파티션할 수 있도록 클래스를 생성한다.)

    Post Sample Image

    public class Criteria {
    
      private int page;
      private int perPageNum;
    
      public Criteria() {
        this.page = 1;
        this.perPageNum = 10;
      }
    
      public void setPage(int page) {
    
        if (page <= 0) {
          this.page = 1;
          return;
        }
    
        this.page = page;
      }
    
      public void setPerPageNum(int perPageNum) {
    
        if (perPageNum <= 0 || perPageNum > 100) {
          this.perPageNum = 10;
          return;
        }
    
        this.perPageNum = perPageNum;
      }
    
      public int getPage() {
        return page;
      }
    
      // method for MyBatis SQL Mapper -
      public int getPageStart() {
    
        return (this.page - 1) * perPageNum;
      }
    
      // method for MyBatis SQL Mapper
      public int getPerPageNum() {
    
        return this.perPageNum;
      }
    
      @Override
      public String toString() {
        return "Criteria [page=" + page + ", "
            + "perPageNum=" + perPageNum + "]";
      }
    }
    



    5 . DAO인터페이스에 Criteria 파티션 별 데이터를 list로 가져올 수 있는 메서드 정의

    6 . 매퍼를 작성해준다. 페이지의 시작 게시물번호 , 페이지 당 게시글 갯수 를 활용하여 selectList를 한다.

    <select id="listCriteria" resultType="BoardVO">
    <![CDATA[
    select
     bno, title, content, writer, regdate, viewcnt
    from
     tbl_board
    where bno > 0
    order by bno desc, regdate desc
    limit #{pageStart}, #{perPageNum}
    ]]>  
    </select>
    



    7 . 이전에 DAO에서 정의한 메서드를 구현해준다.

    @Override
    public List<BoardVO> listCriteria(Criteria cri) throws Exception{
    	return session.selectList(namespace+".listCriteria",cri);
    }
    



    8 . Service에 추가한 DAO를 처리할 인터페이스 추가 한다.

      public List<BoardVO> listCriteria(Criteria cri) throws Exception;
    

    9 . 이전에 추가한 서비스를 구현한다.

    @Override
    public List<BoardVO> listCriteria(Criteria cri) throws Exception {
      return dao.listCriteria(cri);
    }
    


    10 . 컨트롤러에 listCriteria를 호출하는 메서드를 추가한다.

    @RequestMapping(value = "/listCri", method = RequestMethod.GET)
     public void listAll(Criteria cri, Model model) throws Exception {
    
       logger.info("show list Page with Criteria......................");
       model.addAttribute("list", service.listCriteria(cri));
     }
    


    11 . PageMaker 를 생성한다 . (PageMaker에는 페이징을 하기위한 전체 게시물 갯수, 시작 페이지, 끝 페이지와 prev, next를 정의해준다.)


    12 . PageMaker 를활용하여 BoardController 작성한다.


    13 . listPage.jsp 를 작성하여 페이징 처리된 화면을 구현한다.