0

[Spring MVC] DAO 만들기 전에 공통으로 사용할 검색과 페이징부터 #5

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 "";
		}
	}

}