Last Updated: 2022년 12월 14일
DB 만들고, DTO(VO) 만들고, mapper 까지 기본 뼈대를 만들었다면, 이제 DAO를 만들면 되는데 그 전에 공통으로 사용할 검색과 페이징부터 먼저 만들려고 합니다. 파일은 “Criteria.java, SearchCriteria.java, PageMaker.java” 입니다.
출처: 내 컴퓨터
Criteria.java
- /프로젝트명/src/main/java/kr/co/narrator/board/common/Criteria.java
package kr.co.narrator.board.common; /* Criteria * 특정 페이지의 게시판을 조회하기 위한 도우미 클래스 */ public class Criteria { /* 현재 페이지 번호 */ private int page; /* 한 페이지당 보여질 게시글의 갯수 */ private int perPageNum; /* 특정 페이지의 게시글 시작번호, 게시글 시작 행 번호 */ /* 현재 페이지의 게시글 시작 번호 = (현재 페이지 번호 - 1) * 페이지당 보여줄 게시글 갯수 */ public int getPageStart() { return (this.page - 1) * perPageNum; } /* 생성자로 페이지 번호와, 페이지당 보여줄 게시글의 갯수 초기화 */ public Criteria() { this.page = 1; this.perPageNum = 10; } public int getPage() { return page; } public void setPage(int page) { if (page <= 0) { this.page = 1; } else { this.page = page; } } public int getPerPageNum() { return perPageNum; } public void setPerPageNum(int pageCount) { int cnt = this.perPageNum; if (pageCount != cnt) { this.perPageNum = cnt; } else { this.perPageNum = pageCount; } } }
SearchCriteria.java
- /프로젝트명/src/main/java/kr/co/narrator/board/common/SearchCriteria.java
package kr.co.narrator.board.common; /* * 검색 구현 (제목, 작성자, 내용) * criteria는 criterion의 복수형 * 주로 인터넷에서 항목, 원했던 결과값을 의미한다. */ public class SearchCriteria extends Criteria { private String searchType; private String keyword; public String getSearchType() { return searchType; } public void setSearchType(String searchType) { this.searchType = searchType; } public String getKeyword() { return keyword; } public void setKeyword(String keyword) { this.keyword = keyword; } @Override public String toString() { return "SearchCriteria [searchType=" + searchType + ", keyword=" + keyword + "]"; } }
PageMaker.java
- /프로젝트명/src/main/java/kr/co/narrator/board/common/PageMaker.java
package kr.co.narrator.board.common; import java.net.URLEncoder; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; /* * 페이지를 생성하고, 계산을 하는 클래스 */ public class PageMaker { private Criteria cri; private int totalCount; private int startPage; private int endPage; private boolean prev; private boolean next; private int displayPageNum = 10; public Criteria getCri() { return cri; } public void setCri(Criteria cri) { this.cri = cri; } public int getTotalCount() { return totalCount; } /* 총 게시글 수를 셋팅할때 calcData() 메서드를 호출하여 페이징 관련 버튼 계산 */ public void setTotalCount(int totalCount) { this.totalCount = totalCount; calcData(); } /* * 페이징의 버튼들을 생성하는 계산식을 만들었다. 끝 페이지 번호, 시작 페이지 번호, 이전, 다음 버튼들을 구함 * * @cri.getPage() 현재 페이지 번호 * * @cri.getPerPageNum() : 한 페이지당 보여줄 게시글의 갯수 끝 페이지 번호 = (현재 페이지 번호 / 화면에 보여질 * 페이지 번호의 갯수) * 화면에 보여질 페이지 번호의 갯수 마지막 페이지 번호 = 총 게시글 수 / 한 페이지당 보여줄 게시글의 * 갯수 */ private void calcData() { endPage = (int) (Math.ceil(cri.getPage() / (double) displayPageNum) * displayPageNum); int tempEndPage = (int) (Math.ceil(totalCount / (double) cri.getPerPageNum())); if (endPage > tempEndPage) { endPage = tempEndPage; } startPage = (endPage - displayPageNum) + 1; if (startPage <= 0) startPage = 1; prev = startPage == 1 ? false : true; next = endPage * cri.getPerPageNum() >= totalCount ? false : true; } public int getStartPage() { return startPage; } public void setStartPage(int startPage) { this.startPage = startPage; } public int getEndPage() { return endPage; } public void setEndPage(int endPage) { this.endPage = endPage; } public boolean isPrev() { return prev; } public void setPrev(boolean prev) { this.prev = prev; } public boolean isNext() { return next; } public void setNext(boolean next) { this.next = next; } public int getDisplayPageNum() { return displayPageNum; } public void setDisplayPageNum(int displayPageNum) { this.displayPageNum = displayPageNum; } /** * 검색 조건과 검색 키워드 처리 URI 자동 생성 메서드 페이지와 페이지번호, 검색 타입과 키워드 조건이 URI에 붙어서 간다. */ public String makeSearch(int page) { UriComponents uriComponents = UriComponentsBuilder.newInstance().queryParam("page", page) .queryParam("perPageNum", cri.getPerPageNum()) .queryParam("searchType", ((SearchCriteria) cri).getSearchType()) .queryParam("keyword", encoding(((SearchCriteria) cri).getKeyword())).build(); return uriComponents.toUriString(); } /* 검색 키워드 인코딩 처리 */ public String encoding(String keyword) { if (keyword == null || keyword.trim().length() == 0) return ""; try { return URLEncoder.encode(keyword, "UTF-8"); } catch (Exception e) { return ""; } } }