Programming/스프링(spring) - Enterprise

스프링(spring)/ 게시판 구축 4(검색 기능)

esoog Polaris 2023. 7. 20. 20:59
반응형

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를 담아서 사용.

 

확인. 나이스.

728x90