1. 이제 블로그에서 모든 게시물을 상대로 검색(search)하는 기능 구현해보자.
search.jsp 파일 만들어주고~페이지 구현은 list 페이지와 비슷한데 기능만 추가된 느낌일 것이다.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>내용</th>
<th>작성자</th>
<th>날짜</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list}" var="list">
<tr>
<td>${list.idx}</td>
<td>
<a href="/board/view?idx=${list.idx}">${list.title}</a>
</td>
<td>${list.text}</td>
<td>${list.nick}</td>
<td>
<fmt:formatDate value="${list.date}" pattern="yyyy-MM-dd HH:mm:ss" />
</td>
</tr>
</c:forEach>
</tbody>
</table>
<!-- 여기서부터 list.jsp와는 다른 부분인데; -->
<!-- html과 javascript를 조금 사용한다. -->
<!-- 검색 -->
<div>
<select name="searchType">
<option value="title" <c:if test="${searchType eq 'title'}">selected</c:if>>제목</option>
<option value="text" <c:if test="${searchType eq 'text'}">selected</c:if>>내용</option>
<option value="title_text" <c:if test="${searchType eq 'title_text'}">selected</c:if>>제목+내용
</option>
<option value="nick" <c:if test="${searchType eq 'nick'}">selected</c:if>>작성자</option>
</select>
<input type="text" name="keyword" />
<button type="button" id="searchBtn">검색</button>
</div>
<script>
document.getElementById("searchBtn").onclick = function () {
let searchType = document.getElementsByName("searchType")[0].value;
let keyword = document.getElementsByName("keyword")[0].value;
let url = "/board/search?searchType=" + searchType + "&keyword=" + keyword;
location.href = encodeURI(url);
};
</script>
</body>
</html>
* 먼저, <select>태그는 searchType란 이름으로 선택지에 해당하는 데이터를 보내는 역할.
input으로 키워드 적는 란 만들고,
그리고 버튼 id로 searchBtn을 자바스크립트로 넘겨 버튼에 대한 행위를 만든다.
[0]번째 id를 가져오는 이유는 자바스크립트는 id를 배열로 저장하기 때문. 복수로 저장가능
2. 일단은 뭐니뭐니 해도 컨트롤러에 뭐라도 추가 하려고 하면 된다.
BoardController 파일에 아래 코드를 추가한다. 툭, 일단 던져놓고.
// 검색
@RequestMapping(value = "/search", method = RequestMethod.GET)
public void getSearch() throws Exception {
}
3. 데이터 베이스 검색해야 되니까 일단 매퍼~. 제목, 내용, 닉네임으로 검색.
<!-- 검색 -->
<select id="search" parameterType="hashMap" resultType="com.project.model.BoardVO">
select
idx, title, text, nick, date, hcount
from board
<if test='searchType.equals("title")'>
WHERE title LIKE concat('%', #{keyword}, '%')
</if>
<if test='searchType.equals("text")'>
WHERE text LIKE concat('%', #{keyword}, '%')
</if>
<if test='searchType.equals("title_text")'>
WHERE title LIKE concat('%', #{keyword}, '%')
or text LIKE concat('%', #{keyword}, '%')
</if>
<if test='searchType.equals("nick")'>
WHERE nick LIKE concat('%', #{keyword}, '%')
</if>
order by idx desc
</select>
* 조금 주의해야 할 곳이 몇 군데 있다.
먼저 전달 파라미터로 hashmap(딕셔너리처럼 키 값 구성)으로 2가지 이상의 조건을 묶는 타입으로 사용.
그리고 sql문 자체에 조건문들이 사용되는데;
DAO에서 문자열을 전달 받으면 배열로서 '1글자씩 따옴표로' 저장된다. 따라서 sql문으로 사용하려면 이를 풀어서 사용해야하는데; 그를 해결하는 함수가 concat()이다.
그리고 %Object% 표현은 모든 구문에서 Object 포함 데이터를 찾는 것이다.
또한, Mybatis 문법으로 <if test=조건 으로 사용한다.
마지막으로 order by 로 내림차순으로 정렬 시키면? 최신 피드를 맨 위쪽부터 나열할 수 있다.
4. 그럼 이제 DAO와 Service를 추가하면 스무스하다.
BoardDAO와 BoardService 파일에 아래 코드를 추가한다.
//검색
public List<BoardVO> search(String searchType, String keyword) throws Exception;
}
BoardDAOImpl 파일에 아래 코드 추가
// 검색
@Override
public List<BoardVO> search(String searchType, String keyword) throws Exception {
HashMap<String, Object> data = new HashMap<String, Object>();
data.put("searchType", searchType);
data.put("keyword", keyword);
return sql.selectList(namespace + ".search", data);
}
* 해쉬맵 타입 객체를 생성하는데 타입이 왜 string, object로 다르지? 하고 알아보면,
키; 값 쌍으로 구성된 타입 특성 상 키는 식별되기 쉽게 타입을 지정하고, 값은 어느 값이든 받을 수 있도록 하기 위함.
BoardServiceImpl 파일에 아래 코드 추가
// 검색
@Override
public List<BoardVO> search(String searchType, String keyword) throws Exception {
return dao.search(searchType, keyword);
}
5. 스무스하게 다음은 다시 컨트롤러를 손 보면 된다.
BoardController파일에서 데이터를 상호작용 시키는 로직을 만든다.
검색 메서드를 아래 코드로 수정한다. 갑자기 많아 보이지만, 천천히 보면 별거 없다.
// 검색
@RequestMapping(value = "/search", method = RequestMethod.GET)
public void getSearch(
Model model,
@RequestParam(value = "searchType",required = false, defaultValue = "") String searchType,
@RequestParam(value = "keyword",required = false, defaultValue = "") String keyword
) throws Exception {
List<BoardVO> list = null;
list = service.search(searchType, keyword);
model.addAttribute("list", list);
}
* 여기도 파라미터로 "searchType"와 "keyword"를 값으로 받아 사용한다.
리스트뷰처럼 나와야 하므로, 리스트처럼 객체를 만드는데 파라미터로 위의 두 녀석을 사용한 값을 받아서,
service에 넘기면 DAO시스템으로 어떤 데이터를 받아올 것이다.
그리고 모델 객체에 list를 담아서 사용.
확인. 나이스.
'Programming > 스프링(spring) - Enterprise' 카테고리의 다른 글
스프링(spring)/ 회원 시스템 구축 1(회원가입 페이지) (0) | 2023.08.01 |
---|---|
스프링(spring)/ 게시판 구축 5(좋아요 기능) (0) | 2023.07.21 |
스프링(spring)/ 게시판 구축 3(게시물 수정 및 삭제) (0) | 2023.07.20 |
스프링(spring)/ 게시판 구축 2(게시물 작성 및 상세 페이지) (0) | 2023.07.20 |
스프링(spring)/ 게시판 구축 1(메인 페이지) (0) | 2023.07.19 |