ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • springwebmvcproject
    SPRING 2022. 2. 8. 12:33

    페이징 알고리즘을 게시판에 적용해 봅시다~

     

    일단 PageVO를 작성 먼저 하고

     

    package com.spring.mvc.board.commons;
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    @Getter
    @Setter
    @ToString
    public class PageVO {
     
    private int page; //사용자가 선택한 페이지 번호
    private int countPerPage; //사용자가 선택한 한 화면에 보여질 게시물 개수
     
    public PageVO() {
    this.page = 1;
    this.countPerPage = 10;
    }
    }
     
    /*
    *** 페이징 알고리즘 만들기 ***
     
    # 1. 총 게시물의 수를 조회해야 합니다.
    - 총 게시물 수는 DB로부터 수를 조회하는 SQL문 작성.
     
    # 2. 사용자가 현재 위치한 페이지를 기준으로
    끝 페이지 번호를 계산하는 로직 작성.
     
    - 만약 현재 사용자가 보고 있는 페이지가 3페이지고,
    한 화면에 보여줄 페이지 버튼이 10개씩이면? -> 10페이지.
    공식: Math.ceil(현재 위치한 페이지 번호 / 페이지 버튼 개수) * 페이지 버튼 개수
     
    # 3. 시작페이지 번호 구하기
    공식: (끝 페이지 번호 - 페이지 버튼 개수) + 1
     
    # 4. 이전 버튼 활성 여부
    공식: 시작페이지가 1이면 비활성, 나머지는 모두 활성.
     
    # 5. 다음 버튼 활성 여부
    공식: 보정 전 끝 페이지 번호 * 한 페이지에 들어갈 게시물의 수 >= 총 게시물 수
    -> 비활성.
     
    # 6. 끝 페이지 값 보정
    - 다음 버튼이 비활성화 되었을 때 사용. (필요없는 버튼을 제거하는 용도로)
    - 공식: Math.ceil(총 게시물 수 / 한 페이지에 보여줄 게시물 수)
    */
    @Autowired
    private IBoardMapper mapper;
     
    @Test
    public void pagingAlgorithmThes() {
    System.out.println("#총 게시물: " + mapper.countArticles());
    System.out.println("------------------------------------");
     
    //끝 페이지 번호 계산 테스트
    PageVO vo = new PageVO();
    vo.setPage(12);
    vo.setCountPerPage(10);
    int buttonNum = 10; //한 화면에 보여질 버튼 개수
    int endPage = (int) (Math.ceil(vo.getPage() / (double)buttonNum) * buttonNum);
    System.out.println("끝 페이지 번호: " + endPage + "번" );
     
    int beginPage = (endPage - buttonNum) + 1;
    System.out.println("시작 페이지 번호: " + beginPage + "번");
     
    //이전 버튼 활성화, 비활성화 여부
    boolean isPrev = (beginPage == 1) ? false : true;
     
    //다음 버튼 활성화, 비활성 여부
    boolean isNext = (endPage * vo.getCountPerPage()) >= mapper.countArticles() ? false : true;
     
    System.out.println("이전 버튼 활성화 여부: " + isPrev);
    System.out.println("다음 버튼 활성화 여부: " + isNext);
     
    //끝 페이지 보정
    if(!isNext) {
    endPage = (int) Math.ceil(mapper.countArticles() / (double) vo.getCountPerPage());
    }
    System.out.println("보정 후 끝 페이지 번호: " + endPage + "번");
    }
    }

    쌩 메모장에다가 써 보는 연습하면서 이해하는 게 중요할 것 같아요 =_=~~

     

    위에 만든 것을 복사해 와서 package com.spring.mvc.board.commons 의 PageCreator에 붙여넣기 해 줍니다.


    public class PageCreator {
    private PageVO paging; // 사용자가 선택한 페이지 정보를 가지고 있는 객체
    private int articleTotalCount; //총 게시물의 수
    private int beginPage; //시작 페이지 번호
    private int endPage; //끝 페이지 번호
    private boolean prev; //이전 버튼
    private boolean next; //다음 버튼
    //URI 파라미터를 쉽게 만들어 주는 유틸 메서드
    public String makeURI(int page) {
    UriComponents ucp = UriComponentsBuilder.newInstance().queryParam("page", page)
    .queryParam("countPerPage", paging.getCountPerPage())
    .queryParam("keyword", ((SearchVO) paging).getKeyword())
    .queryParam("condition", ((SearchVO) paging).getCondition())
    .build();
    return ucp.toUriString();
    }
    //한 화면에 보여질 페이지 버튼 수
    private final int displayPageNum = 10;
    //페이징 알고리즘을 수행할 메서드 선언
    private void calcDataOfPage() {
    endPage = (int) (Math.ceil(paging.getPage() / (double)displayPageNum) * displayPageNum);
    System.out.println("끝 페이지 번호: " + endPage + "번" );
    beginPage = (endPage - displayPageNum) + 1;
    System.out.println("시작 페이지 번호: " + beginPage + "번");
    //이전 버튼 활성화, 비활성화 여부
    prev = (beginPage == 1) ? false : true;
    //다음 버튼 활성화, 비활성 여부
    next = (endPage * paging.getCountPerPage()) >= articleTotalCount ? false : true;
    //끝 페이지 보정
    if(next) {
    endPage = (int) Math.ceil(articleTotalCount / (double) paging.getCountPerPage());
    }
    }
    public void setArticleTotalCount(int articleTotalCount) {
    this.articleTotalCount = articleTotalCount;
    calcDataOfPage();
    }
    }

     

    IBoardMapper에 가서는 새로운 개념을 배웠는데, 

     

    MyBatis로 DB연동을 진행할 때 파라미터 값이 2개 이상이라면,
     1. @Param을 이용해서 작성하는 법
     2. Map으로 포장해서 보내는 법
     3. 객체 하나를 매개값으로 보내는 법
     방법을 적절하게 상황에 맞게 선택할 수 있습니다.
     

    //@Param을 이용한 매개값 전달 방식
    //@Param("xml파일 내에서 사용할 이름") 매개변수
    List<BoardVO> getArticleList(@Param("paging") PageVO paging,
    @Param("keyword") String keyword,
    @Param("condition") String condition);



    //여러 개의 파라미터들을 Map으로 포장해서 보내는 방식
    //<key, value> key: xml 파일에서 사용할 이름, value: 값(Object타입)
    List<BoardVO> getArticleList(Map<String, Object> datas);
    */

    //검색 결과와 페이지 정보까지 가지고 있는 하나의 객체를 매개값으로 받는 방식
    List<BoardVO> getArticleList(SearchVO search);



    BoardController로 가서

    //페이징 처리 이후 게시글 목록 불러오기 요청
    @GetMapping("/list")
    public String list(PageVO paging, Model model) {
    System.out.println("/board/list: GET");
    System.out.println("페이지 번호: " + paging.getPage());
     
    List<BoardVO> list = service.getArticleList(paging);
    System.out.println("페이징 처리 후 게시물의 수 " + list.size());
     
    PageCreator pc = new PageCreator();
    pc.setPaging(paging);
    pc.setArticleTotalCount(service.countArticles());
     
    model.addAttribute("articles", list);
    model.addAttribute("pc", pc);
     
    return "board/list";
    }

    로 수정합니다~!

     

    게시판에 수정을 빼 놓을 수 없는데,, 그것도 만들기로 했습니다

     


    public class SearchVO extends PageVO{

    private String keyword;
    private String condition;
    }

     

    IBoardMapper에 가서,

    //게시물 수 조회 기능
    //검색 결과에 따른 게시물 수를 리턴할 수 있어야 하기 때문에 검색 결과를 품고 있는 SearchVO를 매개값으로 받습니다.
    int countArticles(SearchVO search);

    추가해 주고~ BoardService에도 추가를 해 줍니다.

     

    검색 이후에 BoardController에는

     

    //검색 처리 이후 게시글 목록 불러오기 요청
    @GetMapping("/list")

     

    public String list(SearchVO search, Model model) {
    System.out.println("/board/list: GET");
    System.out.println("페이지 번호: " + search.getPage());

     

    System.out.println("검색어: " + search.getKeyword());
    System.out.println("검색 조건: " + search.getCondition());
     
    if(search.getKeyword() == null) {
    search.setKeyword("");
    search.setCondition("");
    }
     
     
    List<BoardVO> list = service.getArticleList(search);
     
    PageCreator pc = new PageCreator();
    pc.setPaging(search.getPage());
    pc.setArticleTotalCount(service.countArticles(keyword, condition));
     
    model.addAttribute("articles", list);
    model.addAttribute("pc", pc);
     
     
    return "board/list";
    }

     

    오늘 거 복습 다시 해 봐야겠다~!~!

     
     

     

    'SPRING' 카테고리의 다른 글

    mywebproject  (0) 2022.02.11
    springwebmvcproject  (0) 2022.02.10
    springwebmvcproject  (0) 2022.02.09
    springwebmvcproject  (0) 2022.02.04
    springdbaccess (2)  (0) 2022.01.28
Designed by Tistory.