[Java] 게시판 검색 기능
2021. 5. 21. 11:34

1. 검색 버튼

<form class="form-inline" action="/" method="GET">
	    <input class="form-control mr-sm-2" type="text" name="search" placeholder="게시글 검색">
	    <button class="btn btn-primary"  type="submit" >검색</button>
</form>

 

2. BoardController

@GetMapping({"","/","/?search={search}&page={page}"})
public String index(String search, Model model, Criteria cri) {
	
	PageMaker pageMaker = new PageMaker();
	if(search == null) {
		pageMaker.setCri(cri);
		pageMaker.setTotalCount(boardService.게시글갯수()); // 총 게시글의 수
		List<Board> boards = boardService.현재페이지(cri);
		model.addAttribute("search",search);
		model.addAttribute("boards", boards); 
		model.addAttribute("curPageNum", cri.getPage());
		model.addAttribute("pageMaker", pageMaker);
	} else { 
		pageMaker.setCri(cri); 
		pageMaker.setTotalCount(boardService.검색게시글갯수(search)); 
		List<Board> searchBoards = boardService.검색목록(search, cri); 
		model.addAttribute("search",search);
		model.addAttribute("boards", searchBoards); 
		model.addAttribute("curPageNum", cri.getPage());
		model.addAttribute("pageMaker", pageMaker);
	}

	return "index"; // viewResolver 작동!!
}

- 페이징 처리(이전 글 참고)를 하고 search값을 받아서 null값이 아닌경우 검색된 게시글의 갯수와 검색목록을 가져온다.

 

3. BoardService

@Transactional
public int 검색게시글갯수(String search) { 
	return boardRepository.findByTitleCount(search);
}

@Transactional
public List<Board> 검색목록(String search, Criteria cri){ 
	return boardRepository.findByTitle(search, cri.getPageStart(), cri.getPerPageNum());
}

 

4. BoardRepository

@Query(value= "SELECT * FROM board b WHERE b.title LIKE %:title%  ORDER BY b.id DESC LIMIT :start, :page", nativeQuery = true)
List<Board> findByTitle(@Param("title") String search, @Param("start") int startPage, @Param("page") int pageSize); 

@Query(value= "SELECT count(*) FROM board b WHERE b.title LIKE %:title%", nativeQuery = true)
Integer findByTitleCount(@Param("title") String search);

 

5. index.jsp

<ul class="pagination justify-content-center" style="margin-top:20px;">
<c:choose>
	<!-- 검색어가 없을경우 start -->
	<c:when test="${empty search}">
		<c:choose>
		<c:when test="${pageMaker.prev}">
			<li class="page-item"><a class="page-link" href="?page=${pageMaker.startPage-1}">Previous</a></li>
		</c:when>
		<c:otherwise>
			<li class="page-item disabled"><a class="page-link" href="?page=${pageMaker.startPage-1}" >Previous</a></li>
		</c:otherwise>
	</c:choose> 
	
	<c:forEach begin="${pageMaker.startPage}" end="${pageMaker.endPage}" var="pageNum">
		<c:choose>
			<c:when test="${pageNum == curPageNum}">
				<li class="page-item active">
					<a class="page-link" href="?page=${pageNum}">${pageNum}</a>
				</li>
			</c:when>
			<c:otherwise>
				<li class="page-item">
					<a class="page-link" href="?page=${pageNum}">${pageNum}</a>
				</li>
			</c:otherwise>
		</c:choose>
	</c:forEach>
	
	<c:choose>
		<c:when test="${pageMaker.next && pageMaker.endPage > 0}">
			<li class="page-item"><a class="page-link" href="?page=${pageMaker.endPage + 1}">Next</a></li>
		</c:when>
		<c:otherwise>
			<li class="page-item disabled"><a class="page-link" href="?page=${pageMaker.endPage + 1}">Next</a></li>
		</c:otherwise>
	</c:choose>   
	</c:when>
	<!-- 검색어가 없을경우 end -->
	
	<!-- 검색어가 있을경우 start -->
	<c:otherwise>
		<c:choose>
		<c:when test="${pageMaker.prev}">
			<li class="page-item"><a class="page-link" href="?search=${search}&page=${pageMaker.startPage-1}">Previous</a></li>
		</c:when>
		<c:otherwise>
			<li class="page-item disabled"><a class="page-link" href="?search=${search}&page=${pageMaker.startPage-1}" >Previous</a></li>
		</c:otherwise>
	</c:choose> 
	
	<c:forEach begin="${pageMaker.startPage}" end="${pageMaker.endPage}" var="pageNum">
		<c:choose>
			<c:when test="${pageNum == curPageNum}">
				<li class="page-item active">
					<a class="page-link" href="?search=${search}&page=${pageNum}">${pageNum}</a>
				</li>
			</c:when>
			<c:otherwise>
				<li class="page-item">
					<a class="page-link" href="?search=${search}&page=${pageNum}">${pageNum}</a>
				</li>
			</c:otherwise>
		</c:choose>
	</c:forEach>
	
	<c:choose>
		<c:when test="${pageMaker.next && pageMaker.endPage > 0}">
			<li class="page-item"><a class="page-link" href="?search=${search}&page=${pageMaker.endPage + 1}">Next</a></li>
		</c:when>
		<c:otherwise>
			<li class="page-item disabled"><a class="page-link" href="?search=${search}&page=${pageMaker.endPage + 1}">Next</a></li>
		</c:otherwise>
	</c:choose>   
	</c:otherwise>
</c:choose>
	<!-- 검색어가 있을경우 end -->
</ul>

 

6. 결과

검색어 없을 경우 
검색어 '테스트' 검색결과