-
springwebmvcprojectSPRING 2022. 2. 8. 12:33
페이징 알고리즘을 게시판에 적용해 봅시다~
일단 PageVO를 작성 먼저 하고
package com.spring.mvc.board.commons;import lombok.Getter;import lombok.Setter;import lombok.ToString;@Getter@Setter@ToStringpublic 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(총 게시물 수 / 한 페이지에 보여줄 게시물 수)*/@Autowiredprivate IBoardMapper mapper;@Testpublic 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