안녕하세요?
MelonPeach입니다.
이전 포스팅에서 페이징 기능을 구현하였는데요.
이번에는 게시판에서 검색 기능을 추가하려고합니다.
1. boardMapper 작성
먼저 boardMapper.xml에서 listPage쿼리, listCount를 수정해줍니다.
그리고 동적 쿼리 sql문을 만들어서 추가해줍니다.
<select id="listPage" resultType="kr.co.vo.BoardVO" parameterType="kr.co.vo.SearchCriteria">
SELECT BNO,
TITLE,
CONTENT,
WRITER,
REGDATE
FROM (
SELECT BNO,
TITLE,
CONTENT,
WRITER,
REGDATE,
ROW_NUMBER() OVER(ORDER BY BNO DESC) AS RNUM
FROM MP_BOARD
WHERE 1=1
<include refid="search"></include>
) MP
WHERE RNUM BETWEEN #{rowStart} AND #{rowEnd}
ORDER BY BNO DESC
</select>
<select id="listCount" parameterType="kr.co.vo.SearchCriteria" resultType="int">
SELECT COUNT(BNO)
FROM MP_BOARD
WHERE 1=1
<include refid="search"></include>
AND BNO > 0
</select>
<sql id="search">
<if test="searchType != null">
<if test="searchType == 't'.toString()">AND TITLE LIKE '%' || #{keyword} || '%'</if>
<if test="searchType == 'c'.toString()">AND CONTENT LIKE '%' || #{keyword} || '%'</if>
<if test="searchType == 'w'.toString()">AND WRITER LIKE '%' || #{keyword} || '%'</if>
<if test="searchType == 'tc'.toString()">AND (TITLE LIKE '%' || #{keyword} || '%') or (CONTENT LIKE '%' || #{keyword} || '%')</if>
</if>
</sql>
2. SearchCriteria 작성
이제는 검색타입과 검색어를 쓸수 있게 vo폴더에 SearchCriteria.java를 생성합니다.
Criteria를 extends했기때문에 SearchCriteria로 Criteria기능을 사용할 수 있습니다.
package kr.co.vo;
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 + "]";
}
}
3. PageMaker 작성
그 후 PageMaker.java에서 page, perPageNum, searchType, keyword를 url로 사용할수 있게 makeSearch를 하나 만들어줍니다.
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();
}
private String encoding(String keyword) {
if(keyword == null || keyword.trim().length() == 0) {
return "";
}
try {
return URLEncoder.encode(keyword, "UTF-8");
} catch(UnsupportedEncodingException e) {
return "";
}
}
4. BoardDAO, BoardService 작성
이제는 DAO와 DAOImpl, Service, ServiceImpl을 수정해줍니다.
5. BoardController 작성
BoardController.java에서 list를 수정해 줍니다.
// 게시판 목록 조회
@RequestMapping(value = "/list", method = RequestMethod.GET)
public String list(Model model, @ModelAttribute("scri") SearchCriteria scri) throws Exception{
logger.info("list");
model.addAttribute("list", service.list(scri));
PageMaker pageMaker = new PageMaker();
pageMaker.setCri(scri);
pageMaker.setTotalCount(service.listCount(scri));
model.addAttribute("pageMaker", pageMaker);
return "board/list";
}
6. list 작성
이전에 오타가있었는데요.. form에 method를 get으로 수정하여줍니다.
div태그를 추가해주시고 검색에 맞는 셀렉트박스와 옵션을 넣어줍니다.
button태그에 type를 button으로 수정해줍니다.
검색버튼을 눌렀을때 page, perPageNum, searchType, keyword의 값들이 들어가게 스크립트를 추가해줍니다.
<div class="search">
<select name="searchType">
<option value="n"<c:out value="${scri.searchType == null ? 'selected' : ''}"/>>-----</option>
<option value="t"<c:out value="${scri.searchType eq 't' ? 'selected' : ''}"/>>제목</option>
<option value="c"<c:out value="${scri.searchType eq 'c' ? 'selected' : ''}"/>>내용</option>
<option value="w"<c:out value="${scri.searchType eq 'w' ? 'selected' : ''}"/>>작성자</option>
<option value="tc"<c:out value="${scri.searchType eq 'tc' ? 'selected' : ''}"/>>제목+내용</option>
</select>
<input type="text" name="keyword" id="keywordInput" value="${scri.keyword}"/>
<button id="searchBtn" type="button">검색</button>
<script>
$(function(){
$('#searchBtn').click(function() {
self.location = "list" + '${pageMaker.makeQuery(1)}' + "&searchType=" + $("select option:selected").val() + "&keyword=" + encodeURIComponent($('#keywordInput').val());
});
});
</script>
</div>
list.jsp에서 만들어놨던 makeSearch로 수정해 줍니다.
7. 실행 테스트
톰캣을 실행하여 list로 들어간후 검색타입과 검색어를 입력한후 검색을 클릭하여 확인해봅니다.
검색기능을 구현하였는데요.
다음 포스팅에는 페이징과 검색타입, 검색어 유지 기능에 대해 포스팅하겠습니다.