지난 포스팅을 통해,
-리다이렉트는 사용자를 처음 요청한 것과 다른 URL로 보내는 것이라는 사실을 알 수 있었다.
-addAttribute는 데이터를 key-value형태로 담아 view 페이지로 넘긴다는 사실을 알 수 있었다.
-쿼리 파라미터는 URL 뒤의 ?에 붙는 키-밸류 값이며, URL에 특정한 조건을 줄 수 있다는 사실을 알 수 있었다.
이 3가지를 조합해 검색 기능을 만들어보자.
<select id="selectListByPagination" resultMap="boardResultMap">
SELECT *
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY BOARD_ID DESC) AS RN, BOARD.*
FROM BOARD
<choose>
<when test="type == 'title'.toString()">
WHERE BOARD_TITLE LIKE '%'||#{keyword}||'%'
</when>
<when test="type == 'content'.toString()">
WHERE BOARD_CONTENT LIKE '%'||#{keyword}||'%'
</when>
<when test="type == 'writer'.toString()">
WHERE MEMBER_ID LIKE '%'||#{keyword}||'%'
</when>
</choose>
)
WHERE RN BETWEEN #{start} AND #{end}
</select>
조회에 관련된 쿼리문이다.
BOARD_ID(시퀀스) 기준으로 데이터를 내림차순으로 정렬한다. 정렬된 순서에 따라 행에 번호를 부여하고 이를 RN 이라고 저장한다
그리고 BOARD 테이블에 있는 RN과 BOARD 데이터를 반환한다. 그 후 #{start}와 #{end} 사이에 있는 값 만큼의 결과를 출력한다.
이 부분은 페이지네이션이 된다.
(페이지네이션은 관련 코드가 더 있지만 일단 생략...)
쿼리문의 가운데 부분을 보면 choose 태그가 존재한다.
choose 태그 안의 when 부분은 jsp파일에서, option value에서 선택한 값과 같다.
<form id="searchForm" method="GET" action="list" class="search">
<input type="text" name="" placeholder="검색어 입력" required> <select
name="filterBy">
<option value="제목">제목</option>
<option value="내용">내용</option>
<option value="지역">지역</option>
</select>
<button type="submit" class="button">검색</button>
(jsp 파일 중 검색 옵션 관련 폼)
사용자가 입력한 키워드를 찾되, option value에서 선택한 컬럼에서 검색을 시도한다.
사용자가 option value를 제목으로 선택하고, "삼겹살" 을 키워드로 검색했다면
제목에 "삼겹살" 이라는 단어가 들어가는 게시글을 페이지네이션을 적용시켜 출력한다.