[Spring MVC] DAO 만들기 전에 공통으로 사용할 검색과 페이징부터 #5
Last Updated: 2025년 07월 18일
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 "";
}
}
}