Spring

12.15.(목) Spring Framework(23): 게시판 기능(8)

콜라든포비 2022. 12. 17. 23:19

게시판 목록 검색

제목에 키워드가 포함된 글을 검색할때는 일전에 작성한 목록 쿼리문에 조건식을 붙여주면 된다.

SELECT * FROM 
	(SELECT * FROM 
		(SELECT postno, subject FROM board_tbl WHERE subject LIKE '%휴스턴%' ORDER BY postno DESC) 
	WHERE rownum<=5*1 ORDER BY postno ASC) 
WHERE rownum<=5 ORDER BY postno DESC;

우선 boardList.jsp에서 어떤 기준으로 검색할건지 정해주자.

<!-- 검색 기능 -->
<div class="searchDiv">
	<form action="/myapp/board/boardList">
		<select name="searchKey">
			<option value="subject">제목</option>
			<option value="content">내용</option>
			<option value="username">작성자</option>
		</select>
		<input type="text" name="searchValue" id="searchValue">
		<input type="submit" value="검색">
	</form>
</div>

검색값 유효성 검사를 진행한다.

<script>
	function searchCheck(){
		// 검색어 입력여부 확인
		if(document.getElementById("searchValue").value=="") {
			alert("검색어를 입력하세요.");
			return false;
		}
		return true;
	}
</script>
<!-- 검색 기능 -->
<div class="searchDiv">
	<form action="/myapp/board/boardList" onsubmit="return searchCheck()">
		<select name="searchKey">
			<option value="subject">제목</option>
			<option value="content">내용</option>
			<option value="username">작성자</option>
		</select>
		<input type="text" name="searchValue" id="searchValue">
		<input type="submit" value="검색">
	</form>
</div>

PageVO로 넘어가서 검색에 관련된 변수를 생성하자.

// 검색
private String searchKey;
private String searchValue;
public String getSearchValue() {
	return searchValue;
}

public void setSearchValue(String searchValue) {
	this.searchValue = searchValue;
}

컨트롤러에서 totalData의 매개변수로 pvo를 넣어주고, 그에 따라 DAO, Service, ServiceImpl 모두 수정한다.

@Override
public List<BoardVO> boardList(PageVO pvo) {
    return dao.boardList(pvo);
}

boardMapper.xml에 있는 totalData쿼리문과 boardList쿼리문에 조건문을 붙일 것이다. <if>태그를 이용한다.

내용/제목/작성자에 검색값이 포함된 글의 개수를 구하고,

<select id="totalData" resultType="int">
	SELECT count(postno) FROM board_tbl
	<if test="searchValue!=null">
		WHERE ${searchKey} LIKE '%${searchValue}%'
	</if>
</select>

내용/제목/작성자에 검색값이 포함된 글을 전부 불러온다.

<select id="boardList" resultType="com.poby.myapp.vo.BoardVO">
	SELECT * FROM 
		(SELECT * FROM 
			(SELECT postno, subject, username, hitcount, to_char(regdate, 'mm-dd hh:mi') regdate 
			FROM board_tbl 
			<if test="searchValue!=null">
				WHERE ${searchKey} LIKE '%${searchValue}%'
			</if>
			ORDER BY postno DESC) 
		WHERE rownum<![CDATA[<=]]>${nowPage}*${dataPerPage} ORDER BY postno ASC) 
	<choose>
		<when test="totalPage!=nowPage">
			WHERE rownum<![CDATA[<=]]>${dataPerPage} ORDER BY postno DESC
		</when>
		<otherwise>
			WHERE rownum<![CDATA[<=]]>${lastPageData} ORDER BY postno DESC
		</otherwise>
	</choose>
</select>

검색 결과에 대한 페이지를 따로 설정해주어야 한다. boardList.jsp에서 조건문을 붙여서 검색결과가 있을때만 searchKey와 searchValue를 넘겨주도록 한다.

<!-- 페이지 처리 -->
<div class="pagesDiv">
	<ul>
		<!-- prev버튼 -->
		<c:if test="${ pvo.nowPage==1 }">
			<li>prev</li>
		</c:if>
		<c:if test="${ pvo.nowPage>1 }">
			<li><a href='/myapp/board/boardList?nowPage=${ pvo.nowPage-1 }<c:if test="${ pvo.searchValue!=null }">&searchKey=${ pvo.searchKey }&searchValue=${ pvo.searchValue }</c:if>'>prev</a></li>
		</c:if>
		<!-- 페이지 번호 출력 -->
		<c:forEach var="i" begin="${ pvo.startPage }" end="${ pvo.startPage+pvo.pageCount-1 }">
			<!-- 출력할 페이지번호(i)는 총 페이지 수(pvo.totalPage)보다 작을때까지 출력한다 -->
			<c:if test="${ i<=pvo.totalPage }">
				<!-- 현재 페이지 -->
				<c:if test="${ i==pvo.nowPage }">
					<li style="background-color:#ddd">${ i }</li>
				</c:if>
				<!-- 현재 페이지 아님 -->
				<c:if test="${ i!=pvo.nowPage }">
					<li><a href='/myapp/board/boardList?nowPage=${ i }<c:if test="${ pvo.searchValue!=null }">&searchKey=${ pvo.searchKey }&searchValue=${ pvo.searchValue }</c:if>'>${ i }</a></li>
				</c:if>
			</c:if>
		</c:forEach>
		<!-- next버튼 -->
		<c:if test="${ pvo.nowPage==pvo.totalPage }">
			<li>next</li>
		</c:if>
		<c:if test="${ pvo.nowPage<pvo.totalPage }">
			<li><a href='/myapp/board/boardList?nowPage=${ pvo.nowPage+1 }<c:if test="${ pvo.searchValue!=null }">&searchKey=${ pvo.searchKey }&searchValue=${ pvo.searchValue }</c:if>'>next</a></li>
		</c:if>
	</ul>
</div>

제목에 '다'가 들어간 글을 검색한 결과이다.

searchValue, 즉 검색값이 null이냐 아니냐에 따라서 전체를 보여줄지, 검색값에 해당하는 결과값만 보여줄지를 DAO, boardMapper.xml 그리고 boardList.jsp에 조건을 추가하여 완성했다.